Skocz do zawartości

Timer0 w atmega16 - matma.


Pomocna odpowiedź

Napisano

Napisałem prostą obsługę czasu rzeczywistego zeby uzyc jej dalej przy programie, uzylem timera 0 z prescalerem 64 przy czestotliwosci 16mhz. czyli 250khz. 1/250k daje 0,000004s na jeden takt licznika. Po 250 taktach (OCR0) wystrzelam przerwanie i mam 0,001s potem zliczam to 1000 razy i mam pelna sekunde, no ale niestety - liczy zbyt szybko. Ktos potrafi mi w tym pomoc?

Tu jest kod:

//   timer 0 settings
  TCCR0=_BV(WGM01)|_BV(CS01)|_BV(CS00); 
  OCR0= 0xFA; //count to 250 pulses (0,001s) 

//   interrupts 
  TIMSK=_BV(OCIE1A)|_BV(OCIE1B)|_BV(OCIE2)|_BV(OCIE0); 
  TIFR =_BV(OCF1A)|_BV(OCF1A)|_BV(OCF2)|_BV(OCF0); 

ISR(TIMER0_COMP_vect) // at interrupt(when hits OCR0) 
{ 
  backup_tmr++; 
  if(backup_tmr==1000){ 
                                    t.second++; 
                                    backup_tmr=0; 
                                   } 
  if(t.second==60) 
  {                               
   t.second=0; 
   if (++t.minute==60) 
   { 
     t.minute=0; 
     if (++t.hour==24) 
     { 
       t.hour=0; 
     } 
   } 
 } 
} 

Tak, jest sei(), to jest tylko wycinek kodu. Fusy mam dobrze ustawione.

Nie znam C, i nie wiem jaka jest składnia poleceń, ale według mnie masz błąd przy wpisywaniu wartości początkowej do OCR0= 0xFA, ty wpisujesz wartość 250, a powinieneś wpisywać 6, korzystając z przerwań aktualnie licznik przepełnia się po 6 impulsach, a nie po 250.

Timery w AVR liczą w przód. TC0 może zliczać od 0 do 255. Jeżeli liczba zliczanych impulsów ma być mniejsza, należy przed rozpoczęciem zliczania do rejestru TCNT0 wpisać różnice: TCNT0=256-t, u Ciebie t=250 czyli powinieneś wpisać 6 tak jak powiedział Sabre 😃

Dobrze rozumiesz z OCR0 i TCNT0, co prawda powinno być chyba 250-1, ale to bez większego znaczenia.

Jakiego używasz procesora? Bo na atmedze16 ten kod daje dzielnik /64, ale na m128 /32.

[ Dodano: 16 Sie 09 10:49 ]

dla atmegi128 u mnie działa poprawnie:

TCCR0=_BV(WGM01)|_BV(CS02); 
OCR0= 250-1; //count to 250 pulses (0,001s) 

[ Dodano: 16 Sie 09 11:41 ]

Uruchomiłem na m16. Jedyna różnica u mnie to zegar 8Mhz, więc do OCR wpisałem 124.

Działa bardzo ładnie, poszukaj czy poza tym kodem który przysłałeś nie ma błędu.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...