Hallo ich habe ein Problem mit meinem ATMega 128. Ich arbeite mit BASCOM und über eine I2C Kommunikation. Eigentlich will ich eine ganz simple Sache realisieren. Master sendet, slave empfängt. Ich möchte das Statusregister (TWSR) des Masters abfragen, ob sich nach dem schicken der Adresse ein Slave gemeldet hat. Wenn ja sollte laut Datenblatt im TWSR der Wert hex18 stehen. Sollte kein Slave ein ACK zurück gesendet haben, müsste der Wert hex20 darin stehen. Nun ist die Frage, wie ich am Master das TWSR nach jedem Vorgang überprüfen kann. I2Cstart 'TWSR überprüfen I2Cwbyte Slave_Adresse 'TWSR überprüfen I2Cwbyte Daten 'TWSR überprüfen I2Cstop Beim Slave überprüfe ich das TWSR, in dem ich in einer Interrupt Service Routine den Wert prüfe. Nach jedem Schritt bekommt der Slave ja diesen Interrupt. (Interner TWI Interrupt) On Twi Slave_ISR Enable TWI Enable Interrupts Nur beim Master scheint kein Interrupt zu kommen. Dort habe ich On Twi Master_ISR Enable TWI Enable Interrupts geschrieben und in Master_ISR: frage ich das TWSR ab. Darauf reagiert er aber gar nicht. Kann mir da jemand erklären, wie ich im Master ans TWSR komme und auf den Inhalt reagieren kann? MfG Ninnik
Schade, nach 10 Jahren noch keine Erkenntnisse. Dabei hätte mich die Lösung dieser Frage auch brennend interessiert.
Gerhard schrieb: > Lösung dieser Frage auch brennend interessiert. M. Alberts anschreiben. Oder im Basisforum schreiben. Oder ein paar Zeilen Assemblercode einbetten.
Das Problem ist der Slave. Ich habe dafür keinen Bedarf, habe aber aus aktuellen Gründen tiefer in I2C mit Bascom geschaut. I2C-Slave mit Bascom https://avrhelp.mcselec.com/index.html?i2ctwislave.htm Dafür gibt es zwei Libs: i2cslave.lib und i2cslave.lbx. Die muss man, wenn man es haben will, bei Mark käuflich erwerben. ;-) cu
Sehe gerade, es dreht sich um den Master.
1 | '***************************************************************************** |
2 | Sub I2c_scan |
3 | Local Slaveadresse As Byte |
4 | Print "Start I2C Slaves suchen..." |
5 | 'Wait 1 |
6 | For Slaveadresse = 0 To 254 Step 2 ' f³r alle geraden Adressen |
7 | I2cstart ' Startbedingung senden |
8 | I2cwbyte Slaveadresse ' Addresse senden |
9 | If Err = 0 Then |
10 | Print "Slave dec: " ; Slaveadresse ; " h" ; Hex(slaveadresse) ; " b" ; Bin(slaveadresse) |
11 | 'Wait 1 |
12 | End If |
13 | I2cstop 'Bus freigeben |
14 | Next |
15 | Print "Ende Scan" |
16 | 'Wait 1 |
17 | End Sub |
"If Err = 0 Then" das ist entscheidend. Muss aber direkt nach dem schreiben abgefragt und ausgewertet werden ( Systemvariable!) cu
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.