TWI mit Interrupts

Gast #172589
Hi,

seit ein paar Wochen beschaeftige ich mich mit dem Atmel ATMega8
Controller. Ich moechte zwei dieser Controller ueber TWI/I2C mit
einander sprechen lassen.

Dazu verwende ich die I2C Routinen aus der AVRLib. Nachdem ich
keinerlei Kommunikation zustande gebracht hatte, habe ich testweise
einen 24C64 (kleiner 64kB EEPROM) ueber I2C angebunden. Dabei habe ich
festgestellt, dass die interrupt-losen Funktionen (i2cMasterSendNI()
bzw. i2cMasterReceive()) einwandfrei arbeiten, nur die
Interrupt-Versionen funktionieren nicht.

Ich habe testweise einen rprintf Befehl in den Interrupt-Handler (die
SIGNAL() Routine in i2c.c) eingebaut und dabei festgestellt, dass nie
ein Interrupt ausgeloest wird.

i2cInit() wird aber zu anfangs aufgerufen und darin wird sowohl der
TWI-Interrupt enabled (sbi(TWCR, TWIE);) als auch global Interrupts
eingeschaltet (sei();).

Hat jemand einen Tip, warum keine Interrupts ausgeloest werden ?

Vielen Dank,

Gruss Martin
Gast
Hi Hagen,

nein, hilft leider nichts. i2c.c included es auch schon:

#include <avr/signal.h>
#include <avr/interrupt.h>

Daran lags leider nicht. Ich hab zwischenzeitlich nochmal ueberprueft,
ob ich ueberhaupt Interrupts ausloesen kann - das funktioniert
prinzipiell, denn ein Handler fuer den Overflow Interrupt vom Timer
wird aufgerufen. Es scheint also vermutlich ein TWI-spezifisches
Problem zu sein.

Tappe weiterhin im Dunkeln...

Weitere Ideen ?
Ohne C-Quelltext (Dateianhang) keine Hilfe möglich.


Zu oft wurde behauptet, man hätte irgendeinen XY-Code völlig
unverändert genommen und später stellt sich das dann als Lüge heraus.


Auch ist es nicht nett, wenn der Helfende eine XY-Lib erst suchen muß,
ganz abgesehen davon, daß es bestimmt mehrere Versionen der Lib gibt.


Peter
Gast
Hi Peter,

"Ohne C-Quelltext (Dateianhang) keine Hilfe möglich.

Zu oft wurde behauptet, man hätte irgendeinen XY-Code völlig
unverändert genommen und später stellt sich das dann als Lüge heraus.

Auch ist es nicht nett, wenn der Helfende eine XY-Lib erst suchen muß,
ganz abgesehen davon, daß es bestimmt mehrere Versionen der Lib
gibt."

eine Library-Versionsangabe habe ich leider bei der AVRlib nicht
gefunden. Es gibt aber eine Versionsangabe in die i2c.* Files:
Verion 0.9.

Ich habe mal die relvanten Files und das Makefile zusammengepackt und
angehaengt. In den Files der AVRlib habe ich folgende Dinge
veraendert:

1) Die Zeile "#include "uart2.h"" ein einen #ifdef Block gepackt:

        #ifdef I2C_DEBUG
        #include "uart2.h"
        #endif

2) Im Interrupt-Handler eine Debug-Zeile eingefuegt:

    // Debug-Code: Wird der Interrupt-Handler ueberhaupt
    // ausgefuehrt ?
    rprintf("Interrupt-Handler called\r\n");

Die Details bzgl. der I2C-Calls stehen in der main().

Danke schon mal !

Gruss Martin
Angehängte Dateien:

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.