mikrocontroller.net

Forum: Compiler & IDEs TWI Slave reagiert nicht im Interruptmodus


Autor: Sebastian Prets (Firma: IPF) (freeclimber)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich sitzte schon einige Tage an einem TWI Problem. Mein Slave reagiert 
einfach nicht. Ich habe mitlerweile das ganze Forum durchforstet, aber 
keine lösung gefunden.

Im Anhang ist mein Master und Slave Programm, wäre schön wenn sich dies 
mal ein Profi dursieht und mir gegebefals weiterhelfen kann.

mfg

freeclimber

Autor: Jörg G. (joergderxte)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wahrscheinlich bekommst du mehr Hilfe, wenn du den Code lesbar 
gestaltest:
- festes Einrückschema
- korrekte Kommentare
- keine Hex-zahlen bei den Registern (sondern (1<<BIT_NAME))

Und beschreib mal was der Code machen soll - ich kann das so nicht 
erkennen.

hth, Jörg

Autor: Sebastian Prets (Firma: IPF) (freeclimber)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Prgramm Beschreibung:

Soll eine einfache I²C routine darstellen

Master: Empfängt über den USART eine '1' oder eine '2' und springt dann
in das I²C transmitter unterprogramm um an den Slave eine 0x01=1 oder
0x02=2 zu senden.

Dieser Teil sollte eigentlich funktionieren.

Slave:Soll nun über den Interruptmodus diese 0x01 oder 0x02 empfangen
und dann eine routine ausführen. Leider reagiert der Slave überhaupt
nicht. Es kommt kein Interrupt zu stande, zumindestens sender er kein 
ACK zum Master zurück.

mfg

Autor: Jörg G. (joergderxte)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich blick bei deiner Zustandsmaschine nicht durch, was mir aber auffällt 
ist
//PULL-UP von SCL und SDA
DDRC &= ~((1<<0x01)|(1<<0x02));
PORTC |= (1<<0x01)|(1<<0x02);
Das ist a) falsch (du willst "(1<<PC0)|(1<<PC1)"), b) unnötig - die 
internen Pull-ups (20kOhm-50k) sind sowieso  für I2C zu Groß.

Und für deine Statuswerte bietet sich eine enum an:
enum twi_slave_status { WAITING, GOT_1, GOT_2, WAITING_FOR_STOP};
oder so ähnlich.

Autor: Sebastian Prets (Firma: IPF) (freeclimber)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Besitzt du eine einfache slave routine in c für mich. Der slave soll nur 
vom Master im Interruptmodus Daten empfangen. Das würde mir schon sehr 
weiter helfen. Ihr im forum sind nur so überdimensionierte Programme.

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.