Nastavenie PWM na ATtiny2313 ku generovanie impulzov

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.

:arrow_right: administrator: přejmenováno z "Nastavenie PWM na attiny2313"

255 = 2.5ms => 20ms = 2040 = TOP
2040/0.02 = 102000 Hz * 64 => Fosc = 6.528 MHz
102000 Hz * 8 => Fosc = 0.816 MHz
Pokud dostaneš do mcu některou z těchto frekvencí, máš to přesně (jen 0=0.5ms rozhodně nelze zařídit, timery jsou lineární).

Jesli budeš mcu provozovat na odlišných frekvencích, tak máš smůlu a 255=2.5ms nedostaneš.
Pro Fosc=8MHz a T=20ms => timer1, mode14, Fosc/64, TOP=ICR1=2500.
0.5ms => OCR = 62.5, 2.5ms => OCR = 312.5 :slight_smile:

Pro Fosc=20MHz a T=20ms => timer1, mode14, Fosc/256, TOP=ICR1=1562.5.
0.5ms => OCR = 39, 2.5ms => OCR = 195

Ja by som to potreboval vyriesit na 8 bitovom timer0,
skusal som to na 16 bitovom timer1 ale tam neviem nastavit ako vystupny
pin pre pwm PD5 (OC0B)

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

Nastavil som ho, ale nejde to

OC0 jsou pro timer0 a OC1 pro timer1 :wink:
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 :slight_smile:

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 :slight_smile:

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. :wink:

Ja viem, ja viem. Vzdy je nakoniec chyba niekde medzi stolickou a klavesnicou :slight_smile:

Vsetko je niekde akosi napisane, ale kym na to clovek pride, tak ubehne aj tyzden :slight_smile:

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.

Ale co by sme inak po veceroch robili ze? :slight_smile:

Pouzil som osc. 20 MHz pulzy vychadzaju, ale neviem ako dosiahnut periodu cca 20ms, teraz tam mam cca 3,2 ms

Tak teď to zkoumat nebudu, ale předpokládám, že jsi nepoužil děličku :wink:

pouzil som 1/256, pulzy vychadzaju na 0,5-2,5ms ale perioda je namiesto 20ms cca 3,2 ms

:arrow_right: administrator: příspěvek byl upraven
Předchozí příspěvky se necitují.

To jsem zas v noci vymyslel hlod :slight_smile:
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 :wink:

Ak som to spravne pochopil tak po vyvolani prerusenia z casovaca vypnem oc0 pin, a po 7mom preruseni znova zapnem?

Správně, ovšem zapnutý bude jen do dalšího přerušení a pak zas na 7 vypnout.

Skusal som to ale stale to ide rovnako, ako keby sa vobec nevykonalo prerusenie

ISR(TIMER0_COMPB_vect)
{

cli();

if (cykl==0) { TCCR0A = TCCR0A| (0<<COM0B1)| (0<<COM0B0);}
if (cykl==6) { TCCR0A = TCCR0A| (1<<COM0B1)| (1<<COM0B0);}

cykl=cykl+1;

if (cykl==8) cykl=0;
sei();

}

Neumíš C, proto ti to nejde :wink:
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íš.

uz mi to ide, perioda je cca 22ms ale mam iny problem, teraz mam pulzy 0.5 - 2.5 ms v L (predtym boli v H)

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