mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ISR / INT0 mit ATMEGA168


Autor: Fabian Werner (werfab)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Ahnungsloser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Fabian Werner (werfab)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Huch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Fabian Werner (werfab)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Fabian Werner (werfab)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Ist das normal?

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

MfG Spess

Autor: Ahnungsloser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?!?

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
CKOPT-Fuse ?

Autor: Fabian Werner (werfab)
Datum:

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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

CKDIV8-Fuse gelöscht?

MfG Spess

Autor: Fabian Werner (werfab)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oha, der ATMEGA168 war ja noch jungfräulich. CKDIV8 entfernt, jetzt 
gehts schneller. Besten Dank für eure Hilfe.

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.