Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Wasper 24. 11. 2022, 17:34:54

Název: Atmel ATmega328 (a další z rodiny) a atomické čtení
Přispěvatel: Wasper 24. 11. 2022, 17:34:54
Zdravím, rád bych se zeptal - je na Arduinu nějaká lepší možnost než zákaz interruptů, jak atomicky přečíst int16_t popř int32_t?
Konkrétní příklad
Kód: [Vybrat]
volatile int msec;

/* interrupt rutina */
msec++; if (msec > 999) msec = 0;

/* main loop */
while (1) {
    ledka(OFF);
    while (msec < 900) ;      // <---- nekonzistence
    ledka(ON);
    while (msec >= 900) ;
    Serial.printf("je cas %i\n", msec);
}
Tenhle fragment zobrazuje casy 0 0 0 768 0 0 0 768 0 768 0.
Důvod je nasnadě, prvně se načítá low byte, pak high, a když se doprostřed trefí interrupt, který (už načtený) lo změní z 255 na 0, ale ještě nenačtený high naincrementuje z 2 na 3, tak v podmínce se porovnává 1023 < 900 a projde to dál.
OK, ale co s tím? jedna možnost je samozřejmě to obalit nějakým
Kód: [Vybrat]
int my_msec;
cli();
my_msec = msec;
sei();
To samozřejmě fungovat bude, jen se mi to moc nelíbí, reálně chci používat interrupty v množství nemalém (na druhou stranu ty 2 takty navíc asi moc nebolí), ale přecejen, není nějaké čistší řešení? Konkrétně u timeru by se to ošklivě dalo řešit tak, že si ten low byte přečtu znova a porovnám, u složitějších věcí nějakým bytem navíc, kde se nastaví dirty apod.
Ale kam směřuju otázkou - neexistuje něco snadnějšího? Koukal jsem na instrukční set a nic použitelného jako load dvou registrů neobjevil, ale je možné, že jsem slepej/blbej/oboje ;-)

P.S. To výše je jenom nejjednodušší příklad na osvětlení. Že do toho while je dobré dát __asm__ __volatile__ ("sleep") vím, a že to problém omezí, ale úplně nevyřeší (když přiletí interrupt od seriáku a hned pak od timeru, tak se taky může trefit nedobře) vím taky. A že volatile v interruptu se má načíst do lokální proměnné a pak zase po inkrementaci zapsat zpět taky...
Název: Re:Atmel ATmega328 (a další z rodiny) a atomické čtení
Přispěvatel: RDa 24. 11. 2022, 18:04:58
V konkretnim pripade bych to resil tak, ze se porovnani provede v ramci preruseni a nastavi event flag led_turn_off pripadne led_turn_on, a mainloop ti ty eventy provede a flagy smaze. Samozrejme tim ti vznikne urcity jitter - na spinani ledky to neva, ale jsou veci kde by to vadilo. To pak musis i tu akci vlozit do interrupt handleru.. ale chapu ze to ne vzdy jde (treba ledka na i2c expanderu), pripadne vypisy.

Ja na XMEGA resil podobnou obskurnost, kde byl soubeh preruseni a potreba atomickeho cteni 5B (dva 16bit kaskadovane pocitadla a jeste bajt ze sw pocitadla), s tim ze se externi hodiny do pocitadla nesmi zastavit. Nakonec to dopadlo tak, ze sampluji 2x a hlidam monotonnost, pokud je tam vada, tak znova. Tj v bodu preteceni (na kterekoliv urovni kaskady) vznika jitter (nelze nikdy ziskat otisk ktery by byl na hrane).
Název: Re:Atmel ATmega328 (a další z rodiny) a atomické čtení
Přispěvatel: TechnikTom 24. 11. 2022, 22:55:10
Jen u té vaší metody cli() sei() musíte mít jistotu, že v danou chvíli je přerušení povolené a pak ho na konci tedy správně opět povolíte
U komplexnějšího programu se může stát, že to atomické čtení použijete ve chvíli, kdy je přerušení zakázané odjinud a vy ho tím atomickým čtením nesprávně povolíte.
Proto má avr-libc knihovnu util/atomic.h a parametr ATOMIC_RESTORESTATE, který provede blok atomicky a na konci obnoví přerušení do stavu v jakém bylo na vstupu do bloku.
Název: Re:Atmel ATmega328 (a další z rodiny) a atomické čtení
Přispěvatel: _Jenda 25. 11. 2022, 00:35:33
Jen u té vaší metody cli() sei() musíte mít jistotu, že v danou chvíli je přerušení povolené a pak ho na konci tedy správně opět povolíte
U komplexnějšího programu se může stát, že to atomické čtení použijete ve chvíli, kdy je přerušení zakázané odjinud a vy ho tím atomickým čtením nesprávně povolíte.
Proto má avr-libc knihovnu util/atomic.h a parametr ATOMIC_RESTORESTATE, který provede blok atomicky a na konci obnoví přerušení do stavu v jakém bylo na vstupu do bloku.
V Arduinu je na tohle idiom uložit si SREG, udělat CLI, a pak SREG = uložený_SREG.

Příklad jak to dělá Arduino funkce millis (což je v podstatě tazatelův případ -- běží interrupt co každou 1ms inkrementuje čítač)
Kód: [Vybrat]
# zkopírováno ze souboru arduino-1.8.10/hardware/arduino/avr/cores/arduino/wiring.c
unsigned long millis()
{
  unsigned long m;
  uint8_t oldSREG = SREG;

  // disable interrupts while we read timer0_millis or we might get an
  // inconsistent value (e.g. in the middle of a write to timer0_millis)
  cli();
  m = timer0_millis;
  SREG = oldSREG;

  return m;
}
Název: Re:Atmel ATmega328 (a další z rodiny) a atomické čtení
Přispěvatel: Wasper 25. 11. 2022, 09:51:43
Jen u té vaší metody cli() sei() musíte mít jistotu,
Což u vlastního programu mám (navíc cli sei jsou 2 takty, mov r,r cli mov r,r takty tři). Ale tam ten dotaz nesměřoval, to o co se snažím je se pokud možno zákazu interruptu vyhnout úplně.

Citace: Jenda
Příklad jak to dělá Arduino funkce millis (což je v podstatě tazatelův případ -- běží interrupt co každou 1ms inkrementuje čítač)
Jasný, u timeru je to celkem snadné (a stejně, konkrétně ten bych řešil radši nějak takhle, což za předpokladu, že se během 255 milisekund dostane alespoň na 10 cyklů času pro hlavní program bude fungovat)
Kód: [Vybrat]
unsigned int8_t tm_lo,tm_hi;

do {
    tm_lo = timerms_low;
    tm_hi = timerms_high;
} while (tm_lo != timerms_low);
což sice dá o jeden tik navíc, ale odpadne tam 5 cyklů ze 7mi se zakázaným interruptem.

Ale zatím mi pro obecné čtení () nejlepčí přijde konstrukce stylu
Kód: [Vybrat]
volatile int8_t data_valid;
volatile int nejaka_data;
// interrupt
nejaka_data++;
data_valid =0;

// hlavni program
int8_t mask = 1 << thread_id;
int data;
....
do {
    data_valid = mask;
    data = nejaka_data;
} while (data_valid & mask);
[/quote]
to že se to znovunačte i v případě, že mezitím dojde k běhu jiného threadu a ten bude něco číst asi vadit nebude. Jen holt jsem tak trochu doufal, že tam je něco jako LD HL,(mem) jako u Z80, které jsem si nevšiml, a která by pomohla docela hodně. :(
Název: Re:Atmel ATmega328 (a další z rodiny) a atomické čtení
Přispěvatel: Wasper 25. 11. 2022, 10:00:55
hmm vypadla mi tam negace, a editnout to nejde :(
Název: Re:Atmel ATmega328 (a další z rodiny) a atomické čtení
Přispěvatel: Wasper 26. 11. 2022, 06:22:13
Ja na XMEGA resil podobnou obskurnost, kde byl soubeh preruseni a potreba atomickeho cteni 5B (dva 16bit kaskadovane pocitadla a jeste bajt ze sw pocitadla), s tim ze se externi hodiny do pocitadla nesmi zastavit. Nakonec to dopadlo tak, ze sampluji 2x a hlidam monotonnost, pokud je tam vada, tak znova. Tj v bodu preteceni (na kterekoliv urovni kaskady) vznika jitter (nelze nikdy ziskat otisk ktery by byl na hrane).
Tak koukám, že těch vtipností je tam víc. Já tu honím každý takt, pak si chci dodělat výstup na displej, tak koukám, jak se inicializuje SPI (aneb nastavit MOSI a SCK na out) až jsem radší kouknul do přeloženého assembleru a jsem zděšen - to je fakt u Arduina normální, že mapování čísla PINu na port a bit (digitalPinTo*()) nejsou dělané přes nějakou magii v hlavičkách, kterou kompiler v nejběžnějším případě port# konstanta odoptimalizuje pryč, ale přes lookup tabulky v programové raměti? :-(
No jdu si dát radši panáka, a začínám mít čím dál větší úctu ke každému, kdo se tímhle musí živit....
Název: Re:Atmel ATmega328 (a další z rodiny) a atomické čtení
Přispěvatel: xPoli 26. 11. 2022, 12:55:14
Kdo se tímhle živí zpravidla už 8bity dávno opustil. Za sebe nevím za posledních několik let, že bych narazil na něco, kde by se mi po nějaké atmeze stýskalo nebo kde by nebyl kdejaký cortex ve všech ohledech lepší.
Název: Re:Atmel ATmega328 (a další z rodiny) a atomické čtení
Přispěvatel: RDa 26. 11. 2022, 15:46:55
... - to je fakt u Arduina normální, že mapování čísla PINu na port a bit (digitalPinTo*()) nejsou dělané přes nějakou magii v hlavičkách, kterou kompiler v nejběžnějším případě port# konstanta odoptimalizuje pryč, ale přes lookup tabulky v programové raměti? :-(
No jdu si dát radši panáka, a začínám mít čím dál větší úctu ke každému, kdo se tímhle musí živit....

Tak arduino jako HW ani jako libky ci IDE jsem nikdy nepouzil.. vzdy je to vlastni deska, vlastni kod a prime programovani.
Název: Re:Atmel ATmega328 (a další z rodiny) a atomické čtení
Přispěvatel: Martin Poljak 26. 11. 2022, 19:19:26
Kdo se tímhle živí zpravidla už 8bity dávno opustil. Za sebe nevím za posledních několik let, že bych narazil na něco, kde by se mi po nějaké atmeze stýskalo nebo kde by nebyl kdejaký cortex ve všech ohledech lepší.

Není to trochu jiná kategorie čipů? Ostatně nějaké ATmega jsem naposledy potkal třeba v pračce. Celkem očekávatelně.
Název: Re:Atmel ATmega328 (a další z rodiny) a atomické čtení
Přispěvatel: Jakub Štech 26. 11. 2022, 22:39:53
Kategorie čipů je to úplně stejná s tím rozdílem, že i entry-level arm (třeba nějaké stm32) dá i nejvyšším atmegám na zadek ve všem krom velikosti paměti, a bude stát desetinu. Poslední dobou je některé atmegy vůbec problém sehnat, end of life zprávy Microchip posílá pomalu každý měsíc.
Název: Re:Atmel ATmega328 (a další z rodiny) a atomické čtení
Přispěvatel: _Jenda 27. 11. 2022, 15:33:34
Poslední dobou je některé atmegy vůbec problém sehnat, end of life zprávy Microchip posílá pomalu každý měsíc.
Zajímavé, mně přijde, že poslední rok a půl nebyla vůbec žádná STM32 (konkrétně jsem se snažil koupit F030CCT6, F103C8T6 a F405/415), teprve před měsícem se jich pár naskladnilo.

(na octopart můžete najít graf s inventory history, bohužel roční je jen pro přihlášené -- https://octopart.com/stm32f103c8t6-stmicroelectronics-41858015)

Oproti tomu AtMegy (klasika 328 v TQFP32 pouzdře) byly dostupné mnohem déle, pak nebyly asi měsíc a od té doby jsou pořád alespoň na LCSC (osazujeme u JLCPCB takže tam součástky bereme).

Každopádně já AtMegy používám protože to má na rozdíl od STM32 úplně blbuvzdorný software. Samozřejmě bych taky rád něco s vyšším výkonem. A většina STM32 má 0.5mm pitch, s čímž se mi blbě dělá, AtMegy mají 0.8mm.
Název: Re:Atmel ATmega328 (a další z rodiny) a atomické čtení
Přispěvatel: Martin Sivák 27. 11. 2022, 15:52:07
Dostupnost čehokoliv s STM32 je teď hrozná. V mém případě STM32L031K6. A to samé platí i pro nástroje, STLink v3 mají akorát v SOS electronic za dvojnásobek normální ceny a ISOL desku jsem propásl úplně :(

Jenže.. ATmegy před pár lety hrozně zdražily a v poměru ceny k výkonu se vůbec nevyplatilo je používat, protože ARMy (hlavně různé M0+) byly příjemně levné.

Lead time na STM32 je často i dva roky. Snad se to zlepší než vyčerpám zásoby :)
Název: Re:Atmel ATmega328 (a další z rodiny) a atomické čtení
Přispěvatel: Wasper 28. 11. 2022, 04:19:23
Tak arduino jako HW ani jako libky ci IDE jsem nikdy nepouzil.. vzdy je to vlastni deska, vlastni kod a prime programovani.
Tak to chápu. Mě zatím Arduina celkem vyhovují (začínám znovu po hodně letech bastlit a už na to tak dobře nevidím, abych desky pro SMD kreslil ručně a pak to pájel pistolkou se smyčkou ze zvonkáče jako dřív, takže hotová deska docela pomůže), nakoupenou jich mám pěknou zásobu neoriginálních od Číňana tak různě za 1-2 eura a na nějakej větší podraz jsem zatím nenarazil (nepočítaje veselé historky z natáčení jako včerejší noc příjemně strávenou studiem referenčního manuálu, Arduinových knihoven a pak i assembleru, co leze z překladače ve snaze přijít na to, proč je výstup na e-Ink přes SPI nekompatibilní s použitím USART0 na debug - nakonec důvodem bylo to, že Nano získává 3.3V z FTDI, a ten eInk když překresluje, tak žere docela velké špičky, takže to celé šlo do resetu...), až na to, že jsem tak trochu nečekal, že doba pokročila a neoptimální jsou už knihovny na osmibity, no ;-)
Ale OK, beru to, že nejsem až tak divnej a tu obsluhu si napíšu vlastní.

BTW jak to tak čtu, je tu vlastně něco sehnatelného mezi Atmelem a RPi Zero, kde se dá snadno začít si hrát? Ta malina je třeba príma třeba na časosběrnou kameru, ale na malou meteostaničku mi přijde jako kanón na vrabce (a tam ani těch 200mA spotřeby v klidu moc nepotěší). Do myčky nebo ke kotli bude Arduino asi v pohodě, ale už třeba s tím einkem je dost trouble, když se nevejde do paměti ani videoramka, které jsou potřeba navíc dvě (ne, že by to nešlo to dorenderovávat za běhu, ale je to pakárna).
Název: Re:Atmel ATmega328 (a další z rodiny) a atomické čtení
Přispěvatel: zapik1 28. 11. 2022, 07:37:38
Já mám řadu:
Attiny84 pro velmi malé projekty
Atmega328
ESP8266
ESP32
Ty Atmely používám jak kdy, buď s arduino frameworkem, když tam není nic kritického a nebo to chci mít rychle spíchnuté a nebo přímý kod na čisté železo.
ty ESP výhradně s Arduino frameworkem. Ostatně u větších projektů stejně téměř vždy potřebuji nějakou formu komunikace, tak se Wifi hodí.  Ty Esp  v provedení Wemos D1 Mini a nebo Wemos ESP32.
Název: Re:Atmel ATmega328 (a další z rodiny) a atomické čtení
Přispěvatel: MalyTomi 28. 11. 2022, 08:28:41
tak hlavne arduino nie je urcene pre projekty, ktore su kriticke bud na stabilitu, alebo spolahlivost a rychlost. Od zaciatku su urcene skor na zaciatky programovania a vyucbu. Tomu zodpoveda aj vysledny kod. Na blikanie ledky, alebo meranie teploty, ci ovladanie ledky, motorckeka su idealne.
Do domacnosti na jednoduche projekty tiez. Nemusis velmi riesit hw, staci ti usb a program mas hotovy behom chvilky. Kniznice moze vytvarat ktokolvek a tomu zodpoveda obcas aj ich kod.
Stale je tu ale moznost pouzit len hw, a naliat si tam vlastny kod vytvoreny v asm.
Obcas sa desim toho, ked vidim, ze niekto si v arduine robi ovladanie kurenia, alebo projekty, kde zlyhanie moze mat fatalne nasledky.
Název: Re:Atmel ATmega328 (a další z rodiny) a atomické čtení
Přispěvatel: TechnikTom 28. 11. 2022, 11:09:28
Tak Arduino je jen nadstavba nad standardními vývojovými prostředky.
Takže komu u AVR třeba vadí jeho pomalé knihovny pro práci s porty, může klidně použít přímo funkce z avr-gcc.
Případně u ESP32 spustit kód napsaný v Arduinu pomocí funkcí  z freeRTOS na obou jeho jádrech.
Tedy klidně z Arduina použít jen setup() a loop() a zbytek napsat v avr-gcc nebo freeRTOS nebo ESP-sdk.
Název: Re:Atmel ATmega328 (a další z rodiny) a atomické čtení
Přispěvatel: Jakub Štech 28. 11. 2022, 17:00:39
tak hlavne arduino nie je urcene pre projekty, ktore su kriticke bud na stabilitu, alebo spolahlivost a rychlost. Od zaciatku su urcene skor na zaciatky programovania a vyucbu.

Pozor, tohle není pravda. Arduino (Wiring) je od začátku určeno pro umělce, kteří chtějí rozblikat/rozhýbat svoje výtvory, aniž by se při tom museli zbytečně něco učit. To neučení je naopak jeden z explicitních cílů a dodnes je to v projektu vidět, odpovědi i na základní otázky jako třeba co za datový typ bere nebo vrací nějaká knihovní funkce musíte hledat ve zdrojáku.

Chodí k nám absolventi místní SOŠ kde Arduino k výuce používají, a je to fakt náročná práce je z té díry vyhrabat, naučit je správně uvažovat.
Název: Re:Atmel ATmega328 (a další z rodiny) a atomické čtení
Přispěvatel: Wasper 28. 11. 2022, 19:19:08
Obcas sa desim toho, ked vidim, ze niekto si v arduine robi ovladanie kurenia, alebo projekty, kde zlyhanie moze mat fatalne nasledky.
Tak přiznávám bez mučení, tohle se týká i mě. Ale na svojí obranu musím podotknout, že maximální představitelná škoda, kterou je to hypoteticky schopné bez obsluhy napáchat, je vyplácání asi dvou kubíků vody z vodovodu přes vychlazovací smyčku, kterou ale ovládá mechanický termostatický ventil a tedy mimo dosah nespolehlivé čínské kopie.
Z čeho naopak mám (časem) strach je řídit tím IGBT na indukční pícku, to bude asi dost často barák bez proudu ;-)

Citace: Jakub Štech
Arduino (Wiring) je od začátku určeno pro umělce, kteří chtějí rozblikat/rozhýbat svoje výtvory, aniž by se při tom museli zbytečně něco učit. To neučení je naopak jeden z explicitních cílů a dodnes je to v projektu vidět,
Díky, takhle natvrdo řečeno mi to najednou zapadá do sebe a dává to smysl.

Bohužel asi je to asi dneska trend. Když jsem začínal, tak třeba k Atari bylo dost příruček (které jsme pokoutně kopírovali kde to šlo), ale třeba pro audio to začínalo vysvětlením funkce (Pokey, 4 kanály, děličky, posuvné registry) a pak popis jednotlivých registrů a pár jednoduchých příkladů.
Dnešní ekvivalent (a bohužel i to, co se učí děti) je "připoj na tyhle kolíky v DIN repráček a napiš v BASICu příkaz SOUND 100,20,5". A pochopit, co je za tím (a že zatím je něco netriviálního, s čím je potřeba počítat, počínaje spotřebou DS1820 při samplování, přes možnosti SPI/1w/I2C, jak reálně funguje vykreslování einku, že do toho serva jde PWM, že u toho ultrazvuku počítám dobu, než se vrátí echo apod.) se moc nenosí,  a když to člověka už zajímá, musí to složitě hledat.

Jako za mě jednoznačně malé bezvýznamné plus za referenci Atmelu. Zato Waveshare by zasloužilo...
Název: Re:Atmel ATmega328 (a další z rodiny) a atomické čtení
Přispěvatel: farlap 28. 11. 2022, 19:29:25
Tak arduino jako HW ani jako libky ci IDE jsem nikdy nepouzil.. vzdy je to vlastni deska, vlastni kod a prime programovani.
Tak to chápu. Mě zatím Arduina celkem vyhovují (začínám znovu po hodně letech bastlit a už na to tak dobře nevidím, abych desky pro SMD kreslil ručně a pak to pájel pistolkou se smyčkou ze zvonkáče jako dřív, takže hotová deska docela pomůže), nakoupenou jich mám pěknou zásobu neoriginálních od Číňana tak různě za 1-2 eura a na nějakej větší podraz jsem zatím nenarazil (nepočítaje veselé historky z natáčení jako včerejší noc příjemně strávenou studiem referenčního manuálu, Arduinových knihoven a pak i assembleru, co leze z překladače ve snaze přijít na to, proč je výstup na e-Ink přes SPI nekompatibilní s použitím USART0 na debug - nakonec důvodem bylo to, že Nano získává 3.3V z FTDI, a ten eInk když překresluje, tak žere docela velké špičky, takže to celé šlo do resetu...), až na to, že jsem tak trochu nečekal, že doba pokročila a neoptimální jsou už knihovny na osmibity, no ;-)
Ale OK, beru to, že nejsem až tak divnej a tu obsluhu si napíšu vlastní.

BTW jak to tak čtu, je tu vlastně něco sehnatelného mezi Atmelem a RPi Zero, kde se dá snadno začít si hrát? Ta malina je třeba príma třeba na časosběrnou kameru, ale na malou meteostaničku mi přijde jako kanón na vrabce (a tam ani těch 200mA spotřeby v klidu moc nepotěší). Do myčky nebo ke kotli bude Arduino asi v pohodě, ale už třeba s tím einkem je dost trouble, když se nevejde do paměti ani videoramka, které jsou potřeba navíc dvě (ne, že by to nešlo to dorenderovávat za běhu, ale je to pakárna).

Ahoj,
za sebe muzu doporucit Raspberry Pi Pico, respektive RP2040. RAMka ma 264 kB, coz uz na hodne veci staci. Cena 119,- na ceskem eshopu. Na jednu desku flashnes picoprobe FW a druhou muzes debugovat.  Hlavni vyhoda je podle me ale Pico SDK, je pekne zdokumentovane s peknymi priklady oproti treba STM32 HAL nebo nedejboze esp-idf. Ma i par nevyhod jako pomale ADC, absence DAC, obecne periferie nejsou tak vymazlene jako treb u STM32.
Název: Re:Atmel ATmega328 (a další z rodiny) a atomické čtení
Přispěvatel: MalyTomi 29. 11. 2022, 08:33:57
Pozor, tohle není pravda. Arduino (Wiring) je od začátku určeno pro umělce, kteří chtějí rozblikat/rozhýbat svoje výtvory, aniž by se při tom museli zbytečně něco učit.
Asi som to nie celkom presne napisal. Ma to prilakat ludi k programovaniu, prave tym, ze si vedia rozblikat ledku behom chvilky. Niekomu to staci, a niekoho to namotivuje tak, ze sa tomu zacne seriozne venovat a prejde na ine prog. jazyky. A cim skor to urobi, tym lepsie prenho.
Ja napr. arduino pouzivam, ked chcem doma nieco rychle zbuchat (tie blikatka, hracky pre deti...), ale ked chcem nieco serioznejsie, tak to robim v Ccku.

... kterou ale ovládá mechanický termostatický ventil a tedy mimo dosah nespolehlivé čínské kopie.
Z čeho naopak mám (časem) strach je řídit tím IGBT na indukční pícku, to bude asi dost často barák bez proudu ;-)
A presne o tom to je. Sice to riadis arduinom, ale stale je tam ta poistka vo forme uplne zakladnych jednoduchych veci.
Horsi pripad by bol, keby tym arduinom si riadil aj tu vychladzovaciu smycku.
Tiez mam kurenie, aj tu smycku, aj klasicky bimetal na cerpadlo, aj klasicke Tcko (neviem ako sa to vola), ktore pusta vodu do vymenika, az ked je nahriata v krbe, Ale nad tym mam arduino s teplotnymi snimacmi, ktorymi sledujem, ci nahodou voda nema vysoku teplotu, a ci funguje vsetko ako ma.
Napr. aj svetla mam (zatial na stole) tak riesene. Viem ich zapnut a ovladat cez web, ale zaroven jednym rychlym prepnutim ich viem zapnut klasickym vypinacom.
Název: Re:Atmel ATmega328 (a další z rodiny) a atomické čtení
Přispěvatel: TechnikTom 29. 11. 2022, 19:07:34
Problém asi je, že každý pod pojmem "Arduino" vidí trochu něco jiného.
Někdo IDE  s pochybnými systémovými knihovnami s údajnou nutností hledat parametry funkcí ve zdrojáku, ( přitom stačí kouknout na jejich referenci v dokumentaci, kde jsou typy popsané ) jiný perfektní jednotné prostředí pro vytváření a správu náročných projektů s instalací na jedno kliknutí. ( což se o jiných toolchainech  nedá tak úplně říct )
Třeba taková Tasmota, což není zrovna školní projekt nebo hračka nějakého umělce-hudebníka má hlavní soubor pro překlad s názvem tasmota.ino
Což je Arduino, nepletu-li se.
Doma mi už několik zim řídí el. podlahové topení esp8266 s na hraným ESPeasy, což je taky projekt dělaný v Arduinu.
I to řízení IGBT lze jednoduše v Arduinu napsat - prostě použijete jen setup() a loop() a kód napíšete v čistém céčku.
Název: Re:Atmel ATmega328 (a další z rodiny) a atomické čtení
Přispěvatel: _Jenda 30. 11. 2022, 01:42:54
Třeba taková Tasmota, což není zrovna školní projekt nebo hračka nějakého umělce-hudebníka má hlavní soubor pro překlad s názvem tasmota.ino
Nejen Tasmota. https://github.com/prusa3d/Prusa-Firmware#using-arduino
Název: Re:Atmel ATmega328 (a další z rodiny) a atomické čtení
Přispěvatel: Wasper 30. 11. 2022, 05:50:35
I to řízení IGBT lze jednoduše v Arduinu napsat - prostě použijete jen setup() a loop() a kód napíšete v čistém céčku.
Mno, cynicky poznamenám, že když na 16MHz Arduinu samotnej digitalWrite() sežere plus mínus (nedohledával jsem časování všech instrukcí, co neznám, dostalo 1 takt) 52 taktů, tak ono ani nic jiného nezbude ;-) přitom když se to napíše normálně, tak jsou to takty přesně dva, to už se něco časovat dá. Tam se spíš bojím čistě HW kvality, že jakákoli chyba čínského výrobku, když by se náhodou zasekl s jedničkou na výstupu, může být za 3f můstkem opravdu efektní.

BTW místo setup() a loop() radši vyhodit celé core.a z linkování a rovnou můžu použít standardní main().

Ostatně i viz odkaz od Jendy u Průšy - WRITE z Firmware/fastio.h je použito na 268 řádcích, digitalWrite jen 23.
Název: Re:Atmel ATmega328 (a další z rodiny) a atomické čtení
Přispěvatel: TechnikTom 30. 11. 2022, 07:47:48
Cynicky poznamenám, že digitalWrite() klidně můžeme nechat klučíkům z kroužku radiotechniků nebo na časově nekritické operace.

Arduino vám klidně přeloží i něco jako tohle:

Kód: [Vybrat]

void setup() {
 
  DDRB = 0b11111111;       

}

void loop() {

  PORTB = 0xFF;
  PORTB = 0x00;

}

Zkuste si změřit frekvenci na některém pinu portu B...

A abych zůstal u původního tématu.
Ta vámi zmiňovaná knihovna fastIO.h je prošpikovaná mnou na počátku uváděným atomickým čtením z util/atomic.h
Název: Re:Atmel ATmega328 (a další z rodiny) a atomické čtení
Přispěvatel: MalyTomi 30. 11. 2022, 08:31:56
Problém asi je, že každý pod pojmem "Arduino" vidí trochu něco jiného.
Veru, niekto vyuziva priamo kniznice, iny len hw a komplet kod ma pisany v asm, dalsi vyuzije len bootloader a kod pise v C...
Ale ked sa bavime o arduine ako takom, tak vacsinou je to ta prva varianta.
Název: Re:Atmel ATmega328 (a další z rodiny) a atomické čtení
Přispěvatel: Wasper 30. 11. 2022, 18:53:08
Arduino vám klidně přeloží i něco jako tohle:
...
Tak ono to staci napsat takhle a jde to i po bitech (prelozi se to na instrukce SBI a CBI, az na rezii loopu 4MHz), to same zjevne dela i WRITE z fastio. Navic volat to takhle v loop() je nestastne, nejen kvuli call a ret (to jsme na 2MHz), i kvuli  tomu ifu (dalsi 4 cykly, takze nesymetrickych 1,3MHz). Ale to uz se šťourame v detailech, podstatnejsi je ze z Arduino knihovnama to dá na nějakých 160kHz.
Navíc je fakt hloupé, že v referenci od toho digitalWrite vůbec není v notes and warnings poznámka, že je nešťastně pomalé a pro rychlejší přístup je třeba použít přímý přístup, to mi vadí mnohem víc než ta samotná pomalost. :)
Kód: [Vybrat]
#define nano_pin2port(pin) ( (pin)<8 ? &PORTD : (pin)<14 ? &PORTB : &PORTC )
#define nano_pin2mask(pin) ( (pin)<8 ? 1<<(pin) : (pin)<14 ? 1<<((pin)-8) : 1<<((pin)-14) )

__inline__ void nano_digital_write(int pin, int val)
{
    volatile uint8_t *out = nano_pin2port(pin);
    if (val) {
        *out |= nano_pin2mask(pin);
    } else {
        *out &= ~nano_pin2mask(pin);
    }
}