Wpis z mikrobloga

To znowu ja. Uczę się swojej ATmegi8 i postanowiłem okiełznać Timera0 na dwa sposoby: raz z sukcesem za pomocą globalnych przerwań - udało się uzyskać przerwanie co ~1s (F_CPU=8000000 / 256 / 1024 / 30), natomiast z drugim, "ręcznym" sposobem mam problem: atmega tak jakby pomija preskalera całkowicie. Poniższy kod daje przerwanie co ~0.5s bez względu na to jaki preskaler ustawię. Czemu on nie działa? Nie satysfakcjonuje mnie takie rozwiązanie, żebym musiał liczyć do tych 65k..

http://wklej.to/HmjAS

#avr #atmega8 #elektronika #atmega #mikrokontrolery
  • 11
@kiciek: TIMER0_CLEAR, bo logiki timera nie resetujesz. Taka drobnostka, ofc flagę zdejmuje się jedynką lub robi to kontroler przerwań.
@Visher: Najpierw konfigurujesz wszelkie przerwania, jak już masz wszystko poustawiane ustawiasz globalną flagę zezwolenia na przerwania. Na przyszłość, jeśli masz w systemie już uruchomione przerwania, to na czas konfiguracji innego urządzenia wyłączasz globalnie przerwania, konfigurujesz i znowu je włączasz.

if (counter0++ == 65535) {

Jeśli w ISR inkrementujesz tą zmienną to
@Analityk: może niepotrzebnie połączyłem dwa kody w jeden, ale celowo nie odblokowuję globalnych przerwań w drugim przypadku, aby przerwanie ISR nie wywoływało się. Nie wydaje mi się to też potrzebne. @kiciek: Przeanalizuję jeszcze raz moje operacje na rejestrach i dam znać.
@Visher: W takim razie zdejmuj flagę jedynką.

The bit TOV0 is set (one) when an overflow occurs in Timer/Counter0. TOV0 is cleared by hardware when executing the corresponding interrupt Handling Vector. Alternatively, TOV0 is cleared by writing a logic one to the flag.
@Analityk: w taki sposób działa, z tym zdejmowaniem flagi jedynką: http://wklej.to/yd7xH
I wszystko się mniej więcej zgadza: F_CPU=8000000 / 1024 (preskaler) / 256 (8-bitowy licznik) / 30 (moje liczenie) = miganie diody co 1,017 sekundy.

Niestety to zdejmowanie flagi jedynką kłóci mi się z tym wpisem w dokumentacji, na którym bazowałem swój program:

The counting direction is always up (incrementing), and no counter clear is performed. The

counter simply overruns when
ja w swoim poprzednim programie czekałem na to 1, zerowałem je i znowu czekałem


@Visher: Na wieczność. Odczyt to odczyt a zapis to zapis. Widać logika uC wie co robisz. (może tak są tam bramki poustawiane, nikt poza atmelem tego nie wie).
@Analityk: czyli po prostu muszę przyjąć, że jak wysyłam instrukcję dla procesora na ustawienie tam jedynki, pomimo tego że już jest tam jedynka, to on "bierze tą moją instrukcję inną drogą" i interpretuje ją jako żądanie ustawienia zera? :o