mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMega 32 - Problem mit Interruptroutine (Timer)


Autor: Fabian Cordes (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe eine Problem mit dem angehängten Code. Das ganze soll auf einen 
ATMega32. An Port C/D hängen zwei R-2R-Netzwerke als Digital-Analog 
Wandler, auf denen die Software zwei Werte X und Y ausgibt, die auf 
einem Oszi im XY-Modus dann schöne Bilder machen. Für das aktualisieren 
der Werte ist die Timer-Interruptroutine ganz am Ende zuständig.

Nun zu dem Problem. Wenn ich den Code simuliere, dann wird diese Routine 
aufgerufen, springt nachdem sie ausgeführt wurde aber nicht zurück, 
sondern startet neu. Ansonsten macht sie das, was sie soll, doch das ist 
mehr oder weniger zufall. Auf meinem Testboard passiert gar nichts, was 
mich aber auch nicht wundert, wegen des Problems in der Simulation.

Die Routine soll alle 256 Takte aufgerufen werden, ich habe mal 
durchgezählt, es sind über 100 Takte am Ende der Ausführung übrig. Das 
sollte doch reichen, um zurück zu springen?
Habe ich vielleicht vergessen, in der Routine irgendetwas zu setzen?

Viele Grüße,

Fabian

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TCCR0 = (1<<CS00) || (1<<CS01);  // Prescaler = 1
Das stimmt doch nicht. CS00 und CS01 auf "1" ist doch ein Prescaler von 
64. Demnach wird die ISR alle 2^14 Takte aufgerufen.

Vielleicht hast ja auch nur hier falsch gepostet. Ansonsten kann es auch 
sein, dass der Mega einfach länger benötigt also diese 256 Takte. Auf 
den Simulator ist nicht immer 100% Verlass.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timmo H. wrote:
>
> TCCR0 = (1<<CS00) || (1<<CS01);  // Prescaler = 1
> 
> Das stimmt doch nicht.
Richtig, das stimmt nicht, aber nicht (nur) aus den von Dir genannten 
Gründen, sondern (auch), weil hier anstelle des bitweisen ODER ein 
logisches ODER steht, und das geht definitiv in die Hose...

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh, ich sehe grad, dass (zufällig?) genau dieses (eigentlich falsche) 
logische ODER dafür sorgt, dass der Prescaler tatsächlich auf die im 
Kommentar genannte "1" (kein Prescaling) eingestellt sein dürfte... Dass 
das so in der Absicht des Programmierers lag, halte ich allerdings für 
unwahrscheilich...

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt, das Bitweise OR habe ich ganz übersehen :-) Mit so einem Fehler 
rechnet man natürlich auch nicht

Autor: Fabian Cordes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ja, das ist so nicht richtig, es war ein bischen spät gestern und ich 
habe über den Code vor dem Posten nicht richtig rübergeschaut.

Eigentlich sollte da auch nur CS00 gesetzt werden, denn ich will ja 
einen Prescaler = 1. Der Rest kam aus meiner letzten Debugsession, da 
ich mir schon dachte, dass die Interruptroutine etwas zu lang ist. Das 
werde ich gleich nochmal korrigieren und testen.

Übrigens funktioniert die Simulation doch, wie ich gerade gemerkt habe, 
wenn man in die endlosschleife in Main irgendeine Dummyoperation packt. 
Dann springt er auch wieder zurück.

Auf dem Testboard geht es leider immer noch nicht.
Noch einige Informationen die vielleicht nützlich sein könnten:

Ich habe zwei Statusleds, und mal versucht die erste (grün) am Anfang 
von Main() zu setzen und die zweite (rot) im ISR. Was passiert ist, dass 
die grüne nach einem Reset kurz aufblinkt und dann wieder ausgeht. Die 
Rote bleibt immer aus. Was aber eigentlich nicht sein dürfte, da ich 
wirklich nur an diesen beiden Stellen auf die LEDs zugreife, und ich sie 
auch niemals ausschalte, sondern immer nur auf logisch 1 ziehe.

Auch an den Pins messe ich komische Werte. Die sollten ja eigentlich 
0V/5V haben, ich messe aber eher sowas wie 2.2 V. Aber eine saubere 
Gleichspannung, also nix was durch eine zufällige PWM entstanden sein 
könnte.

Vielleicht noch Ideen, wie ich den Fehler genauer eingrenzen könnte?

Viele Grüße,
Fabian

Autor: Ale (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vBuffPtr nicht initilisiert ist ;-)

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vBuffPtr bekommt ja wirklich nirgends eine Zuweisung. Nur einmal bei
if (vbufPtr == VECBUFSIZE)
{
  vbufPtr = 0;
}
Aber auch nur dann wenn vbufPtr zufällig mal 5 ist.

Autor: Fabian Cordes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
stimmt. :)

Wars aber nicht, sondern es war einfach eine falsches target für den 
Compiler...ATMega8 eingestellt, ATMega32 benutzt, ich nappo :)


Viele Grüße und besten dank an alle,

Fabian

Autor: Fabian Cordes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wollte nochmal allen Menschen danken, die mir hier geholfen haben.

Ohne euch wäre ich heute nicht dort, wo ich jetzt bin. Ist zwar immer 
noch nicht ganz oben, aber ich habe viel gelernt. Danke dafür.

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oha, zu was bist du denn jetzt in den letzten 9 Jahren geworden?

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.