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.