Svítíme s LED II
Zadání
Program, který jsme minule vytvářeli byl tím nejjednodušším programem, díky kterému můžeme reálně vidět jak náš procesor funguje. Ovšem musíme si přiznat, že je to jako kanónem na vrabce... Dnes si ukážeme praktičtější příklad. Stisknutím tlačítka aktivujeme časový spínač, který po uvonění tlačítka začne počítat a po vypršení limitu zhasne rozsvícenou LED.
Rozbor problému
Minule jsme využili assembleru, dnes budeme program vytvářet v jazyce C a tím si proces trošku ulehčíme. Jak jste si určitě pri čtení katalogového listu všimli, trvá vykonání většiny instukcí u MCU ATMEGA16 pouhý jeden strojový cyklus. Vyjjímkou jsou instrukce, které mění běh programu jako jsou skoky a volání. Jeden strojový cyklus trvá je roven 1/f, kde f je frekvence oscilátoru. My budeme pracovat v vnitřním oscilátorem RS o frekvenci 8 MHz. Jeden strojový cyklus tedy v našem případě bude 1/8000000 a to je 0,000000125 s tedy 2150ns. Pokud tedy potřebujeme aby nějaký děj trval například 1s, musíme spozdit program 8 000 000 krát.
Předpokládám, že většina z Vás má za sebou alespoň základy jazyka C a tak ví, že jednoduše toho můžeme dosáhnout například využitím cyklů. Oblíbený pro tento problém je cyklus for. Musíme si ale uvědomit, že při překladu příkazů jazyka C je počet instukcí, na který je přeložen cyklus for mnohonásobně vyšší, takže cyklus v jazyce C bude mít několikrát méně než spočítaných 4000 000 iterací. Kolik jich bude, je nejlépe vyzkoušet. Čase již budete mít zevrubnou představu o tom jaká čísla pro jaký oscilátor používat, ovšem je nutno říc, že způsob jaký dnes použijeme není nijak přesný a používá se pouze v případech, kdy na přesnosti moc nesejde...
Při spuštění programu postupujte následovně. V menu File → New vyberte Project…

Po nastavení projektu se můžeme směle pustit do práce. Přidejte soubor zdrojového kódu: File → New → Source. Uložte ho a v nastavení projektu Project → Configure v záložce Files ho přidejte k projektu… Opište zdrojový kód:
#include <mega16.h>
unsigned int cek1 = 0;
void main (void)
{
PORTC=0x01;
DDRC=0x01;
PORTD=0x40;
DDRD=0x00;
while (1)
{
if ((PIND & 0x40) == 0)
PORTC |= 0x01;
else PORTC &=0xFE;
};
}
Tento jednoduchý prográmek zajistí to, že při stisknutí tlačítka na pinu PORTD,6 se rozsvítí LED na pinu PORTC,0. To ovšem není přesně to co jsme chtěli, ale ukazuje to, jak jednoduše můžeme s porty procesoru manipulovat.
Program zkompilujte stisknutím F9. Hlášení o průběhu kompilace se vám zobrazí na obrazovce. Chyby můžete vidět na panelu pod zdrojovým kódem. Pokud kompilace proběhla v pořádku, stiskněte Shift-F9. Tentokrát se celý projekt „polepí dohromady“ a vytvoří se ROM soubor, který můžeme nahrát do procesoru PonyProgem, ale ještě lépe integrovaným programátorem v CodeVisionAVR.
Následující kód je již ten, který nám po stisknutí tlačítka podrží výstup PORTC,6 ve stavu log. 1 po dobu asi 4 vteřiny (s oscilátorem 8MHz):
#include <mega16.h>
void main (void)
{
unsigned int cek1 = 0;
unsigned int cek2 = 0;
PORTC=0x01;
DDRC=0x01;
PORTD=0x40;
DDRD=0x00;
while (1)
{
if ((PIND & 0x40) == 0)
{
PORTC |= 0x01;
cek1 = 65000;
cek2 = 20;
}
cek1 --;
if (cek1 == 0) cek2 --;
if (cek2 == 0) PORTC &=0xFE;
};
}
Při kompilaci postupujte stejným způsobem jako v předchozím případě. Program je možno do čipu nahrát některým z programátorů, které si popíšeme v příštím díle, nebo odkrokovat v AVR Studiu. Pro tento případ je nutné nastavit generování .cof souborů v nastavení compilátoru, které poté v AVR Studiu otvíráme, abychom mohli krokovat na úrovni jazyka C.
Předpokládám, že většina z Vás má za sebou alespoň základy jazyka C a tak ví, že jednoduše toho můžeme dosáhnout například využitím cyklů. Oblíbený pro tento problém je cyklus for. Musíme si ale uvědomit, že při překladu příkazů jazyka C je počet instukcí, na který je přeložen cyklus for mnohonásobně vyšší, takže cyklus v jazyce C bude mít několikrát méně než spočítaných 4000 000 iterací. Kolik jich bude, je nejlépe vyzkoušet. Čase již budete mít zevrubnou představu o tom jaká čísla pro jaký oscilátor používat, ovšem je nutno říc, že způsob jaký dnes použijeme není nijak přesný a používá se pouze v případech, kdy na přesnosti moc nesejde...
První kroky
Prvním krokem bude určitě instalace CodeVision AVR. To si můžete stáhnout na adrese http://www.hpinfotech.ro. K volnému je určena pouze studijní verze s omezením kódu na 2kB, ale v našem seriálu si s ní bohatě vystačíme.Při spuštění programu postupujte následovně. V menu File → New vyberte Project…

Dále máte na výběr mezi manuálním nastavením projektu a automatickým nastavením s tzy. CodeWizardAVR, což je pomůcka, která Vám umnožní jednodušší využití periférií, připojitelných k procesoru. My si vybereme tu složitější možnost a to manuální nastavení. Zvolíme tedy NO.
Po nastavení projektu se můžeme směle pustit do práce. Přidejte soubor zdrojového kódu: File → New → Source. Uložte ho a v nastavení projektu Project → Configure v záložce Files ho přidejte k projektu… Opište zdrojový kód:
#include <mega16.h>
unsigned int cek1 = 0;
void main (void)
{
PORTC=0x01;
DDRC=0x01;
PORTD=0x40;
DDRD=0x00;
while (1)
{
if ((PIND & 0x40) == 0)
PORTC |= 0x01;
else PORTC &=0xFE;
};
}
Tento jednoduchý prográmek zajistí to, že při stisknutí tlačítka na pinu PORTD,6 se rozsvítí LED na pinu PORTC,0. To ovšem není přesně to co jsme chtěli, ale ukazuje to, jak jednoduše můžeme s porty procesoru manipulovat.
Program zkompilujte stisknutím F9. Hlášení o průběhu kompilace se vám zobrazí na obrazovce. Chyby můžete vidět na panelu pod zdrojovým kódem. Pokud kompilace proběhla v pořádku, stiskněte Shift-F9. Tentokrát se celý projekt „polepí dohromady“ a vytvoří se ROM soubor, který můžeme nahrát do procesoru PonyProgem, ale ještě lépe integrovaným programátorem v CodeVisionAVR.
Následující kód je již ten, který nám po stisknutí tlačítka podrží výstup PORTC,6 ve stavu log. 1 po dobu asi 4 vteřiny (s oscilátorem 8MHz):
#include <mega16.h>
void main (void)
{
unsigned int cek1 = 0;
unsigned int cek2 = 0;
PORTC=0x01;
DDRC=0x01;
PORTD=0x40;
DDRD=0x00;
while (1)
{
if ((PIND & 0x40) == 0)
{
PORTC |= 0x01;
cek1 = 65000;
cek2 = 20;
}
cek1 --;
if (cek1 == 0) cek2 --;
if (cek2 == 0) PORTC &=0xFE;
};
}
Při kompilaci postupujte stejným způsobem jako v předchozím případě. Program je možno do čipu nahrát některým z programátorů, které si popíšeme v příštím díle, nebo odkrokovat v AVR Studiu. Pro tento případ je nutné nastavit generování .cof souborů v nastavení compilátoru, které poté v AVR Studiu otvíráme, abychom mohli krokovat na úrovni jazyka C.
Komentovat článek
Komentáře k článku
článek zatím nikdo nekomentoval



