Forum: Compiler & IDEs Timer0 Overflow Interrupt


von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

Guten Morgen!

Ich habe ein Problem mit dem Overflow interrupt von Timer0 im assyncron 
modus mit Uhrenquartz.

in der Simulation funktioniert es wie es soll, nur auf dem Target nicht.

Anscheinend wird ab und zu das Overflow flag nicht gesetzt oder der 
Interrupt nicht ausgeführt. ich habe das Programm mal so weit 
zusammengeschnitten bis nur noch der Fehler nachstellbar ist.

Konkret:
1
#include "rtc.h"
2
3
uint16_t time = 0;
4
uint16_t z = 0;
5
6
int main(void){
7
  DDRB |= _BV(7);
8
  InitRtc();
9
  sei();
10
  while(1){
11
    z = getMin();
12
    if(del_ms_big_read(&time,1000)){
13
      del_ms_big_start(&time);   //<-- Breakpoint setzten
14
      DDRB ^= _BV(7);            //Led an/aus
15
    }
16
    
17
  }
18
}

wenn an gekenzeichneter Stelle im AvrStudio über Jtag ein Breakpoint 
gesetzt wird, dann kann mann sehen das die Variable z oder gleichwertig 
bigMin1_4 aus rtc.c bei einen Überlauf des Timers nicht um 256 erhöht 
wurde. jedoch in der Simulation funktioniert dies. könnte mir nicht 
vorstellen das nur die eine funktion auf dem Controller defekt ist da 
der rest wunderbar funktioniert.

währe schön wenn das jemand auf seinen System testen könnte.

zum System: ATMega128 16MHz
compiler ist winAvr 20071221
im anhang ist compilierbares projekt mit nachstellbaren fehler, makefile 
ist im ordner release

Vielen dank im Vorraus


Stefan

von Andreas K. (a-k)


Lesenswert?

Würde empfehlen, das Datasheet zum asynchronen Timerbetrieb nochmal 
genau durchzulesen. Da stehen manche Hinweise zu dieser Art Timerbetrieb 
drin, da die Synchronisation diverser Timer-Register zum Timerclock 
gewisse Konsequenzen hat. Beispielsweise bei der Initialisierung. 
Manches davon betrifft zwar nur die Power-Save Modi, aber nicht alles.

Dass der Simulator sich in Detailaspekten nicht 100% wie die Maschine 
verhält, ist nicht so selten. So ist beispielsweise das für den 
asynchronen Modus nicht ganz unwichtige ASSR nicht realisiert, was 
darauf hin deutet, dass die Simulation eben dieses das asynchrone 
Verhalten nicht erfasst. Siehe Release Notes vom Studio.

von Stefan (Gast)


Lesenswert?

Hallo Andreas

Danke für den Hinweis, habe nun auch die Ursache gefunden, aber noch 
keine Lösung.  Auszug aus Datenblatt:

During asynchronous operation, the synchronization of the interrupt 
flags for the
asynchronous timer takes three processor cycles plus one timer cycle. 
The timer is
therefore advanced by at least one before the processor can read the 
timer value
causing the setting of the interrupt flag. The output compare pin is 
changed on the
timer clock and is not synchronized to the processor clock


habe es auch nachgestellt, der interrupt kommt zu spät, kommt aber 
sicher, werd mir nun was einfallen lassen sowas abzufangen.

Vielen Dank Stefan

von Stefan (Gast)


Lesenswert?

Hallo Nochmal!

Kleiner Nachtrag, konnte das Problem jetzt beseitigen, funktioniert nun 
Tadellos...


Gruß Stefan

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.