× Aktuálně z oboru

SHIELD Experience Upgrade 7 – méně hledání a více zábavy [ clanek/2018052902-shield-experience-upgrade-7-mene-hledani-a-vice-zabavy/ ]
Celá zprávička [ clanek/2018052902-shield-experience-upgrade-7-mene-hledani-a-vice-zabavy/ ]

Praktická úloha I

[ http://programujte.com/profil/90-ondrej-karas/ ]Google [ ?rel=author ]       [ http://programujte.com/profil/118-zdenek-lehocky/ ]Google [ ?rel=author ]       6. 2. 2007       34 270×

Dodnes jsme vlastně delali jen neúčelné programy sloužící výhradně pro studium procesoru. Dnes si za pomoci předchozích znalostí vytvoříme jednoduchý program, který bude komunikovat s PC a sdělovat mu, jaké klávesy jsou stisknuty.

K tomu využijeme teorie z minulého článku. Program budeme psát v C, opět v CodeVision AVR. Pokud máte projekt z minula, můžete ho použít. Pokud ne, založte si ho podle předchozího dílu. Překontrolujte, zda program komunikuje s PC a až poté se pusťte do dnešního úkolu.

Co vlasně budeme dělat

Na diskusním fóru webu pro elektro-bastlíře jsem zahlédl dotaz, jak udělat s procesorem jednoduchý program, který bude po stisknutí jednoho tlačítka odesílat řetězec DOWN, po stisku druhého UP, po stisku třetího ENTER. Díky znalostem z předchozího dílu by to pro vás neměl být velký problém.

Pokud bychom podobnou aplikaci dělali pro nějakou firmu, zřejmě bychom začali úvahou nad tím, jaký procesor vlastně použít. A to kvůli ceně. Zřejmě by nám stačil některý z procesorů ATtiny, v malém pouzdře s počtem vývodů postačujících přesně naší aplikaci. My se ale s procesory AVR teprve učíme, a proto budeme vyvíjet dnešní úkol na procesoru ATMEGA16.

Potřebujeme 3 vstupní piny:

  • NAHORU – PD7
  • DOLU – PC0
  • ENTER – PC1

Dále potřebujeme jeden výstupní pin pro komunikaci po sériové lince. Procesor ATMEGA16 disponuje pouze jedním obvodem UARTU, a tak nám nezbývá nic jiného, než použít pin TX (PD1). K tomu, aby nam procesor pracoval, ho už stačí už jen napájet a samozřejmě nahrát správný program. A ten si vytvoříme jak v C, tak v assembleru.

Jdeme na to

Můžeme prakticky využít i program z minula. Po menších úpravách bude dělat přesně to, co po něm chceme. Začneme tedy s kódem psaným v C (v tomto případě v CodeVision prostředí). Pokud jste predminulý díl nečetli, doporučuji tak před pokračováním učinit.

Nejprve si ukážeme zdrojový kód z minula:

void main(void)
{

char k;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

while (1)
      {
         k = getchar();
         putchar(k);
      };
}

Tento jednoduchý program čekal na přijetí znaku a následně ten samý odeslal. My upravíme hlavní smyčku na:

        if (!(PIND & 128)) putsf("NAHORU");
        if (!(PINC & 1)) putsf("DOLU");
        if (!(PINC & 2)) putsf("ENTER");    

Tato část nám zajistí, že při stisknutí a držení jakéhokoliv z tlačítek bude odeslán k němu příslušný příkaz. V připadě stisku tlačítek budou příkazy odelslány za sebou. Celý zdrojový kód si můžeme prohlédnout zde:

#include <mega16.h>

// Standard Input/Output functions
#include <stdio.h>

void main(void)
{
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;

DDRD &= ~128;
DDRC &= ~3;
PORTD |= 128;
PORTC |=3;

while (1)
      {
        if (!(PIND & 128)) putsf("NAHORU");
        if (!(PINC & 1)) putsf("DOLU");
        if (!(PINC & 2)) putsf("ENTER");                
      };
}

Jak vidíte, v C to je hračka. Je jasné, že je nutné ještě nastavit parametry portů, ale to bude pro vás, kteří procházíte tento seriál krok za krokem, jistě hračka. Podobně tomu bude i při tvorbě programu v assembleru, i když zde bude kód podstatně delší. Dalším problémem bude i napsání vlastní funkce pro odesílání řetězců z programové paměti. Vyzkoušíme si alespoň instrukci LPM.

Kód v assembleru si prohlédneme v příštím díle. Omlouvám se za kratší článek a momentální neaktivitu, ale snad mne dostatečně omlouvá zkouškové období. Chtěl bych vás na závěr požádat o malé hlasování v komentářích pod článkem. Mám mnoho ohlasů, že byste raději chtěli příklady v C psané v jiném (freeware) kompilátoru. Napadá mě WinAVR. Žádám vás proto o vyjádření.


Článek stažen z webu Programujte.com [ http://programujte.com/clanek/2006121010-prakticka-uloha-i/ ].