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!
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?
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.