Na velikosti (ne)záleží aneb Úvod do programování jednočipů Kamil Řezáč © Adastra, 2008
Motivační: Od blikající LEDky k meteostanici
Motivační II: ukázkové projekty měření teploty a tlaku spínaný zdroj pro 3x3W LED emulátor klávesnice deska řízení motorů přes RS-485 ovladač pro časosběrnou fotografii
Který jednočip je nejlepší? 8051? Encore? ARM? AVR? HC68? PIC? Rabbit? Zilog? !! ten, který umím !!
Rodina procesorů Atmel AVR AtTiny pro méně náročné aplikace menší pouzdro (a tedy méně pinů) v závislosti na typu chybí některé funkční bloky (např. UART…) omezené použití vyšších programovacích jazyků (zásobník) Tiny15, Tiny2313 AtMega velký rozsah typů (pouzdra, velikosti paměti) varianty se specializovaným rozhraním (CAN, USB) slušná podpora pro vyšší programovací jazyky podpora ladění přes JTAG (kromě Mega8) Mega8, Mega128
Atmel AVR Mega8: vlastnosti 30Kč oddělená paměť pro kód a data (8kB/4kinstr a 1kB) až 23 využitelných vývodů až 16MHz takt. frekvence vestavěný osc. 1 nebo 8 MHz 3 čítače/časovače EEPROM …. většina instrukcí (kromě skoků) vykonávána v 1 taktu, tedy až 16MIPS
Atmel AVR Mega8: vývody
Programovací jazyky a vývojová prostředí assembler AVR Studio avra C/C++ gcc (port pro Win: WinAVR) + editor/IDE (AVR Studio, notepad, vim, Eclipse) + AVRlib IAR ImageCraft Basic Bascom Pascal, Java, Forth, Ada, teoreticky všechny gcc frontendy…
Kontrola chování procesoru - registry chod procesoru lze řídit prostřednictvím kontrolních registrů příklad: UCSRB registr (nastavení sériového portu) chod procesoru lze monitorovat pomocí stavových registrů příklad: STATUS registr (příznaky výsledků aritmetických operací)
Odbočka - bitové operace AND: 11110000 & 10101010 = 10100000 OR: 11110000 | 10101010 = 11111010 XOR: 11110000 ^ 10101010 = 01011010 NOT: ~ 10101010 = 01010101 1 na výstupu tam, kde je na daném bitu 1 v obou bytech 1 na výstupu tam, kde je na daném bitu 1 alespoň v jednom bytu 1 na výstupu tam, kde je na daném bitu 1 právě v jednom bytu (překlopí právě ty bity jednoho bytu, které mají 1 na témže bitu druhého bytu) negace všech bitů
Zacházení s bity V následujících ukázkách budeme manipulovat se třetím bitem (PB3) registru PORTB. _BV(x) - byte s nastaveným x-tým bitem: 76 x 10 _BV(x) = 1 << x = 00...1...00; nahození bitu: PORTB |= _BV(PB3); 00000000 | (1 << 3) = 00000000 | 00001000 = 00001000 shození bitu: PORTB &= ~_BV(PB3); 11111111 & ~(1 << 3) = 11111111 & (~00001000) = 11111111 & 11110111 = 11110111 překlopení bitu: PORTB ^= _BV(PB3); 00000000 ^ (1 << 3) = 00000000 ^ 00001000 = 00001000 11111111 ^ (1 << 3) = 11111111 ^ 00001000 = 11110111
I/O operace – cvičíme s piny piny sdruženy do portů (typicky po osmi) – PORTx[0..7], značíme písmenným suffixem, např. PORTB, jeho jednotlivé bity pak PB0 … PB7 pro každý port existují tři obslužné registry: DDRx (DDRB): směr pinu (0 – vstupní, 1 – výstupní) PORTx (PORTB): výstupní hodnota (0 – 0V, 1 – 5V) PINx (PINB): skutečná hodnota na vstupu (0 – 0V, 1 – 5V)
Programátor HW k nahrání programu (firmware) do jednočipu komerční STK500 AVR Dragon samodomo protokolové (programovací signály generuje čip programátoru) problém slepice X vejce (jak naprogramovat čip do programátoru) avr910biprog bitbang (programovací signály generuje přímo PC na paralelním nebo sériovém portu) PonyProg, dasa… bootloadery sám sobě programátorem
Low-cost programátory
Zadání – blikající LED dioda Základní zadání – pevné časování ¼ sekundy svítí ¾ sekundy nesvítí Rozšířené zadání doba svícení je nastavitelná uživatelem
Blikající LED – co potřebujeme nepájivé kontaktní pole programátor AVR Mega8 LED dioda rezistor („odpor“) 1kohm zdroj napětí 4-6V
Blikající LED – jak to zapojíme
Blikající LED – jak to funguje Schéma programu nekonečná smyčka Čekání použití časovačů zapouzdřené v knihovních funkcích alternativně lze, stejně jako v asembleru, použít naladěné vnořené cykly
Blikající LED – jak to naprogramujeme ASM SBI DDRB, PB0 start: LDI count0, 128 LDI count1, 71 LDI count2, 2 CBI PORTB, PB0 delay_a1: DEC count0 BRNE delay_a1 delay_b1: DEC count1 BRNE delay_b1 delay_c1: DEC count2 BRNE delay_c1 LDI count0, 137 LDI count1, 212 LDI count2, 4 SBI PORTB, PB0 delay_a2: DEC count0 BRNE delay_a2 delay_b2: DEC count1 BRNE delay_b2 delay_c2: DEC count2 BRNE delay_c2 JMP start C #include <avr/io.h> #include "global.h" #include "timer.h" int main(void) { timerInit(); PORTB |= _BV(PB0); while(1) { PORTB &= ~_BV(PB0); timerPause(250); timerPause(750); }
Blikající LED – jak to dostaneme do jednočipu AVR Studio UISP avrdude avrdude -p m8 -c stk500v2 -P COM1 -U flash:w:blink.hex
Přerušení čekání v hlavní smyčce je neefektivní občas potřebujeme reagovat na události přerušení hlavní smyčky uložení stavu procesoru zavolání příslušné obslužné rutiny obnovení stavu procesoru návrat do hlavní smyčky přerušitelná a nepřerušitelná přerušení riziko „utopení se“ v přerušeních, pokud obsluha trvá déle, než je perioda vyvolávání přerušení
Časovače měření uplynulé doby nezávisle na hlavní smyčce volitelná předdělička přerušení při přetečení dva osmibitové, jeden šestnáctibitový další funkcionalita (input capture, output compare) ukázka
A/D převodník měření analogové hodnoty napětí na pinu 6 multiplexovaných kanálů 8bit nebo 10bit výstup rychlost měření versus přesnost napěťová reference: interní (2.5V) / externí / napájení přerušení při ukončení převodu
A/D převodník: jak to zapojíme
A/D převodník: jak to naprogramujeme měření pozice potenciometru podle získané hodnoty měníme dobu svitu LED ukázka
PWM – pulzně-šířková modulace generování zvuku přes piezoměnič / řízení motoru regulace potenciometrem ukázka
Sériový port echo přijatých znaků (se zvětšením) ukázka
Alfanumerický displej výpis textu na displej ukázka
Další zdroje informací http://www.atmel.com http://robotika.cz/wiki/AVR http://www.avrfreaks.net/
Q & A roštěnka
CZECH REPUBLIC Adastra, s.r.o. Karolinská 654/2 186 00 Praha 8 - Karlín info@adastra.cz www.adastra.cz CANADA Adastra Corporation 8500 Leslie St. Markham, Ontario, L3T 7M8 info@adastracorp.com www.adastracorp.com SLOVAK REPUBLIC Adastra, s.r.o. Francisciho 4 811 08 Bratislava info@adastracorp.sk www.adastracorp.sk GERMANY Adastra GmbH Bockenheimer Landstrasse 17/19 60325 Frankfurt am Main info@adastracorp.de www.adastracorp.de