Registry

Odpovědět
Ludek
Příspěvky: 289
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Registry

Příspěvek od Ludek » 09 led 2022, 20:27

Zdravím, může mi někdo dekodovat tyto dvě makra? Myslím tím - do lidské řeči.
Jak mám rozumět těm podtržítkům, vlnovkám, svislým čárkám...
Umíte to někdo napsat normálními znaky? :-)

Kód: Vybrat vše

#define cbi(sfr,bit)(_SFR_BYTE(sfr) &=~_BV(bit))           // macro to clear bit SFR
#define sbi(sfr,bit)(_SFR_BYTE(sfr) |= _BV(bit))           // macro to   set bit SFR
 

Uživatelský avatar
Caster
Příspěvky: 380
Registrován: 11 zář 2019, 09:02
Reputation: 0

Re: Registry

Příspěvek od Caster » 09 led 2022, 21:33

První řádek vynuluje hodnotu zadaného bitu. Vlnovka "~" je logická negace bitu (NOT) a operátor "&" je logický součin AND. Pokud byla v registru speciální funkce (Special Function Registers) nastavena u daného bitu hodnota "1", tento příkaz hodnotu bitu vynuluje, tj. nastaví na "0".

Druhý řádek naopak nastaví hodnotu bitu na "1" pomocí operátoru "|", což je logický součet OR. Nezávisle na původní hodnotě bitu "0" nebo "1" bude bit nastaven na hodnotu "1".

#define, definuje funkci cbi(sfr, bit) kterou makro (_SFR_BYTE...) přeloží jako vynuluj hodnotu bitu v zadaném IO registru.
Funkce sbi pak nastaví hodnotu bitu v zadaném IO registru na "1".

Pokud bych chtěl např. vynulovat hodnotu bitu č. 2 (0000 0100b) IO registru 0x03 použil bych příkaz:

cbi(0x03, 2)

"cbi" je instrukce assembleru, clear bit in I/O register

Většinou se ale nepracuje přímo s adresou registru. Při programování konkrétního mikrokontroléru jsou adresy speciálních registrů již také definovány funkcí (v hlavičkových souborech *.h daného MCU), tj. příkaz pak bude vypadat např. takto:

cbi(PORTA.DIR, 2)

Při programování mikrokontrolérů není ale většinou nutné výše uvedené makro použít. Např. při programování MCU ATtiny202 ve vývojovém prostředí MPLAB X IDE použiji následující příkaz pro aktivaci slave SPI zařízení (MAX6675), nastavení signálu (SS - Slave Select) na hodnotu "0" a tím mu dám pokyn, aby mi začal posílat přes rozhraní SPI data (změřenou teplotu z termočlánku typu K pomocí převodníku MAX6675).

PORTA.OUTCLR = PIN7_bm; // Set SS pin value to LOW

Ludek
Příspěvky: 289
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Re: Registry

Příspěvek od Ludek » 11 led 2022, 16:38

Ahoj Caster,
tak jsem to dlouhé minuty pitval a pomalu nasával do sebe. Díky moc.
Je to naprosto dokonale popsané, už jsem v obraze. Díky za Tvůj čas.

Uživatelský avatar
Caster
Příspěvky: 380
Registrován: 11 zář 2019, 09:02
Reputation: 0

Re: Registry

Příspěvek od Caster » 11 led 2022, 17:20

V pohodě, taky jsem se učil v diskuzích ;) .

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Registry

Příspěvek od ondraN » 11 led 2022, 20:45

Některé MCu, (třeba STM32), to mají udělané tak, že každý bit portu je mapovaný jako samostatná adresa v adresním prostoru brány. Odpadá tak i nutnost zapisovat na port jako atomickou operaci (zakázat všechna přerušení-přečíst stav portu-nastavit/shodit bity portu-zapsat novou hodnotu-povolit přerušení), pokud se v přerušení pracuje s portem.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 13 hostů