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.
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.
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.
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).
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.
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).
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: