Instrukcja do ćwiczenia PE: Sterowanie portami mikrokontrolera

Transkrypt

Instrukcja do ćwiczenia PE: Sterowanie portami mikrokontrolera
Instrukcja do ćwiczenia:
Sterowanie portami mikrokontrolera
Materiał do samodzielnego opracowania: elementy języka C: typy danych i ich deklarowanie,
operatory, instrukcje, pętle, funkcje – definiowanie, deklarowanie i wywoływanie, pliki
nagłówkowe, dyrektywy kompilatora: include, define.
1. Mikrokontroler ATMega 32.
Realizacja ćwiczenia została oparta o zestaw uruchomieniowy ZL3AVR produkcji firmy
Kamami. Zestaw ten jest wyposażony w ośmiobitowy mikrokontroler ATMega 32 (ATMEL).
Posiada on 32 kB pamięci FLASH, 1kB pamięci EEPROM i 2 kB pamięci RAM. Pamięć: FLASH i
EEPROM mogą być programowane i kasowane bezpośrednio w układzie docelowym. Schemat
wyprowadzeń procesora podano na rys. 1.
Rys. 1. Schemat wyprowadzeń procesora ATMega 32 [1].
Każde z wyprowadzeń procesora może pełnić dodatkowe funkcje (oznaczenia w nawiasach
- rys. 1). Wyprowadzenia XTAL są przeznaczone do dołączenia zewnętrznego rezonatora
kwarcowego (stabilnego generatora częstotliwości zegarowej 16 MHz). Wyprowadzenia VCC, i
AVCC to miejsca dołączenia dodatniego bieguna napięcia zasilającego + 5 V, natomiast GND to
masa układu. AREF to napięcie odniesienia dla przetwornika A/C.
Grupy wyprowadzeń oznaczone literami „Px”, gdzie x = {A, B, C, D}, nazywane są portami
mikrokontrolera. W ramach każdego portu dostępne jest 8 wyprowadzeń (o numerach 0...7). Każde
z wyprowadzeń danego portu może pełnić funkcję wejścia lub wyjścia. Do wyboru jednej z tych
funkcji służy rejestr1 o nazwie DDRx. Na rys. 2 pokazano przykładowo składniki rejestru DDRA.
1 Rejestr to układ służący do przechowywania i odtwarzania informacji w postaci bitów czyli {0, 1}.
2
Rys. 2. Składniki rejestru DDRA[1].
Każde pole (bit) rejestru DDRA odpowiada kolejnemu numerowi wyprowadzenia mikrokontrolera,
należącego do rejestru A (0 … 7). Wpisanie pod konkretne pole rejestru DDRA jedynki logicznej
„1” powoduje skonfigurowanie konkretnego wyprowadzenia mikrokontrolera jako wyjścia, np.
DDRA5 → 1 ustawia PA5 jako wyjście. Zapisanie do rejestru DDR zera logicznego „0”
konfiguruje wyprowadzenie mikrokontrolera jako wejście: DDRA5 → 0 PA5 → wejście.
W celu ustawienia wysokiego lub niskiego stanu logicznego na odpowiednim wyjściu
mikrokontrolera należy do rejestru PORTx wpisać odpowiednio 1 lub 0. Niski stan logiczny
odpowiada napięciu 0V, a wysoki +5 V. Na rys. 3 pokazano składniki rejestru PORTA.
Rys. 2. Składniki rejestru PORTA [1].
Wpisanie na 6 bit rejestru PORTA jedynki logicznej „1” powoduje ustawienie +5 V na
wyprowadzeniu PA6, zera logicznego – ustawienie na PA6 napięcia 0 V.
Sterowanie funkcją i stanem logicznym wyprowadzeń mikrokontrolera w ramach
pozostałych portów odbywa się analogicznie. Literę A w nazwie rejestru należy zamienić na B, C
lub D.
2. Użyteczne funkcje języka C
W celu poprawienia przejrzystości programu za pomocą dyrektywy kompilatora „define”
można nadać dowolnemu elementowi programu własną nazwę:
#define zastępujący_ciąg_znaków zastępowany_ciąg_znaków
np.:
#define DIODA1 PB0
Zamiast odwoływać się w programie do małointuicyjnej nazwy PB0 oznaczającej 0 wyprowadzenie
poru B, można stosować nazwę DIODA1 jednoznacznie określającej co jest sterowane z tego
wyprowadzenia.
Przy stosowaniu w programie fukcji generujących opóźnienie czasowe wymaga się podania
kompilatorowi częstotliwości taktowania procesora. Służy do tego makro:
#define F_CPU 16000000
Liczba występująca powyżej to częstotliwość rezonatora kwarcowego w [Hz].
Z praktyki programowania mikrokontrolerów wynika, że wszelkie konfiguracje części
sprzętowej mikrokontrolera (wejścia, wyjścia, przetwornika A/C) powinny być umieszczone w
oddzielnym pliku (tzw. nagłówkowym *.h) i dołączane w momencie kompilacji do właściwego
pliku z tekstem programu. Owo dołączanie uzyskuje się stosując dyrektywę kompilatora:
3
#include ”nazwa.pliku”
Nazwa pliku obejmuje jego rozszerzenie (*.h).
Do zapisywania w rejestrze zera lub jedynki logicznej służy makro _BV(...). Aby z niego
skorzystać należy na początku programu dołączyć plik nagłówkowy io.h znajdujący się w katalogu
z bibliotekami /avr:
#include <avr/io.h>
Ustawienie jedynki logicznej na wyprowadzeniu x portu X uzyskuje się za pomocą:
PORTX |= _BV(PXx)
dla kilku wyprowadzeń jednocześnie instrukcja powinna wyglądać:
DDRX |= _BV(PXx1)|_BV(PXx2)|_BV(PXx3)
gdzie: X = {A, B, C, D}, x = {0 … 7}, np.
PORTB |= _BV(PB0)
ustawia stan 1 na wyjściu 0 portu B.
Stan niski ustawia się za pomocą instrukcji
PORTX &= ~(_BV(PXx))
dla kilku wyprowadzeń jednocześnie:
PORTX &= ~(_BV(PXx1)) & ~(_BV(PXx2)) & ~(_BV(PXx3))
Konfigurację wyprowadzenia x portu X jako wejścia uzyskuje się instrukcją:
DDRX &= ~(_BV(PXx))
jako wyjścia:
DDRX |= _BV(PXx)
Do odmierzania czasu i uzyskiwania opóźnienia czasowego przydatna jest funkcja:
void _delay_ms(float liczba_ms)
Aby z niej skorzystać należy dołączyć plik delay.h dyrektywą:
#include <avr/delay.h>
3. Przebieg ćwiczenia
W ćwiczeniu należy wykorzystać diody LED D2 … D9 znajdujące się w prawej części
zestawu ZL3AVR. Ich wyprowadzenia są dostępne na złączu JP22 (LED). Wyprowadzenie D0
odpowiada diodzie D2. Poprzez połączenie przewodem dowolnego z wyprowadzeń złącza JP22 z
wyprowadzeniem +VCC lub GND złącza JP9 (Zasilanie) należy sprawdzić jakie napięcie powoduje
świecenie się diody, odpowiednio: +5 V czy 0 V. Pozwoli to prawidłowo określić wymagany stan
4
portów mikrokontrolera.
Przykładowe zadania do wykonania:
a)
Napisać i uruchomić program, który spowoduje zaświecenie się diody LED podłączonej
do dowolnego portu mikrokontrolera.
b)
J. w. ale dla kilku diod LED.
c)
Napisać i uruchomić program, który spowoduje migotanie diody LED.
d)
Napisać i uruchomić program, który spowoduje sekwencyjne załączanie jednej z ośmiu
diod LED – tzw. efekt „biegnącego światła”.
4. Literatura
„8-bit Microcontroller with 32K Bytes In-System Programmable Flash Atmega32
Atmega32L”, 2503O–AVR–07/09, www.atmel.com,
[2]
„avr-libc 1.6.7”, Generated by Doxygen 1.5.6 Wed Jan 6 12:08:48 2010,
c:\Winavr-20100110\doc\avr-libc.
[1]
Wersja z dn. 22.02.2011 r.

Podobne dokumenty