www.mikrocontroller.net

Forum: Compiler & IDEs Problem mit 2 ISR bei Mega16


Autor: Torsten K. (avr_fan)
Datum:

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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kompletter Source-Code?

Oliver

Autor: Torsten K. (avr_fan)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Gruss Torsten

Autor: Oliver (Gast)
Datum:

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

Autor: Torsten K. (avr_fan)
Datum:
Angehängte Dateien:

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

Autor: Oliver (Gast)
Datum:

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

Autor: Torsten K. (avr_fan)
Datum:

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

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.