Forum: Mikrocontroller und Digitale Elektronik Problem mit Interrupt auf Atmega48


von MacGoever (Gast)


Angehängte Dateien:

Lesenswert?

Hi Leute,

ich bin grad stark am verzweifeln. Ich programmiere den angehängten Code 
auf einen Atmega48. Ich habe den problematischen Code aus dem 
Gesamtprogramm extrahiert und vereinfacht um alle möglichen 
Programmierfehler auszuschließen.
Im Prinzip wird ein register ausgegeben und in bestimmten 
Zeitintervallen über einen Timer geschiftet und wieder ausgegeben. 
Ansonsten läuft der Atmel in einer Endlosschleife. In der Endlosschließe 
werden 2 Bit des Registers pro  Durchlauf gekippt, so dass man noch 
erkennen kann, ob der Controller noch läuft.

Ich habe jetzt an die Ausgangsports LEDs angeklemmt. Die beiden 
"KontrollLEDs" leuchten deutlich schwächer, da sie zwischendurch immer 
wieder an und ausgeschaltet werden. Das entscheidende Problem ist jetzt, 
dass der Schift nur einmal durchgeführt wird. Der Interrupt wird also 
einmal ausgeführt und danach nie wieder. Gibt es da ein Bit, das man so 
ein Verhalten einstellen kann? Habe meiner Meinung nach alles versucht 
und ausprobiert.

Im Debugger läuft alles einwandfrei. Habe auch schon einen anderen Chip 
versucht.

Hat jemand eine Idee?

Danke im Vorraus für jede Anregung!

von Dennis (Gast)


Lesenswert?

Eine Problemlösung kann ich dir nicht anbieten, aber ein paar Sachen die 
mir aufgefallen sind:

- Es wäre vielleicht besser, TCCR1B erst zu setzen wenn die beiden 
anderen
  Timer-Register gesetzt sind, dadurch verhindert man dass direkt beim 
Start
  schon ein Overflow erkannt wird

- Kann es sein dass die LEDs den Controller überlasten, die Spannung 
einbricht
  und der Controller dadurch resettet?

- Was mir gerade noch bei "Spannung einbricht" einfällt: 
Abblockkondensator?

von MacGoever (Gast)


Lesenswert?

Hi Dennis,

erstmal Danke für die Ideen. Deinen Vorschlag mit dem TCCR1B habe ich 
eingebaut, gab aber keine Veränderung. Einen Reset halte ich für 
unwahrscheinlich, da der Atmel ja nach dem Starten immer dasselbe 
Verhalten zeigt und dann auch weiterläuft. Es wird ja auch ein einziges 
Mal ein Interrupt ausgelöst. Aber danach nie wieder.

Ein Schaltungsproblem schließe ich aus, da ich die Tests in einem STK500 
mache. Oder könnte das einen Knacks haben?

Gruß aus Münster

MacGoever

von Spess53 (Gast)


Lesenswert?

Hi

1. Mit deiner Einstellung CS10=1 läuft dein Timer mit voller 
Geschwindigkeit.
ein Blinken wirst du da nicht sehen.

2. Bei WGM12 und WGM13=1 (Mode12) ist Top vom Timer ICR1. An deiner 
Stelle würde ich Timermode 4 (nur WGM12=1) nehmen. Da dort Top vom Timer 
OCR1A ist macht das mehr Sinn.

Die Simulation im AVR-Studio ist bei Timern nicht immer fehlerfrei.

Noch zu deinem Programm: dein Konstrukt mit dem rol... in der 
Interruptroutine wird nur bei deinem einfachen Programm funktionieren. 
Bei rol wird Bit7 ins Carryflag geschoben und beim nächsten rol nach 
Bit0. Wenn das Carryflag im Hauptprogramm verändert wird geht diese 
Information verloren.

MfG Spess

von MacGoever (Gast)


Lesenswert?

Jaaa!

Danke an Spess! Du hattest total recht! Ich hatte den falschen Timermode 
genommen. Hutzieh. Vielen Dank. Du hast den ostwestfälischen 
Hochleistungskegelsport unterstützt, denn das Ganze Projekt soll eine 
Kegelbahn <-> Laptop Schnittstelle werden.

Gruß aus Münster

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.