ElprojY/KMM 1/2 föreläsningar Enchipsdatorn AVR Prestanda Utvecklingsmiljö I/O. Kommunikation Sensorer Lite reglerteknik Beagleboard www.atmel.com www.avrfreaks.net 1
Enchipsdator = allt på ett chip, CPU, RAM, ROM, I/O (parallell, seriell, A/D, timer/counter, PWM, I2C, SPI,...) 8 8 8 8 clk rst irq I/O A I/O B I/O C Flash Prog CPU RAM Data I/O D EE Data AVR-familjen. 8-bits RISC-dator + I/O 2
ATmega1284 <-> ATmega16<-> ATmega168 Egenskap 1284 16 168 Instruktioner Register Flash (program,konstanter) EEPROM (konstanter) 131 kraftfulla! 32 generella 8-bits 128 kb 16 kb 16 kb 4 kb 512 B 512 B SRAM (variabler) 16 kb 1 kb 1 kb I/O (pinnar) 32 (40) 32 (40) 23 (28) Avbrott (antal) 36 20 26 I 2 C 1 1 1 SPI 3 1 1 UART 2 1 1 8-bit timers 2 2 2 16-bit timers 2 1 1 PWM (kanaler) 6 4 6 A/D (kanaler) 8 8 6 klocka 0-20 MHz 0-16 MHz 0-20 MHz 168 1284, 16 3
Principschema 2-stegs pipeline clk rst Motor, Servo, Sensor, Bluetooth,... 4
Hur fort går det? Med 20 MHz klocka gör AVR 20 MIPS (miljoner instruktioner per sekund) Hämta 1 Hämta 2 add brpl xxx yyy Verkställ 1 Verkställ 2 add brpl nop yyy 20000 instruktioner per millisekund! OBS, en CPLD på samma frekvens är klart snabbare! processor sekvensnät 20 MHz 20 MHz 5
Data space Programmerarmodell Program space 32 64 8k 1024 8 16
Några instruktioner 1) Add without carry add r1,r2 ; r1 += r2 2) Load an I/O location to a register och tvärtom in r29,$3d ; r29 = IO($3D) out $3D,r29 ; IO($3D) = r29 7
Några instruktioner 3) Load indirect from Data Space using X och tvärtom ld r0,x+ ; r0 = D(R26&R27), (R26&R27)++ st X+,r0 ; D(X) = r0, X++ 4) Load from program memory lpm r16,z ; load a constant ; r16 = P(Z) 8
Stora AVR-en har 4 portar (A,B,C,D) à 8 bitar. Varje port kan vara en parallellport eller något annat. Till porten hör ett antal I/O-register. 9
Ett litet exempel sidan 51 i manualen! r0 r1 ddrb portb PB0 PB1 PB2 PB3 bar LED r31 pinb PB4 PB5 PB6 PB7 DIP switch 8 10
En pinne/bit i port B Här är pinnen! DDRBn PORTBn PINBn Alltså * 3 register * skriv till PORT * läs från PIN 11
Vanlig digital in/ut-matning - asm.include "m16def.inc".org 0 ; Skriv 00001111 i datariktningsregistret ldi r17,(1<<ddb3) (1<<DDB2) (1<<DDB1) (1<<DDB0) out DDRB,r17 TILLBAKA: ; Läs av pinnarna in r16,pinb ; kolla tryckknappar 7,6,5,4... ; Skriv nåt på LEDarna ; skifta ner r16 fyra gånger out PORTB,r16 jmp TILLBAKA 12
Vanlig digital in/ut-matning - C #include <avr/io.h> int main(void) { uint8_t i;... /* Define directions for port pins */ DDRB = (1<<DDB3) (1<<DDB2) (1<<DDB1) (1<<DDB0); } while (1) { /* Läs av DIP-switchen */ i = PINB; /* kolla tryckknappar */... /* Gör nåt på LEDarna */ PORTB = i>>4; } Kommentar: 1) I/O-programmering likadan som i asm! 2) Nytt är variabeln i. Var bor den? Hur stor är den? 13
Olle: asm <-> C Manualen har exempel för båda CPU registren r0-r31 försvinner I/O-programmeringen likadan. 64 I/O-register Tidskritisk kod? Mer känsla för maskinen? Det går att blanda. Struktur, if-satser, forloopar..., datatyper... Kompilatorn fixar start-up module Kompilatorn fixar 14 kod för avbrottsrutiner
Utvecklingsmiljö för Atmel Windows Atmel Studio (asm, avr-gcc) JTAG-kabel USB-kabel I labbet: Med ICE, exekvering i AVR 1) Upload + Programmering 2) Läsa/skriva register (vrida på huvudet...) 3) Singlesteppa 4) Köra med brytpunkt adress/data Hemma: Utan ICE, simulering i PCn 1) Läsa/skriva register 2) Singlesteppa 3) Köra med brytpunkt program/data 4) Stimuli (mata in 0/1 på pinnarna) 15
Anders Jr använder JTAG ICE! (in circuit emulator) 16
17
18
Hur kommunicerar processorerna med varandra och med omvärlden? servon Modul 1 Atmel sensorer Modul 2 Atmel Modul 3 Atmel 19
Kommunikation: UART (universal asynchronous receiver/transmitter) startbit 1 stoppbit AVR1 udr ucsra ucsrc ubrrh ubrrl 0,+5V Niklas kabel +12,-12V COM1 Bluetooth pinne teraterm USB (COM4) AVR2 udr ucsra ucsrc ubrrh ubrrl Bluetooth modul Cable replacement, 38400
2) Parallellport data handskakning + enkelt - många pinnar - dubbelriktad? 21
3) I 2 C Two wire interface Inter-integrated-circuit Enkel 2-trådsbuss (+ jord) AVR kan vara Master/Slave AVR kan vara Sändare/Mottagare 7-bits adress => 128 slavar Multimaster arbitration supported Upp till 400 khz IRQ0 IRQ1 master master master master slave slave Svårt men fränt! Gör hellre så här! 22
3) I 2 C Two wire interface Inter-integrated-circuit master slave slave AVR1 AVR2 AVR2 bit rate control status data slave address TWBR TWCR TWSR TWDR TWAR TWBR TWCR TWSR TWDR TWAR TWBR TWCR TWSR TWDR TWAR + 10 kohm 23 SDA SCL
4) SPI f max = 8/4 MHz 24
Sensor 1: IR-avståndsmätare spänning Less influence on the color of reflected objects, reflectivity Analog voltage corresponding to distance Detecting distance of 4 to 30 cm resp 20 till 150 cm External control circuit unnecessary Low cost 25 avstånd
Sensordata Ett exempel ur verkligheten: IR-avståndsmätare ger 10 mätvärden/s i form av analog spänning 0- >5V. Vi kopplar den direkt till en AVR, som har A/D-omvandlare. 1024 0 0,1 0,2 0,3 t [s] Vid närmare studium av sensordatas kvalitet på oscilloskop upptäcks en störning mellan mätvärdena! Vi har tidigare valt DT = 0,05 s. Vi föreslår detta filter: x f [n] = min(x[n], x[n-1]) 26
Linjesensor Vårt sensorpaket, 10 sensorer (LED + fototransistor), Läses av med A/D Varje sensor kontrollerad ljust = 0, mörkt 1023 En bit tejp, Ojämn, varierande belysning 27
Sensor 2: Tejpsensorn mäter tejpens läge +5 analog spänning [0,5] V R1 R2 IR-lysdiod 28
Att mäta analog spänning: A/D-omvandling +5 R1 R2 omvandlare analog mux Värde 10 bitar Kontroll/Status 8 kanaler 0->5 V => 0->1023 start, färdig 29
Sensordata -5-3 -1 1 3 5 k Enkel tyngdpunktsberäkning: Hur ser e[n] utefter denna operation? 1) 2) e [ n] = m[ k] r[ k] m[ k] k k Brus eller vingel? Tidsskala! 30
Lite reglerteknik Hur gör man egentligen för att 1) gå mitt i en korridor? 2) följa en linje? trots att 1) 4-beningen haltar lite grann 2) linjen böjer av 3) golvet lutar lägessensor styrdon 31
Lite reglerteknik Vi måste konstruera en enkel linjär tidsdiskret regulator. 1) Vi bestämmer oss för ett lämpligt T, dvs tiden mellan två sensoravläsningar. 2) För roboten i korridoren bildar vi felet e[n] = x v [n] x h [n] För linjeföljaren får vi felet direkt ur sensorn. 3) En regulator bildar en lämpligt styrsignal u[n] mha av felet e[n]. felsignal e[n] Regulator styrsignal u[n] Vi antar att u[n] = 0 rakt fram u[n] > 0 sväng höger u[n] < 0 sväng vänster och att e[n] = 0 mitt på linjen e[n] > 0 vänster om linjen 32 e[n] < 0 höger om linjen
Lite reglerteknik Enklaste regulatorn: P-reglering u[n] = K P *e[n] Rattutslaget proportionellt mot felet 33
Lite reglerteknik Näst enklaste regulatorn: PD-reglering u[n] = K P *e[n] + K D *(e[n] e[n-1]) Alla bilarna har samma e[n] => samma positiva P-del 1) Neg D-del => minskat rattutslag 2) Pos D-del => ökat rattutslag 3) Mycket neg D-del => styr åt andra hållet 2 1 I-del behövs ej, kvarstående reglerfel finns ej här! 34
Lite reglerteknik OBS: 1) Det är viktigt att känna till T. PD-formeln ska ju egentligen se ut så här: u[ n] = = K K P P e[ n] + K e[ n] + D K D T e[ n] e[ n 1] T ( e[ n] e[ n 1]) Var försiktig med talområdet! Använd C, int u,e, ; Det är ju felhastigheten vi ska reagera på!!! Styregenskaperna ska inte ändras om T ändras! Variant: om vinkeln kan mätas u[ n] = K P e[ n] + K2 φ 35
Telemetri Linjeföljaren easy var först med 1) PD-reglering 2) Telemetri: sensorvärden och styrsignaler skickades till PC med BT 3) Reglerparametrar skickades från PC till easy fel styr easy tx rx Tooth Brush USB BT 36
trigger 1 Sensor 3: Ultraljud out 1 Voltage Frequency Max Range 5v 40KHz 3 m Min Range Sensitivity Input Trigger Echo Pulse 3 cm Detect a 3cm diameter stick at > 2 m 10uS Min. TTL level pulse Positive TTL level signal, width proportional to range. 37
Sensor 4: Piezoelektriskt gyro Φ = vinkelhastighet 38
Att mäta tid AVR har 3 timer/counters. Detta är timer/counter1. Simplified block diagram! 16-bits räknare jämförelseregister tidregister kontrollregister 39
Att mäta tid Polling 1) Vänta på att pinnen går hög 2) Läs av räknaren TCNT1 3) Vänta på att pinnen går låg 4) Läs av räknaren TCNT1 5) Subtrahera Avbrott 1) Sätt upp ICR1 för att ta en timestamp på positiv flank på pinnen I avbrottsrutinen Läs av ICR1, lägg i en variabel och ställ om polariteten på flanken Variabeln innehåller avståndet! 40
Utskrift. Välj själv. Subrutin: 1) Hämta tecken 2) Skriv till UART 3) Vänta på UART complete 2 clocks 1389 clocks vid 115200 4) ret Avbrottsrutin ( 1) Hämta tecken 2) Skriv till UART 3) rti UART complete) 2 clocks
Avbrottskällor i ATmega16 Vanlig avbrottsingång Vanlig avbrottsingång 42
Avbrott i AVR mega 16.org 0x0 ; hopptabell jmp RESET ; jmp EXT_INT0 ; yttre avbrott.org 0x1c jmp ADC ; A/D omvandlaren klar RESET: jmp RESET EXT_INT0: reti ; här börjar ; mitt huvudprogram ; yttre avbrott 1) En händelse sätter en 2) Om avbrottet är aktiverat så fås hopp till avbrottsrutin 3) Spara undan SREG Ta ner Betjäning Ta tillbaka SREG reti ADC: reti ; A/D-omvandlaren ; klar 43
Ännu ett exempel Styrning av servon, som reagerar på pulsbredd. 1-2 ms Kommandon * sväng x vänster * I 2 C Superstressad AVR? 8 st 20 ms 44
Pulsbreddsmodulering (PWM) - D/A-omvandling avbrott period komp räknare komp S R T ex motor Duty cycle Kontrollera om motorn/servot reagerar på pulskvot eller pulsbredd! 45
De flesta servon reagerar på pulsbredd 1-2 ms 1-2 ms 20 ms PWM 46
Avbrottstyrd servostyrning PWM-avbrott 2.5 ms = 50000 instruktioner! t : hämta styrsignal[n] : ställ om PWM och demux[n] Enkelt att kombinera med regleralgoritm, uppdatera styrsignal var 8:e gång 47
RFID Tags Sensor 5: RFID RFID Card Reader RS232 2400 48
Sensor 6: Färgsensor + - 3 x A/D 49
Sensor 7: 3-axlig accelerometer 50
Sensor 8: Angular rate sensor
Beagleboard
Beagleboard Super-scalar ARM Cortex TM -A8 512-MB LPDDR RAM High-speed USB 2.0 OTG port optionally powers the board On-board four-port high-speed USB 2.0 hub with 10/100 Ethernet DVI-D (digital computer monitors and HDTVs) S-video (TV out) Stereo audio out/in High-capacity microsd slot and 4-GB microsd card JTAG Camera port
pdf finns, 3500 sidor! Processorn
Beagleboard Mjukvara. Vid reset händer detta: 1) TI X-loader startar. Den hämtar från en partition på SD-kortet: 2) U-boot. Om man hinner trycka på en tangent stannar man kvar där, annars startar: 3) Ångström, en Linux-distribution, som hämtas från en annan partition på SD-kortet.
Beagleboard Själv installerade jag Ubuntu på ett 16 GB-kort jag aptade in det mesta => 1,8 GB ssh, emacs, X, gcc (native compiler!)
Programexempel /* gcc lpthread threads.c o threads */ #include <pthread.h> #include <stdio.h> #define NUM_THREADS 5 void *PrintHello(void *threadid) { int tid; tid = (int)threadid; printf("hello World! It's me, thread #%d!\n", tid); pthread_exit(null); } int main (int argc, char *argv[]) { pthread_t threads[num_threads]; int rc, t; for(t=0; t<num_threads; t++){ printf("in main: creating thread %d\n", t); rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t); if (rc){ printf("error; return code from pthread_create() is %d\n", rc); exit(-1); } } pthread_exit(null); }
Kopplingsförslag 1 Eth Wi Fi USB USB BT styr mät RS232 AVR1 AVR2 AVR3 I2C styr mät
Kopplingsförslag 2 Eth Wi Fi USB USB BT USB ser RS232 USB ser styr mät AVR1 AVR2 AVR3 Tröghetsnavigering styr mät styr mät