Forum: Mikrocontroller und Digitale Elektronik Interrupt problem - ATMEGA8 hängt sich auf


von Christoph Krikl (Gast)


Lesenswert?

Hi Leute ich hab ein kleines Problem, mit meiner Schaltung, ich hab
einen atmega8 und daran über I2C einen Philips PCF 8574 dran hängen
(I2C Porterweiterung). Interup vom PCF mit INT0 verbunden.

jetzt wenn ein eingang sich am PCF ändert wird der interrupt low
gezogen.
hab jetzt nur mal einen taster an den PCF angehängt und eine ISR
geschrieben die dann den PCF über I2C ausliest und über den UART der
Wert ausgiebt. sobald ich in die ISR springe schalte ich die interrupts
mit cli() aus und erst am ende mit sei() wieder ein, hab mir gedacht
könnte vielleicht irgentwie daran liegen das da ein zweiter interrupt
ausgelöst wird, von irgenwas.

so weis so gut, eigentlich gehts ganz gut,wenn der taster nur langsam
gedrückt wird, wird der taster jedoch jetzt schnell hinteinander
gedrückt hängt sich der uConrtoller recht schenll auf,

mach irgent etwas falsch, und wenn ja wie kann ich das verhindern ,
ausser mit einem watchdog weil das kanns ja auch nicht wirklich sein
???

danke
Christoph

von Bernhard S. (bernhard)


Lesenswert?

Hallo Christoph,

Du programmierst sicherlich in Assembler?

Hast Du in Deinen ISR auch Register und vorallem die Flags gesichert?

Günstiger wär's, wenn Du uns Dein Programm bei solchen Problemchen zur
Vefügung stellst, sonst orakeln wir nur.

Bernhard

von Christoph Krikl (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Bernhard,

danke erstmal

'Du programmierst sicherlich in Assembler?
nein ist in avrgcc geschrieben

'Hast Du in Deinen ISR auch Register und vorallem die Flags
gesichert?
hab ich nicht, macht aber der gcc compiler automatisch, oder ?

code ist jetzt mit dabei

Christoph

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>schalte ich die interrupts mit cli() aus

Brauchst du nicht, macht der AVR von sich aus.

Vielleicht solltest du dir im Datenblatt mal die Behandlung von
Interrupts (vor allem auch der externen) angucken.

von Peter D. (peda)


Lesenswert?

UART-Aufrufe gehören nicht in Interrupts und erst recht nicht, wenn sie
selber Interrupts benutzen.


Durch das Tastenprellen füllst Du den Puffer, aber der UART-Interrupt
kann erst ausgeführt werden, wenn der externe Interrupt beendet wird.

Erreichen die Daten das Pufferende, hast Du nen prima Deadlock, d.h.
Dein Progamm steht für immer.


Die richtige Vorgehensweise ist, Du merkst Dir in einer Variablen, den
zu sendenden Wert und im Main sendest Du ihn dann.

Am besten ist, man vermeidet Funktionsaufrufe innerhalb von Interrupts
völlig.
Aber wenn doch, dann muß man genau wissen, was hinter der aufgerufenen
Funktion steckt !


Früher stand an Telefonzellen: "Fasse Dich kurz !".
Für Interrupts gilt das immer noch !


Peter

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.