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