Hallo, ich bin gerade dabei mich ein wenig in Interrupt Routinen zu versuchen. Aber schon bei den einfachsten Sachen bekomme ich Probleme. Anbei ist mein Sourcecode. Was will ich machen? - an INT0 liegt ein Signal mit Manchestercodierung an - zwischen den Flanken liegen 50us bzw. 100us - bei erkennen einer Flanke positive und negative soll ein Interrupt ausgeführt werden - eine LED soll bei jeder Flanke ihren Zustand wechseln - da die Wörter keine einheitliche Länge haben, wird mit Hilfe des Compare Interrupts entschieden. Wenn 200us vergangen sind ohne erneute Flanke, dass das Datenwort beendet ist. Problem: Stelle ich im EICRA ISC00 und ISC01 auf Detektion beider Flanken funktioniert mein code nicht. Die LED schaltet seltener als Flanken kommen. Die Erkennung ob das Datenwort beendet wurde erfolgt nicht wie gewünscht nach 200us sonder nach 320us. Ursache: Wenn ich das nur wüsste. Das Schalten der Ports kann doch nicht dazu führen, dass ein Interrupt verpasst wird, oder? Das ganze läuft bzw. läuft nicht auf einem ATMEGA168. Hat jemand einen Rat? Gruss werfab
Frei geraten: 50µs @ 8 Mhz sind 400 Takte, vielleicht ist das zu wenig für die ISR? Kannst das ganze ja mal im Simulator durchspielen. Ist es wirklich nötig den Timer anzuhalten um den Wert zu lesen und zurückzusetzen?
Hm das Stoppen des Timers ist wohl nicht unbedingt notwendig. Aber wenn für diese kleine Routine schon die 400 Zyklen nicht ausreichen, werde ich sicherlich dann bei der Auswertung Probleme bekommen. Ich muss für die Manchester-Decodierung ja auch noch schauen ob 50us oder 100us vergangen sind und bei der 100us Flanke den Wert an INT0 noch in ein Register schieben. Real möchte ich später natürlci nicht die LED schalten, das würde wieder ein paar Zyklen bringen. Aber vielen Dank ich probier das ohne den Timer-Stop gleich mal aus.
Nur so ein Gedanke. Evtl. ist es einfacher mit Timer capture zu arbeiten. Da brauchst Du den timerwert nur wegzuspeichern und die Flanke umzustellen. Die Länge verarbeitest Du dann ausserhalb des Interrupts.
Hallo Huch, danke aber das geht leider nicht. Da ich meinen Decoder Pin-kompatibel zu einer bestehenden HW auslegen will/muss. Und die bestehende HW nutzt für den Signaleingang leider den INT0 und nicht den ICP.
Hallo, ich habe mal alles rausgenommen bis auf die ISR die bei Signalwechsel an INT0 die LED umschaltet. Auch da verliere ich Flanken. Dann hab ichs mal auf die Detektion von nur negativen Flanken umgestellt. Dann bekomme ich alle Flanken an INT0 mit. Laut Oszi braucht er in der ISR bis der Port wirklich umgestellt ist (LED an/aus) allein 36us. Ab und zu schafft er es dann aber wieder in 8us. Ist das normal?
> Laut Oszi braucht er in der ISR bis der Port wirklich umgestellt ist > (LED an/aus) allein 36us. Ab und zu schafft er es dann aber wieder in > 8us. Ist das normal? Hab ich das richtig verstanden, 36µs vom Auftreten der Flanke am INT0 bis zum Umschalten des Ausgangs wo die LED dran ist?!?
Oha, der ATMEGA168 war ja noch jungfräulich. CKDIV8 entfernt, jetzt gehts schneller. Besten Dank für eure Hilfe.
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.