Skocz do zawartości

Timer0 w atmega16 - matma.


mog123

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.

Link do komentarza
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.

Link do komentarza
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 😃

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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.

Link do komentarza
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!

Anonim
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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.