mikrocontroller.net

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


Autor: Christoph Krikl (Gast)
Datum:

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

Autor: Bernhard S. (bernhard)
Datum:

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

Autor: Christoph Krikl (Gast)
Datum:
Angehängte Dateien:

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

Autor: inoffizieller WM-Rahul (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

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.