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: