Forum: Mikrocontroller und Digitale Elektronik ISR / INT0 mit ATMEGA168


von Fabian W. (werfab)


Angehängte Dateien:

Lesenswert?

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

von Ahnungsloser (Gast)


Lesenswert?

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?

von Fabian W. (werfab)


Lesenswert?

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.

von Huch (Gast)


Lesenswert?

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.

von Fabian W. (werfab)


Lesenswert?

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.

von Fabian W. (werfab)


Lesenswert?

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?

von spess53 (Gast)


Lesenswert?

Hi

>Ist das normal?

Nicht wirklich. Bist du sicher, das der AVR wirklich mit 8 MHz läuft.

MfG Spess

von Ahnungsloser (Gast)


Lesenswert?

> 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?!?

von Floh (Gast)


Lesenswert?

CKOPT-Fuse ?

von Fabian W. (werfab)


Lesenswert?

Ja 36us vom auftreten der Flanke an INT0 bis Port für LED schaltet

von spess53 (Gast)


Lesenswert?

Hi

CKDIV8-Fuse gelöscht?

MfG Spess

von Fabian W. (werfab)


Lesenswert?

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
Noch kein Account? Hier anmelden.