Skocz do zawartości
mog123

Timer0 w atmega16 - matma.

Pomocna odpowiedź

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.

Udostępnij ten post


Link to post
Share on other sites

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.

Udostępnij ten post


Link to post
Share on other sites

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 😃

Udostępnij ten post


Link to post
Share on other sites

Czy mi sie cos porabalo?😋

OCR0 - do tego zlicza

TCNT0 - Tu mozemy wpisac wartosc poczatkowa i aktualny stan licznika?😋

Udostępnij ten post


Link to post
Share on other sites

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.

Udostępnij ten post


Link to post
Share on other sites

Jak bardzo się spieszy, np. ile sekund w ciągu godziny?

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...