Vie niekto poradiť ako nastaviť pwm na attiny2313?
Chcem ovládať rc servo a potrebujem generovať pulzy 0,5-2,5 ms
s periódou cca 20ms.
Funguje mi to ale neviem ako upraviť rozsah
Používam 8 bit. časovač mod 5 na generovanie pwm, pri OCR0B=8 mam pulzy cca 0,5ms a pri OCR0B=35 2,5ms pri periode cca 18 ms.
Dá sa nejako nastaviť časovač aby ten rozsah bol od 0-255 (0,5ms-2,5ms) ?
Ďakujem za radu.
administrator: přejmenováno z "Nastavenie PWM na attiny2313"
A nastavil si samotny pin ako vystupny?
Raz mi takto nesiel ani za nic nastavit vystup PWM.
Normalne by to malo byt tak, ze ked aktivujes eriferiu, tam ma prebrat riadenie GPIO. V mojom pripade som ale musel este nastavit GPIO pre OCx ako vystupny. Az potom mi PWM s generovanim vustupneho signalu fungovalo ako malo. Povazujem to za divne, ale bolo to tak. Pouzival som Atmega644
OC0 jsou pro timer0 a OC1 pro timer1
Na to nastavení se ještě podívám, ale plně hardwarově na 8bit timeru nemáš šanci. Programově už by to jít zařídit mělo (1 průchod timeru = 2.5ms, pak vypnout pwm a nechat timer 7x otočit a na jeden průběh zas pwm zapnout).
EDIT:
Pro Fosc=20MHz a T=20ms => timer0, mode7, Fosc/256, TOP=OCR0A=195.
0.4992ms => OCR0B = 39, 2.496ms => OCR0B = 195
Bohužel nelze použít pin svázaný s OCR0A, zbývá pouze OCR0B.
Pro Fosc=6.5536MHz (tento krystal se dá sehnat) a T=20ms => timer0, mode3, Fosc/64.
0.5ms => OCR0A/B = 51, 2.5ms => OCR0A/B = 255
1 průchod timeru s aktivní pwm, dalších 7 bez. Vzhledem k minimální děličce 64 bys měl být schopen stihnout v přerušení vypnout pwm i při maximální hodnotě OCR0.
Ono tady je to vcelku logické, zatímco po aktivaci např. uartu by jeho provoz bez aktivních RX/TX pinů neměl smysl, pwm můžeš využít pro generování přerušení a výstupní pin tě třeba nezajímá. Pak bys měl zbytečně blokovanou I/O nožku. Navíc je to popsáno v DS
Na to su predsa bity COMnA a COMnB pre cast Waveform generator. Tu si nastavim, ze ma pin robit to ci ono, alebo sa nema vobec zapajat do PWM (ak chcem vyuzivat iba prerusenia), k comu treba este nastavovat pin ako vystupny? Logiku to nema. Potom by bolo rovnako logicke, aby som musel nastavovat TX na vystup cez GPIO, ak chcem cez UART vysielat a nemalo by iba stacit TX aktivovat bitom v bloku UARTu.
Inak prevadzka iba s jednym aktivnym RX alebo TX zmysel ma. Preto su tam samostatne bity pre aktivovanie RX (RXENn) a TX (TXENn) zvlast.
Takych veci je tam ale samozrejme viac. Ale to, ze OCR1x ma byt cez GPIO som v datasheete nikde nenasiel. Ak to tam je, tak potom dobre zasite
Priorita DDxn pinu nad OCnx je na Figure 44. Compare Match Output Unit, Schematic (ds tiny2313). Třeba nám chtěli usnadnit dočasné vypínání pwm výstupu. COMnA/B jsou 2 bity a navíc mimo bitově adresovatelný prostor.
Ja viem, ja viem. Vzdy je nakoniec chyba niekde medzi stolickou a klavesnicou
Vsetko je niekde akosi napisane, ale kym na to clovek pride, tak ubehne aj tyzden
Ako v pripade signalu /SS pre SPI. Ak ma byt v zapojeni SPI pouzite v rezime MASTER, chran boh, aby po resete bol signal /SS v nule. Potom sa uz SPI do rezimu MASTER jednoducho neda prepnut. Ani nastavenim /SS na vystup. Jednoducho po resete MUSI byt /SS v log.1, inak je pruser ako hrom. A tiez sa to da nakoniec vydedukovat nejako z toho textu, ktorym to popisali.
To jsem zas v noci vymyslel hlod
Perioda 3.2ms ti vychází protože timer nejede jen do 195 ale až do 255 a po 1. průchodu nevypínáš na dalších 7 průchodů OC0 pin. V tom, co jsi výše komentoval to máš napsané dokonce 2x
Neumíš C, proto ti to nejde
Příkazem “TCCR0A = TCCR0A| (0<<COM0B1)| (0<<COM0B0);” s registrem nic neuděláš. Pokud chceš ty dva bity vynulovat, je třeba je maskovat ANDem “TCCR0A &= ~((1<<COM0B1) | (1<<COM0B0));”.
[code]ISR(TIMER0_COMPB_vect)
{
if (cykl==0) { TCCR0A &= ~((1<<COM0B1) | (1<<COM0B0));}
if (cykl==7) { TCCR0A |= (1<<COM0B1) | (1<<COM0B0);}
cykl++;
if (cykl==8) cykl=0;
}[/code]
Nezkoumal jsem DS, předpokládám, že to máš správně. Možná ti tam bude lítat jednička, ale to snadno zjistíš.
Máš špatně nastavený Compare Output Mode: “Set OC0A on Compare Match, clear OC0A at TOP”. Ty potřebuješ ten předposlední mód. Z ifů vyhoď “COM0B0”.
Ta perioda musí vyjít téměř přesně (na desetiny). Jesli ne, tak to máš nesprávně nastavený. Předpokládám, že jsi to neopravil a timer ti stále jede až do 255 namísto jen do 195.
s tym modom Set OC0A on Compare match clear at TOP mi to fungovalo az kym som nedal do prerusenia tie podmienky a vypinanie OC0 portu, ked som ich tam dal tak sa mi obratili pulzy. Skusal som zmenit ten mod ale robi to to iste, stale su pulzy v L a nie v H