Software ubiquitärer Systeme 2. Übung Constantin Timm Arbeitsgruppe Entwurfsautomatisierung für Eingebettete Systeme Lehrstuhl für Informatik 12 TU Dortmund constantin.timm@cs.tu-dortmund.de http://ls12-www.cs.tu-dortmund.de/staff/timm/ http://ess.cs.tu-dortmund.de/de/teaching/ss2009/sus/
Inhalt Einführung BTnodes & Entwicklungswerkzeuge Was ist das? Was kann man damit machen? Einführung BTnodes-Peripherie Wie funktioniert das? Wie kann ich die ansprechen? Tipps für das erste Übungsblatt 2. Übung 2
BTnodes Einführung BTnodes sind Sensorknoten, bestehend aus einem Mikrokontroller, angeschlossen Sensoren und Kommunikationseinheiten gleich mehr demnächst Entwickelt an der ETH Zürich für den Einsatz in Forschungsprojekten und der Lehre Entwicklung eigener Sensornetzwerke soll mit den BTnodes einfach sein 2. Übung 3
Aufbau BTnodes Atmel ATmega128 256 kb SRAM Zahlreiche Möglichkeiten zum Anschluss von Peripherie Extension connectors Zwei Funksysteme - Bluetooth radio (2.4 GHz Zeevo ZV4002) - Low-power radio (Chipcon CC1000) 2. Übung 4
Development Tools Was brauche ich, um einen BTnode zu programmieren? Irgendetwas wie eine Programmiersprache => hier C und C++ Irgendetwas was aus meinem Sourcecode Maschinencode für den ATmega128 macht und womit ich dessen Funktionen nutzen kann. Toolchain: avr-gcc, avr-g++ Compiler, Linker, etc C-Standardbibliothek: avr-libc Verschiedenste Kabel und Geräte Flasher Board USB-Kabel 2. Übung 5
Development Tools Kommandozeile benutzen 2. Übung 6
Development Tools Eclipse Über File->Import-> Existing Projects into Workspace importieren Make Targets 2. Übung 7
Development Tools Aufspielen des Programms auf den BTnode Per USB-Flasher Drücken des Reset-Knopfs Übertragung in den Flash avrdude -pm128 -cstk500 -PCOMPORT -U flash:w:xyz.hex:i 2. Übung 8
Fragen? 2. Übung 9
BTnodes-Peripherie 2. Übung 10
BTnodes: ATmega128 Der in den BTnodes eingebaute ATmega128 hat insgesamt 53 Pins, die man individuell als Eingang oder Ausgang nutzen kann Jeder Port kann man mit den Registern DDRx (Data Direction Register) angesteuert, ausgelesen (PORTx: Data Register) und beschrieben werden (PINx: Port Input Pins) Ports sind memory mapped und in C/C++ über Pointer erreichbar Etliche Hardware-Register sind vorhandenen um zusätzliche Funktionalität an einem Pin zur Verfügung zu stellen Analog-Digital-Konverter Auslösen von Interrupts Verschiedene Bussysteme I²C (bei AVR: TWI) SPI 2. Übung 11
BTnodes : ATmega128 2. Übung 12
BTnodes: IO dieser Übung 2. Übung 13
ADC Einführung 2. Übung 14
BTnodes: ADC Am Port F des ATmega128 hängt ein 10-bit Analog- Digital-Konverter Die verschiedenen Pins sind per Multiplexer an den A/D- Konverter angeschlossen Für uns sind in den Übungen folgende Pins wichtig: PF0: Luftdrucksensor PF2: Signalstärke, die der RF-Chip zur Verfügung stellt 2. Übung 15
BTnodes: ADC Am Port F des ATmega128 hängt ein 10-bit Analog- Digital-Konverter Der A/D-Wandler wird mit drei Registern angesteuert: ADMUX (Muxer-Position) ADCSRA (Control-Register) ADCH/ADCL (Daten-Register) // Einschalten des AD-Konverters im Kontrol-Register ADCSRA = (1<<ADEN); // Kanal = F0 und Referenzspannung = externe Spannung ADMUX = 0; // Einmalige Konvertierung ADCSRA = (1<< ADSC); //Warten bis das Bit nicht mehr gesetzt ist while ((ADCSRA & (1<<ADSC))); // Wert kann aus den Daten-Registern ausgelesen werden unsigned short result = ADCL (ADCH << 8); 2. Übung 16
I2C/TWI Einführung 2. Übung 17
BTnodes: I²C Bus Synchroner und serieller Bus 2 Leitungen SCL (Takt) SDA (Adress- und Datenleitung) 7bit Adressraum, d.h. theoretisch können 128 Geräte miteinander kommunizieren Datentransfer wird immer vom Master initiiert Wird bei Atmel TWI genannt 2. Übung 18
BTnodes: ATmega128 + I²C 2. Übung 19
BTnodes: I²C Übertragung Start Bitübertragung Stopp 2. Übung 20
BTnodes: I²C Register TW(B D S C )R Bit Rate Data Status Control Control TWINT: Interrupt Flag TWEA: Enable Acknowledge Bit TWSTA: Start Sequenz senden TWSTO: Stop Sequenz senden TWWC: Write Collision Flag TWEN: Enable TWIE: Interrupt Anforderung erlauben Status =ˆ TWSx: Status (Obere 5 Bits = Status letzte Aktion) TWPSx: Prescaler 2. Übung 21
BTnodes: I²C initialisieren Es gibt 2 offizielle Bustaktrate beim Atmega128 Standard: 100kHz FastMode: 400kHz Bustaktrate wird über die Register TWBR und TWSR eingestellt. Die Formel zur Berechnung der Bustaktrate lautet: //CPU-Frequenz und Bustaktrate #define F_CPU 7372800UL #define SCL_CLOCK 100000L //Prescaler aus. Dieser befindet sich in den Bits 0 und 1 TWSR = 0; //Bitrate (100 khz) im Bitratenregister setzen. TWBR = ((F_CPU/SCL_CLOCK)-16)/2; 2. Übung 22
BTnodes: I²C - How it works! Wird immer vom Master initiiert Normaler Transmissionsablauf (als Master): Start SLA + R/W (Datenpakete)+ STOP //START // I²C aktivieren mit TWEN, START senden mit TWSTA und TWINT abschalten TWCR = (1<<TWINT) (1<<TWSTA) (1<<TWEN); // Warten bis START gesendet wurde und TWINT wieder gesetzt wird while(!(twcr & (1<<TWINT))); //Man kann abschließend sich noch den Status zurückgeben lassen unsigned char result = TWSR & 0xF8; //SLA + R/W //Addresse plus Read/Write-Bit ins Datenregister schreiben TWDR = address; // I²C aktivieren mit TWEN und TWINT abschalten TWCR = (1<<TWINT) (1<<TWEN); // Warten bis Addressbyte gesendet wurde und TWINT wieder gesetzt wird while(!(twcr & (1<<TWINT))); //Man kann abschließend sich noch den Status zurückgeben lassen unsigned char result = TWSR & 0xF8; 2. Übung 23
BTnodes: I²C - How it works! Normaler Transmissionsablauf: Start SLA + R/W (Datenpakete)+ STOP //WRITE // Datenbyte ins Datenregister schreiben TWDR = data; // I²C aktivieren mit TWEN und TWINT abschalten TWCR = (1<<TWINT) (1<<TWEN); // Warten bis Datenbyte gesendet wurde und TWINT wieder gesetzt wird while(!(twcr & (1<<TWINT))); //Man kann abschließend sich noch den Status zurückgeben lassen unsigned char result = TWSR & 0xF8; //STOP // I²C aktivieren mit TWEN, STOP senden mit TWSTO und TWINT abschalten TWCR = (1<<TWINT) (1<<TWEN) (1<<TWSTO); // Warten bis STOP gesendet wurde und TWINT wieder gesetzt wird while(twcr & (1<< TWSTO)); 2. Übung 24
BTnodes: I²C - How it works! Normaler Transmissionsablauf: Start SLA + R/W (Datenpakete)+ STOP //READ mit ACK (Zur Übertragung mehrerer Bytes) // Übertragung starten TWCR = (1<<TWINT) (1<<TWEN) (1<<TWEA); //Warten bis Übertragung fertig while(!(twcr & (1<<TWINT))); //Ergebnis ist im Datenregister unsigned char result = TWDR; //READ mit NACK (Zur Übertragung eines Byte) // Übertragung starten TWCR = (1<<TWINT) (1<<TWEN); //Warten bis Übertragung fertig while(!(twcr & (1<<TWINT))); //Ergebnis ist im Datenregister unsigned char result = TWDR; 2. Übung 25
BTnodes: Temperatur-Sensor Bekannt aus der Vorlesung Temperatursensor DS1621 am I²C-Bus mit Adresse 000 angebunden 2. Übung 26
BTnodes: Temperatur-Sensor // DS1621 ansprechen twi_start(0x90 + ADDR + 0); // Kommando an den DS1621 schicken twi_write(0xcc); // Repeated Start twi_start(0x90 + ADDR + 1); //Datenbyte auslesen unsigned char result = twi_readnak(); // Bus freigeben twi_stop(); 2. Übung 27
SPI Einführung 2. Übung 28
BTnodes: SPI Einführung Serial Peripheral Interface Einfaches Bussystem zum Ansteuern und Auslesen von Peripherie 1 Adressleitung SS (slave select) 1 Taktleitung SCK (serial clock) 2 Datenleitungen MOSI (master out slave in) MIOS (master in slave out) 2. Übung 29
BTnodes: SPI Einführung Mögliche Slave-Anordnungen Sternförmige Anordnung Sequentielle Anordnung 2. Übung 30
BTnodes: SPI Einführung Ansteuerung über 3 Register SPCR (control register) SPSR (status register) SPDR (data register) 2. Übung 31
BTnodes: SPI Einführung Datenübertragung Beschreibung CPOL CPHA R: low 0 0 D: erste Flanke R: low D: zweite Flanke 0 1 R: high D: erste Flanke 1 0 R: high D: zweite Flanke 1 1 2. Übung 32
BTnodes: SPI Einführung SPI-Geschwindigkeit 2. Übung 33
BTnodes: SPI - How it works! Kommunikation als Master //Ports und Pins initialisieren //SS, SCK und MOSI als Ausgänge DDRB = (1<<DDB0) (1<<DDB1) (1<<DDB2); //MISO als Eingang DDRB &= ~(1<<DDB3); //SPI anschalten und Mastermode aktivieren SPCR = (1<<SPE) (1<<MSTR); //Byte ins Datenregister schreiben SPDR = data; //Warten bis Übertragung abgeschlossen ist while (!(SPSR&(1<< SPIF))); // Empfangenes Byte auslesen unsigned char result = SPDR; 2. Übung 34
BTnodes: SPI - How it works! Kommunikation als Slave //Ports und Pins initialisieren //SS, SCK und MOSI als Eingänge DDRB &= ~((1<<DDB0) (1<<DDB1) (1<<DDB2)); //MISO als Ausgang DDRB = (1<<DDB3); //SPI anschalten SPCR = (1<<SPE); //Byte ins Datenregister schreiben SPDR = data; //Warten bis Masterübertragung gestartet hat und das Byte gelesen hat while (!(SPSR&(1<< SPIF))); // Empfangenes Byte auslesen unsigned char result = SPDR; 2. Übung 35
Weitere Tipps für die Übungen 2. Übung 36
Tipps für die Übungen Die Kommunikation mit der Peripherie kann per polling geschehen, d.h. durch aktive Abfrage: //Kommunikation starten TWCR = (1<<TWINT) (1<<TWEN) (1<<TWEA); //Auf Übertragung der Werte warten while(!(twcr & (1<<TWINT))); //Werte auslesen unsigned char result = TWDR; Interrupt-basierte Kommunikation //Übertragenen Werte soll ausserhalb des ISRs nutzbar sein static volatile unsigned char result; //SIG_2WIRE_SERIAL wurde in TWCR aktiviert ISR(SIG_2WIRE_SERIAL){ //Status-Register auslesen unsigned char twsr = TWSR & 0xF8; switch (twsr) { case TW_MR_DATA_ACK: //Werte auslesen result = TWDR; break; } } 2. Übung 37
Tipps für die Übungen Beim BTnode müssen die Busleitungen vom I²C mit Pull- Up-Widerständen versehen sein Interne Pull-Up-Widerstände vor Gebrauch aktivieren: PORTx = (1 << SDA) (1 << SCL); UART0 ist für USB zuständig Informationen zu den Btnodes findet man auf der Webseite, der ETH Zürich www.btnode.ethz.ch Für den Einstieg in die Btnodes kann man verschiedene Tutorials auf der obigen Webseite herunterladen 2. Übung 38
Referenzen (1) Maxim: DS1621 Digital Thermometer and Thermostat (2) mikrocontroller.net: AVR GCC Tutorial (Programmbeispiele) (3) Jan Beutel, ETH Zurich: Fast-Prototyping of Wireless Sensor Networks Tutorial at ASCI 2008 (4) Jan Beutel, ETH Zurich: BTnode Programming Tutorial (5) Jan Beutel, ETH Zürich: BTnode rev3 Schematic (6) Atmel ATmega128l Processor Manual (7) I2C: http://www.roboternetz.de/wissen/index.php/i2c (8) TWI: http://www.roboternetz.de/wissen/index.php/twi (9) SPI: http://www.mct.de/faq/spi.html (10) SPI: http://www.openavr.org/avr_spi_c_snippets (11) SPI: Silicon Labs C8051F320, C8051F321 Data Sheet 2. Übung 39