Re: Arduino generování pulzů

Richard Kaličiak hw.kaliciak na fn.de
Úterý Srpen 1 10:53:28 CEST 2023


Dobry den,
tu je priklad, ako sa to riesi v avr-gcc:

...
#include <util/atomic.h>
...
volatile uint16_t key_press;                      // key press detect

...
uint16_t get_key_press( uint16_t key_mask )
{
   ATOMIC_BLOCK(ATOMIC_RESTORESTATE){              // read and clear 
atomic !
	  key_mask &= key_press;                      // read key(s)
	  key_press ^= key_mask;                      // clear key(s)
   }
   return key_mask;
}
...

R.

Dňa 01.08.2023 o 06:28 Petr Zapadlo napísal(a):
> Zdravím,
> 
> to jsem neznal díky.  Jak se dívám, tak digitalWritefast() je pouze sada 
> maker, která rozvine zápis na GPIO na zápis přes registry  případě 
> konstantního argumentu čísla pinu.
> 
> Tenhle syntaktický cukr je už na můj vkus příliš sladký, asi zůstanu u 
> klasického přístupu - pokud to bude nekritické, tak digitalWrite, pokud 
> to bude časově kritické, tak přístup přes registry (a nemíchat v jednom 
> kodu).
> 
> Spíše mě zaujala ta poznámka o neatomicitě   zápisu v přerušení.
> 
> Chápu to správně, že když se mi přerušení, které manipuluje například s 
> bity 4-7 portu D trefí přesně do okamžiku kdy jsem načetl stav portu D 
> pro potřeby například OR (chci nahodit  bit 0, portu D), tak vlastně po 
> zápisu na port v hlavní smyčce  "vymažu" změnu co proběhla v přerušení?
> 
> Jak se to dá řešit? ( samozřejmě kromě zakázání přerušení)
> 
> Díky
> 
> Petr
> 


Další informace o konferenci Hw-list