Witam, mam problem z poprawnym uruchomieniem timerow na w/w atmedze. Do tej pory bawilem sie Atmega32 i problemow nie bylo.
Problem tkwi w tym, ze nie dzialaja mi przerwania od timerow. Dodatkowo wydaje mi sie (jedynie z obserwacji), ze zmiana preskalerow tez nie wplywa na szybkosc zliczania... Porownywanie z wzorcami porownania z OCR(x) tez...
Timery poprostu licza sobie od 0 do 255 i automatycznie zeruja sie. i tak w nieskonczonosc, zawsze z ta sama predkoscia.
Atmega64L taktowana wewnetrznym generatorem RC 1MHz Zasilanie 3.3V
Ponizej zamieszczam przykladowy problem, ktory NIE dziala na Atmedze64L, natomiast bezblednie dziala na Atmedze32:
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/iom32.h>
volatile unsigned int interrupts2 = 0; volatile unsigned int interrupts0 = 0;
void io_init(void) { DDRG &= ~(1 << PG3); // Wejscie TOSC2 - 32kHz DDRG &= ~(1 << PG4); // Wejscie TOSC1
DDRD &= ~(1 << PD2); // Wejscie RxD DDRD |= (1 << PD3); // Wyjscie TxD }
ISR(SIG_OVERFLOW2) { interrupts2++; TCNT2 = 0; }
ISR(SIG_OVERFLOW0) { interrupts0++; TCNT0 = 0; }
int main(void) {
io_init(); uart_init();
TIMSK &= ~(1 << TOIE2); TIMSK &= ~ (1 << OCIE2); ASSR |= (1 << AS2); TCCR2 |= (1 << CS22); TCCR2 |= (1 << CS20);
while(ASSR&0x07);
TIMSK |= (1 << TOIE2); TIMSK |= (1 << OCIE2); OCR2 = 0x99;
TIMSK |= (1 << TOIE0); TIMSK |= (1 << OCIE0); TCCR0 &= ~(1 << WGM00); TCCR0 &= ~(1 << WGM01); TCCR0 |= (1 << CS02); TCCR0 &= ~(1 << CS01); TCCR0 &= ~(1 << CS00);
SREG |= 0x80;
while(1) {
}return 0; }
Rezultat wyrzucam sobie na konsole COM za pomoca uarta Zmienne interrupts0 i interrupts2 sa ciagle rowne zero...
Prosze o jakies wskazowki, bo juz mi rece opadaja :(
Pozdrawiam, Piotr