Interrupt problem - ATMEGA8 hängt sich auf

Gast #402492
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
Gast #402494
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
Angehängte Dateien:
Gast #402495
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.
#402496
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren