Forum: Mikrocontroller und Digitale Elektronik BASCOM - ATMega128 TWSR auswerten (I2C)


von Ninnik (Gast)


Lesenswert?

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

von Gerhard (Gast)


Lesenswert?

Schade, nach 10 Jahren noch keine Erkenntnisse.
Dabei hätte mich die Lösung dieser Frage auch brennend interessiert.

von Ben (Gast)


Lesenswert?

Gerhard schrieb:
> Lösung dieser Frage auch brennend interessiert.

M. Alberts anschreiben. Oder im Basisforum schreiben. Oder ein paar 
Zeilen Assemblercode einbetten.

von nuJa (Gast)


Lesenswert?

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

von nuJa (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.