Ein I2C-Scanner

von Michael Moske

Elektronik-Labor  Projekte  Mikrocontroller  TLScript  




Download: I2C_Scanner.tls

Kann man mit TLScipt eine I2C-Verbindung aufbauen? Das Fernziel könnte sein, ein OLED anzusprechen, und es gibt ja eine Unmenge anderer ICs, für die sich das lohnen würde. Für den Anfang reicht es, am Bus angeschlossene ICs und ihre Adressen zu finden. Fast alle wesentlichen Funktionen am I2C-Bus sind dafür schon nötig. Für den Bus braucht man zwei Leitungen, die abwechselnd als Eingänge und als Ausgänge arbeiten müssen. Hier wurde D1 als Datenleitung SDA und D2 als Taktleitung SCL festgelegt.


Das Programm I2C_Scanner.tls wird geladen und gestartet. Und siehe da, die I2C-Adresse 60 (0x3C) des OLED-Displays wird gefunden und ausgegeben. Wer die I2C-Grundfunktionen kennt, wird sich schnell im Quelltext zurechtfinden. Das Entscheidende zur Kommunikation mit dem Display ist das I2C-Protokoll. Im Programm kann die Steuerung der SDA und SCL Leitungen Bit für Bit nachvollzogen werden, wobei die 4 möglichen Zustände von High/Low-Kombinationen für Start, Datenbit, Acknowledge und Stop genutzt werden.


              Rem ************
              Rem I2C Scanner
              Rem ************
              Rem
              Rem ************
              Rem Init SDA/SCL
              Rem ************
0x0906  Pdir = 0x06
              Rem
              Rem ************
              Rem Main Loop
              Rem ************
              L1:
0x037F  C = 0x7f
              L2:
0x2128  Call L110:
0x3700  A = C
0x3100  A = A Shl 1
0x2131  Call L112:
0x0200  B = 0
0x220A  If A=B Jmp L3:
0x212D  Call L111:
0x2502  C*Jmp L2:
              L3:
0x212D  Call L111:
0x3700  A = C
0x4200  Print A
0x1A01  Delay s = 1
0x2001  Jmp L1:
              Rem ************
              Rem End of Loop
              Rem ************
              Rem
              Rem ************
              Rem Set_SDA
              Rem ************
              L100:
0x3F00  A = Pin
0x1302  A = A OR 0x02
0x4500  Pout = A
              Rem PC1 = 1
0x4800  Ret
              Rem ************
              Rem Reset_SDA
              Rem ************
              L101:
0x3F00  A = Pin
0x12FD  A = A AND 0xfd
0x4500  Pout = A
              Rem PC1 = 0
0x4800  Ret
              Rem ************
              Rem Read_SDA
              Rem ************
              L102:
0x3F00  A = Pin
0x1202  A = A AND 0x02
0x3200  A = A Shr 1
0x4800  Ret
              Rem ************
              Rem Set_SCL
              Rem ************
              L103:
0x3F00  A = Pin
0x1304  A = A OR 0x04
0x4500  Pout = A
              Rem PC2 = 1
0x4800  Ret
              Rem ************
              Rem Reset_SCL
              Rem ************
              L104:
0x3F00  A = Pin
0x12FB  A = A AND 0xfb
0x4500  Pout = A
              Rem PC2 = 0
0x4800  Ret
              Rem ************
              Rem Read_SCL
              Rem ************
              L105:
0x3F00  A = Pin
0x1204  A = A AND 0x04
0x3200  A = A Shr 1
0x3200  A = A Shr 1
0x4800  Ret
              Rem ************
              Rem Start
              Rem ************
              L110:
0x210F  Call L100:
0x211B  Call L103:
0x2113  Call L101:
0x211F  Call L104:
0x4800  Ret
              Rem ************
              Rem Stop
              Rem ************
              L111:
0x2113  Call L101:
0x211B  Call L103:
0x210F  Call L100:
0x4800  Ret
              Rem ************
              Rem Write byte
              Rem ************
              L112:
              Rem Save byte
0x0201  B = 1
0x3B00  [B+] = A
0x0407  D = 0x07
              Rem TX Loop
              L113:
0x0201  B = 1
0x3A00  A = [B+]
              Rem Check bit 7
0x1280  A = A AND 0x80
0x0200  B = 0
0x223B  If A=B Jmp L114:
              Rem Bit found
0x210F  Call L100:
0x203C  Jmp L115:
              L114:
              Rem Bit not found
0x2113  Call L101:
              L115:
              Rem Reload byte
0x0201  B = 1
0x3A00  A = [B+]
0x3100  A = A Shl 1
              Rem Save shifted byte
0x0201  B = 1
0x3B00  [B+] = A
0x211B  Call L103:
0x211F  Call L104:
0x2634  D*Jmp L113:
              Rem Byte was sent
0x210F  Call L100:
0x211B  Call L103:
              Rem Read ACK
0x2117  Call L102:
0x3800  D = A
0x211F  Call L104:
0x3900  A = D
              Rem Return ACK
0x4800  Ret



Elektronik-Labor  Projekte  Mikrocontroller  TLScript