Forum: Compiler & IDEs Problem mit 2 ISR bei Mega16


von Torsten K. (avr_fan)


Lesenswert?

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

von Oliver (Gast)


Lesenswert?

Kompletter Source-Code?

Oliver

von Torsten K. (avr_fan)


Angehängte Dateien:

Lesenswert?

Hallo,

anbei der Sourcecode des Hauptprogramms.
Die includes hab ich erst mal nicht mit rein genommen.

Gruss Torsten

von Oliver (Gast)


Lesenswert?

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

von Torsten K. (avr_fan)


Angehängte Dateien:

Lesenswert?

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

von Oliver (Gast)


Lesenswert?

>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

von Torsten K. (avr_fan)


Lesenswert?

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