Eigene Sensoren entwickeln

Zusätzliche Informationen und Messwerte auf dem Display darstellen? Die I²C-Schnittstelle der Wetterstation macht dies möglich. Der nachfolgende Artikel zeigt wie das geht. Es ist eine Einführung in die Entwicklung eigener Sensoren für die Wetterstation. Als externer Controller kommt ein Atmel ATtiny13a zum Einsatz.
Externer I²C-Sensor an der Wetterstation
Schnittstelle für externe Sensoren
Zur Erweiterung stellt die Firmware eine einfache und zugleich flexible Schnittstelle zur Verfügung. Auf Basis des I²C-Protokolls können Sensordaten zur Wetterstation übertragen und visualisiert werden. Dazu wird in den binären Einstellungen (Register 0x00) das Bit für den I²C-Sensor auf "1" gesetzt. Mit jedem Messintervall wird nun auch der externe Sensor abgefragt.
Konzept und Anschlussbelegung
Die Datenerfassung übernimmt dabei ein zusätzlicher Mikrocontroller. Dieser bereitet die Daten zur Anzeige grafisch auf und übergibt diese auf Anfrage der Wetterstation. Der externe Mikrocontroller verhält sich dabei wie ein I²C-Slave der Bilddaten bereithält. Die Leseadresse des Sensors ist 0x81.
Aufbau Telegramm
Das Erweiterungskonzept basiert auf dem Befehlssatz des internen Displaycontroller (ST7565). Ein spezielles Protokoll leitet empfangene Daten und Kommandos direkt an das Display weiter.
Aufbau eines Datenpakets
Das erste Byte gibt die Anzahl der Pakete an. Der Aufbau der nachfolgenden Datenpakete ist immer gleich. Am Anfang stehen 3 Displaykommandos. Damit lässt sich der Ramzeiger positionieren. Im folgenden Byte steht die Anzahl der nachfolgenden Daten (Bildinformationen).
Beispielanwendung
Zum Einstieg sollen zwei zusätzliche Informationen (ein Smiley sowie ein veränderlicher Wert als Bytemuster) auf das Display gebracht werden. Die Nachfolgende Abbildung zeigt die neuen Informationen auf dem Display (oben links).
Zusatzinformationen auf dem Display
Die Beispielanwendung ist mit BASCOM entwickelt. Der I²C-Slave selbst ist in Assembler implementiert.
'I2C Test-Sensor Franzis Wetterstation

$regfile = "ATtiny13.dat"
$hwstack = 16
$swstack = 0
$framesize = 24

Const Scl = 3
Const Sda = 4
Const Ack = 4

Dim Message(20) As Byte
Dim Value As Byte

Do

   Message(1) = &H02                                        'Anzahl Datenpakete

   Message(2) = &HB2                                        'Page 2
   Message(3) = &H10                                        'Column 5 (high 0)
   Message(4) = &H05                                        'Column 5 (low 0)
   Message(5) = &H05                                        'Anzahl Bytes = 5
   Message(6) = Lookup(0 , Smiley)                          'Daten
   Message(7) = Lookup(1 , Smiley)
   Message(8) = Lookup(2 , Smiley)
   Message(9) = Lookup(3 , Smiley)
   Message(10) = Lookup(4 , Smiley)

   Message(11) = &HB2                                       'Page 2
   Message(12) = &H10                                       'Column 12 (high 0)
   Message(13) = &H0C                                       'Column 12 (high C)
   Message(14) = &H01                                       'Anzahl Bytes = 1
   Message(15) = Value                                      'Daten

   Value = Value + 1                                        'Value hochzählen

   I2c_get:
      Loadadr Message(1) , Z
      cbi PORTB, SDA
      cbi PORTB, SCL
      cbi DDRB, SDA
      cbi DDRB, SCL
      ldi r16, &b10000001
      mov r0, r16

      sbis pinb,scl
      rjmp i2c_get
      sbis pinb,sda
      rjmp i2c_get
   I2c_wait_for_start:
      sbis pinb,scl
      rjmp i2c_get
      sbic pinb,sda
      rjmp i2c_wait_for_start
   I2c_get_0:
   I2c_get_1:

   I2c_10:
      sbic pinb,scl
      rjmp i2c_10
      ldi r22,8
      mov r23, r0

   I2c_11:
      sbis pinb,scl
      rjmp i2c_11
      sbic pinb,sda
      rjmp i2c_13
   I2c_12:
      sbic pinb,sda
      rjmp i2c_wait_for_start
      sbic pinb,scl
      rjmp i2c_12
      clc
      rjmp i2c_15
   I2c_13:
      sbis pinb,sda
      rjmp i2c_get_1
      sbic pinb,scl
      rjmp i2c_13
      sec
   I2c_15:
      rol r24
      dec r22
      brne i2c_11

   I2c_ack_1:
      sbi ddrb,ack
   I2c_ack_10:
      sbis pinb,scl
      rjmp i2c_ack_10
   I2c_ack_11:
      sbic pinb,scl
      rjmp i2c_ack_11
      cbi ddrb,ack
      cpi r24, &H81
      brne I2c_wait_for_start_stop

   I2c_send_1:
      sbi ddrb,scl
      ldi r22,8
      ld  r24, Z+
      sbi ddrb,sda
   I2c_s1:
      sbrc r24,7
      sbi portb,sda
      sbrs r24,7
      cbi portb,sda
      cbi ddrb,scl
   I2c_s2:
      sbis pinb,scl
      rjmp i2c_s2
   I2c_s3:
      sbic pinb,scl
      rjmp i2c_s3
      rol r24
      dec r22
      brne i2c_s1
      cbi ddrb,sda

   I2c_ack_2:
      cbi ddrb, ack
   I2c_ack_20:
      sbis pinb,scl
      rjmp i2c_ack_20

   I2c_ack_21:
      sbis pinb, sda
      rjmp master_send_ack
      sbic pinb,scl
      rjmp i2c_ack_21
      cbi ddrb,ack
      rjmp I2c_wait_for_start_stop

   Master_send_ack:
      sbic pinb,scl
      rjmp master_send_ack
      cbi ddrb,ack
      rjmp I2c_send_1

   I2c_wait_for_start_stop:
      Loadadr Message(1) , Z

   I2c_ss_1:
      sbis pinb,scl
      rjmp i2c_ss_1
      sbic pinb,sda
      rjmp i2c_ss_3
   I2c_ss_2:
      sbic pinb,sda
      rjmp i2c_stop
      sbic pinb,scl
      rjmp i2c_ss_2
      rjmp i2c_ss_1
   I2c_ss_3:
      sbis pinb,sda
      rjmp i2c_get_1
      sbic pinb,scl
      rjmp i2c_ss_3
      rjmp i2c_ss_1

   I2c_stop:
   I2c_exit:

Loop
End

Smiley:
Data &H36 , &H66 , &H60 , &H66 , &H36,
Die Anwendung legt ein Telegramm (Message) im SRAM an. Der genaue Aufbau ist im Quellcode als Kommentar hinterlegt. Danach wird Value um eins erhöht. Der nachfolgende Assemblercode stellt einen Software-I2C-Slave bereit. Dieser liefert die Daten an den Master (Wetterstation) nach Anfrage aus. Danach beginnt die Schleife von vorne mit einem weiteren Aufbau des Telegramms.
Controller programmieren
Der Mikrocontroller (Tiny13) kann mit dem im Lernpaket enthaltenen ISP-Programmer beschrieben werden. Ich habe dazu einfache Steckbrettkabel verwendet. Diese ergeben eine saubere Verbindung am ISP-Programmer.
Belegung ISP-Programmer
Für die Programmierung muss der AVR (Mikrocontroller) natürlich richtig verbunden sein. Die Anschlussbelegung bitte den beiden Abbildungen entnehmen. Die Programmierspannung kann auf 3V eingestellt bleiben (Jumper).
ATtiny13a am ISP-Programmer
Zur Übertragung in BASCOM muss lediglich in den Einstellungen der Chip auf den ATtiny13a geändert werden. Sonst gestaltet sich der Upload wie von den Anwendungen für die Wetterstation gewohnt. Viel Spaß beim ausprobieren. Und viel Erfolg bei der Entwicklung eigener Sensoren.
Download und Links: