mikrocontroller.net

Forum: Compiler & IDEs Timer0 Overflow Interrupt


Autor: Stefan (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
#include "rtc.h"

uint16_t time = 0;
uint16_t z = 0;

int main(void){
  DDRB |= _BV(7);
  InitRtc();
  sei();
  while(1){
    z = getMin();
    if(del_ms_big_read(&time,1000)){
      del_ms_big_start(&time);   //<-- Breakpoint setzten
      DDRB ^= _BV(7);            //Led an/aus
    }
    
  }
}

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

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Nochmal!

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


Gruß Stefan

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.