ATMega a timer2 s OC2
Richard Kaliciak
hw.kaliciak@stonline.sk
Úterý Duben 22 17:06:21 CEST 2008
Dobry den,
pouziva niekto v AVR ATMega128 timer2 v OCR rezime?
Mam nasledujuci problem.
Timer2 mam nastaveny takto:
clock source: system clock
clock value: 15,625 kHz = 16MHz / 1024
mode: normal top=255
output: clear on compare match
PORTB.7 je nastaveny ako vystup.
PORTE.4 je pouzity ako INT4
inicializacia je takato (vynatok):
PORTB=0x80;
DDRB=0x80;
PORTE=0x10;
DDRE=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 15,625 kHz
// Mode: Normal top=FFh
// OC2 output: Clear on compare match
TCCR2=0x25;
TCNT2=0x00;
OCR2=0x40;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
// INT3: Off
// INT4: On
// INT4 Mode: Rising Edge
// INT5: Off
// INT6: Off
// INT7: Off
EICRA=0x00;
EICRB=0x03;
EIMSK=0x10;
EIFR=0x10;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x40;
ETIMSK=0x00;
Moj zamer je takyto:
pri preruseni od INT4 sa na PortB.7 nastavi 1, timer2 sa vynuluje a po
urcitom case danom OCR2 sa PB.7 preklopi do 0.
Prerusenie je externe vyvolane kazdych 10 ms. Ak nenastane, tak timer2
pretecie a vyvola sa prerusenie SIG_OVERFLOW2
ISR( SIG_INTERRUPT4 ){
sbi( TRIAC_PORT, TRIAC_PIN); // tato instrukcia nema vplyv na PB.7
TCNT2=0x00;
OCR2 = mainOptions.powerTimer;
mainOptions.mainSynchronized = 1;
}
TIMER_INTERRUPT_HANDLER(SIG_OVERFLOW2)
{
static char pocitadlo = 0;
sbi( TRIAC_PORT, TRIAC_PIN);
pocitadlo++;
PORTC = pocitadlo;
OCR2 = mainOptions.powerTimer;
mainOptions.mainSynchronized = 0;
}
Moj problem spociva v tom, ze to funguje len raz, po resete, a potom je
PB.7 stale v nule. Z datasheetu som vycital, ze ak je nastaveny bit
COM20 alebo COM21, tak vyvod PB.7 je prepojeny na waweform generator.
V datasheete je priklad len pre rezim "Toggle on compare match"
Otazka: Ako nastavim PB.7 do 1?
Richard Kaliciak
Další informace o konferenci Hw-list