workshop_jednocipy_jednocipy

Download Report

Transcript workshop_jednocipy_jednocipy

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
spínaný zdroj pro 3x3W LED
měření teploty a tlaku
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
1 na výstupu tam, kde je na
daném bitu 1 v obou bytech
|
=
11110000
10101010
11111010
1 na výstupu tam, kde je na daném
bitu 1 alespoň v jednom bytu
^
=
11110000
10101010
01011010
 OR:
 XOR:
 NOT:
~ 10101010 = 01010101
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
start:
SBI
DDRB, PB0
LDI
LDI
LDI
count0, 128
count1, 71
count2, 2
 C
#include <avr/io.h>
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
LDI
LDI
count0, 137
count1, 212
count2, 4
#include "global.h"
#include "timer.h"
int main(void) {
timerInit();
PORTB |= _BV(PB0);
while(1) {
PORTB &= ~_BV(PB0);
timerPause(250);
PORTB |= _BV(PB0);
timerPause(750);
}
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
}
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
[email protected]
www.adastra.cz
CANADA
Adastra Corporation
8500 Leslie St.
Markham, Ontario, L3T 7M8
[email protected]
www.adastracorp.com
SLOVAK REPUBLIC
Adastra, s.r.o.
Francisciho 4
811 08 Bratislava
[email protected]
www.adastracorp.sk
GERMANY
Adastra GmbH
Bockenheimer Landstrasse 17/19
60325 Frankfurt am Main
[email protected]
www.adastracorp.de