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