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
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
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?
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
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 =(
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.