Forum: Mikrocontroller und Digitale Elektronik I2C mit Interrupt als Slave


von Lisa (Gast)


Angehängte Dateien:

Lesenswert?

Hallo an alle

bin gerade dabei, eine I2C-KommunikationInterrupt-gesteuert zu 
programmieren. Der Master funktioniert auch, nur der Slave will nicht so 
ganz.
Ich möchte ihn mit I2C-Tools testen. Dort kann ich einstellen, ob der 
Slave senden oder empfangen soll und welche Adresse er hat. Leider will 
mein Slave noch nich einmal eine Start Condition empfangen.
Hat jemand ein Tipp an was das liegt?
Oder kennt jemand ein gutes Beispiel, bei dem sich Anfänger auch zurecht 
finden?

Danke schon mal im Voraus

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

also was mir zunächst auffällt, das ...
1
  if (master == 1)
2
  {
3
    if (transmit == 1)
4
    {
5
      sendeDaten_Master(0x00);
6
    }
7
    else
8
    {
9
      empfangeDaten_Master();
10
    }
11
  }
12
  else if (master == 0)
13
  {
14
    //Slave-Adresse in Address-Register
15
    TWAR = SLA;
16
    TWCR = (1<<TWEA)|(1<<TWEN)|(1<<TWIE);
17
18
    
19
  }
wird genau 1x beim Start durchlaufen, denn danach kommt die 
Endlosschleife

in deiner ISR sehe ich mehrere cli's, aber wo wird der Interrupt 
anschließend wieder frei gegeben?

Sascha

von Lisa (Gast)


Lesenswert?

Bisher habe ich es so gelöst, dass man nur 1 x 1 Byte senden / empfangen 
kann, da es hier erst mal eine Übung ist. die cli´s werden nur im 
Fehlerfall aufgerufen, d.h. wenn ein NACK erhalten wird, da ich nicht 
weiß, wie ich eine Fehlermeldung ausgeben soll.

Ich möchte ja von meinem I2C-Tools eine StartCondition senden, meinen 
Controller als Slave auswählen und ihm 1 Byte senden, bzw später auch 1 
Byte von ihm empfangen.
Leider springt das Programm gar nicht in die ISR um Daten zu senden / 
empfangen.
Habe ich etwas vor der Kommunikation nicht beachtet?

von Sascha W. (sascha-w)


Lesenswert?

sendest du von deinem Master mit SLA=0x00? Wenn der Slave auf jede 
Adresse regieren soll, dann muss bit0 in TWAR gesetzt sein! Pobier 
lieber erst mal mit einer festen Adresse, 0x00 ist immer ein Sonderfall.

PS: hättest mal noch deinen Controllertyp nennen können

Sascha

von Lisa (Gast)


Lesenswert?

ok also ich hab die Slave Adresse nun auf 7E geändert, also 01111110

Der Controller ist ein AT MEGA 164 PA
sorry, das hab ich wohl vergessen =(

von Sascha W. (sascha-w)


Lesenswert?

die I2C-Init ist auf alle Fälle noch falsch:

;TWI >EIN  ;ACK >EIN  ;INT >EIN
1
TWCR=(1<<TWEA) | (1<<TWEN) | (1<<TWIE)

so sollte die ISR erst mal angesprungen werden, und vom Slave die 
Adresse mit einem ACK bestätigt werden.


Sascha

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.