generování PWM v CTC 328P

Samozřejmě, že není problém se poradit. Od toho tady to fórum je. Co se týká bitových proměnných, zkus se podívat na téma C a flagy.

Co se týká portu A, byl to překlep. Má tam být C. ATmega328 port A nemá, proto k němu ani nemůžeš mít přístup. Negace je jenom na B3. Chtěl jsi přece, aby signály byly proti sobě invertované, ne ? Proto na začátku nastavuju jeden na log. 1, druhý na log. 0. V přerušení se jenom invertujou, takže kmitají v protifázi. Jinak piny, které nejsou použity je doporučeno nastavit jako vstupní a zapnout k nim interní pull-up odpory (DDRxy = 0, PORTxy = 1).

Program jako takový funguje a piny kmitají jak maji, jenže Ty jsi nastavil (v TCCR2A) piny tak, že nejsou připojené ke standartním výstupním registrům, ale k OCR2x signálům. Proto se to vypadá, že jedou celou dobu 300kHz obdélníky bez přerušení. Nech je jako standartní piny. WGM2x nastav na CTC a COM2x nech na “Normal port operation” a dostaneš 10 obdélníků a 10 mezer.

Na OC2B se můžeš v klidu vykašlat, ten se nepoužívá. Bity FOC2x nech taky být, ten je jenom na přenesení OCRx okamžité hodnoty. Jeho nastavování na log. 1 nemá žádný smysl.

if(–x==0) x=40; se dá rozepsat jako :

x = x - 1; (nebo také x -= 1;) if (x==0) { x=40; }

Ale POZOR !!!

když napíšeš
if(x–==0) x=40; je to úplně něco jiného :

if (x==0) { x=40; } x = x - 1;

Co Ti píše uino, když chceš deklarovat x jako registr ? Já netvrdím, že to musí jít, nebo že to půjde přímo tak, jak jsem to napsal. Já to překládal v AVR Studiu 4.19+WinAVR (nadstavba Cčko). V tom jsem ten kód také zkoušel a krokoval. Proto vím, jak byl přeložený a kolik mi to trvalo cyklů. Ale záleží na efektivitě překladu uina, jestli to zvládne. Pravda je, že WinAVR to přeložil celkem efektivně, ale rezerva tam ještě je. Proto jsem také napsal, že efektivněji už to zvládne jenom assembler - resp. napsat to v assembleru.