Hallo, ich habe ein kleines Problem mit 2 ISR im ATMega16 als TWI-Slave. ISR 1 ist der Timer0-Overflow und ISR 2 ist für das TWI-Interface (TWI_vect). Getrennt von einander laufen beide Routinen ohne Probleme. Die Timerroutine ist für die Entprellung von 8 Tastern und setzt nur ein Flag, das in der Mainloop ausgewertet wird. Die TWI-Routine reagiert auf ein ankommendes Signal am I2C-Bus und sendet an den Master die angeforderten Daten. Wenn ich die Timer-ISR auskommentiere, dann kann ich ohne Probleme vom Master den Slave ansprechen und beliebig oft die Daten abfragen. Ist die Timer-ISR aktiv, dann funktioniert die Übertragung nur ein mal und danach reagiert die TWI-ISR nicht mehr, die Timer-ISR läuft weiter und in der Mainloop wird auch die Auswertung des Flag weitergeführt, d.h. der Prozessor scheint noch korrekt weiter zuarbeiten. Aber warum reagiert er nicht mehr auf das TWI-Interface? Hardware: ATMega16 als I2C-Slave F_CPU: 8MHz TWI-Takt: 100kHz WinAVR: Version 21122007 Optimierung: Aus (0) Als Master verwende ich einen ATMega32. Die TWI-Master & Slave-Routinen stammen aus dem folgendem Beitrag Beitrag "AVR TWI Master und Slave Funtionen in C" Ich hoffe, das mir da jemand weiterhelfen kann. Gruss Torsten
Hallo, anbei der Sourcecode des Hauptprogramms. Die includes hab ich erst mal nicht mit rein genommen. Gruss Torsten
Ohne was Kompilierbares wird das nichts. Eine Frage stellt sich mir allerdings schon: Der Original-TWI-Slave pollt. Warum bleibst du nicht einfach dabei? Oliver
Hallo Oliver, die Auslagerung in die ISR wollte ich der Übersichtlichkeit wegen machen. Auserdem sollte der Slave so nix verpassen, weil ja normaler weise immer ein Interrupt ausgelöst wird, wenn auf dem Bus was los ist. Mir persönlich ist die Lösung mit Interrupt wesentlich sympatischer als das Pollen. Das Auslagern in die ISR ist ja auch nicht das Problem, weil ohne den Timer funktioniert es ja auch mit der ISR. Außerdem habe ich das Pollen in der main-Function testweise wieder rein gemacht und selbst dann geht auf dem I2C nix mehr wenn Timer0-ISR aktiv ist. Anbei die komplette Source. Gruss Torsten
>Anbei die komplette Source.
Anbei sind die Master-Slave-Funktionen. Die haben nichts mit deinem
Problem zu tun. Dein main von oben kompiliert damit nicht.
Ich klink mich jetzt aus. So wird das nichts. Das einzige, was auffällt,
ist, daß du in deiner main den TWI-Interrupt überhaupt nicht freigibst.
Das passt aber nicht zu deiner Fehlerbeschreibung. Unbekannte Fehler in
nicht vorliegender Software zu suchen, ist nicht wirklich
erfolgversprechend.
Oliver
Hallo Oliver, anscheinend gibt es hier ein kleines Missverständnis. In dem Zipfile ist der komplette Sourcecode für den TWI-Slave enthalten. Und der lässt sich mit WinAVR ohne Probleme kompilieren. Die main.c von weiter oben war nur ein Auszug aus dem kompletten Code. Leider ist mir da beim Bereinigen ein kleiner Fehler unterlaufen und deswegen gibt es bei der main.c einen Compilerfehler (es fehlt ein ; am Ende der zeile 126). Da der Sourcecode noch in Arbeit ist, wollte ich den ganzen auskommentierten Müll rauswerfen. D.h. die main.c von oben und die main_slavemodul.c aus dem Zipfile sind die gleichen Dateien und lassen sich, wenn das Semikolon drin ist ;-) alle beide kompilieren. Sorry für das Missverständnis, aber ich hatte bei den ersten Postings nicht alle Quellen dabei, da ich berufsmäßig viel unterwegs bin. Trotzdem vielen Dank für die Bemühungen. Gruss Torsten
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.