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