PMiK Programowanie Mikrokontrolera 8051 Wykład 2 Mikrokontroler 8051 PMiK Programowanie mikrokontrolera 8051 - wykład S. Szostak (2006)
Mikrokontroler Czyli - wszystko w jednym (EPROM, FLASH) Central Processing Unit Interfejs RS, USB, PMiK Programowanie mikrokontrolera 8051 S. Szostak 2
Schemat blokowy mikrokontrolera 8051 PRZERWANIA ZEWNĘTRZNE PRZERWANIA WEWNĘTRZNE WEJŚCIA LICZNIKÓW SYSTEM PRZERWAŃ ROM 4kB RAM 128B LICZNIK T1 LICZNIK T0 CPU OSCYLATOR STEROWANIE MAGISTRALĄ 4 PORTY WE/WY PORT SZEREGOWY P0 P1 P2 P3 TXD RXD Źródło: MCS51 Microcontroller Family User s Manual, Intel Corp. PMiK Programowanie mikrokontrolera 8051 S. Szostak 3
Schemat blokowy mikrokontrolera 8051 PRZERWANIA ZEWNĘTRZNE PRZERWANIA WEWNĘTRZNE WEJŚCIA LICZNIKÓW SYSTEM PRZERWAŃ ROM 4kB RAM 128B LICZNIK T1 LICZNIK T0 CPU OSCYLATOR STEROWANIE MAGISTRALĄ 4 PORTY WE/WY PORT SZEREGOWY P0 P1 P2 P3 TXD RXD Źródło: MCS51 Microcontroller Family User s Manual, Intel Corp. PMiK Programowanie mikrokontrolera 8051 S. Szostak 4
Dobór częstotliwości oscylatora Co wziąć pod uwagę? Wymaganą wydajność systemu Współpracę z urządzeniami zewnętrznymi Komunikację z innymi systemami Pobór mocy Koszt systemu Emisję zakłóceń Najlepiej dobrać jak najniższą, ale spełniającą przyjęte założenia częstotliwość sygnału zegarowego. PMiK Programowanie mikrokontrolera 8051 S. Szostak 5
Częstotliwości oscylatora a pobór mocy Źródło Dallas (AN1771.pdf) PMiK Programowanie mikrokontrolera 8051 S. Szostak 6
Czy kształt sygnału zegarowego może mieć jakieś znaczenie Pobór mocy zależy od kształtu sygnału zegarowego (zależność od szybkości narastającego i opadającego zbocza sygnału zegarowego) Źródło Dallas (AN1771.pdf) Jest to uwarunkowane strukturą wewnętrzną układu oscylatora Efekt szczególnie widoczny dla małych częstotliwości zegara Inne rozwiązanie - wewnętrzny oscylator (ring oscillator) np. DS87C520 Rezultat - osiągi klasycznej 8051 taktowanej f = 7MHz przy Icc = 3,6 ma Ale zakres częstotliwości 2-4 MHz i mała stabilność częstotliwości PMiK Programowanie mikrokontrolera 8051 S. Szostak 7
Układ oscylatora Dallas-Maxim Atmel PMiK Programowanie mikrokontrolera 8051 S. Szostak 8
Układ kontroli zegara systemowego w mikrokontrolerach Maxim - Dallas Źródło Maxim -Dallas Ultra- High-Speed Flash Microcontroller User s Guide PMiK Programowanie mikrokontrolera 8051 S. Szostak 9
Układ zegara w mikrokontrolerze C8051F060 PMiK Programowanie mikrokontrolera 8051 S. Szostak 10
Stabilność oscylatora Oscylator o stabilności generowanej częstotliwości ±20 ppm - to dużo czy mało? Taki oscylator w ciągu roku (około 32 miliony sekund) może nas oszukać o ok. 10 minut. Typowy rezonator kwarcowy charakteryzuje się stabilnością na poziomie (5-100 ppm) to daje błąd w ciągu roku rzędu 5-50 minut. Jego stabilność silnie zależy od temperatury. Ponadto jest wrażliwy na wibracje i traci stabilność z czasem. Rozwiązania: TCXO temperaturowo skompensowane oscylatory kwarcowe 0.1 ppm ale koszt ok. 100$. Pomiar temperatury (koszt sensora ok. 2$) i programowe uwzględnienie zmian częstotliwości oscylacji. Rezonatory ceramiczne tańsze od rezonatorów kwarcowych, bardziej odporne na wibracje, mniejsze. Ale stabilność na poziomie 5000 ppm co daje błąd na poziomie ±50 minut na tydzień. PMiK Programowanie mikrokontrolera 8051 S. Szostak 11
Wnioski dla programisty i konstruktora Najlepiej dobrać jak najniższą, ale spełniającą przyjęte założenia częstotliwość sygnału zegarowego. Pisać kod tak, żeby łatwo adaptować program do różnych architektur mikrokontrolera (np. liczby taktów zegarowych potrzebnych do wykonania cyklu maszynowego) i różnych częstotliwości oscylatora. #include <reg51.h> #define OSC_FREQ (12000000UL) // częstotliwość oscylatora w Hz #define OSC_PER_INST (12) // liczba cykli zegarowych na instrukcję #define Time_10ms (65536 (tword) (OSC_FREQ / (OSC_PER_INST * 100))) #define Time_10ms_H (Time_10ms / 256) #define Time_10ms_L (Time_10ms % 256) TH0 = Time_10ms_H; TL0 = Time_10ms_L; PMiK Programowanie mikrokontrolera 8051 S. Szostak 12
Odczyt danych z pamięci programu PMiK Programowanie mikrokontrolera 8051 S. Szostak 13
Układ odczytu danych z zewnętrznej pamięci programu PMiK Programowanie mikrokontrolera 8051 S. Szostak 14
Program w wewnętrznej czy zewnętrznej pamięci programu? Wewnętrzny ROM Wolne porty P0 i P2 Możliwość przeprogramowywania pamięci w systemie (ISP) Mniejszy pobór mocy Zewnętrzny ROM Dostępne 64 KB pamięci, Możliwe bankowanie pamięci Źródło Dallas (AN1771.pdf) PMiK Programowanie mikrokontrolera 8051 S. Szostak 15
Pamięć danych (klasyczna 51) PMiK Programowanie mikrokontrolera 8051 S. Szostak 16
Komunikacja mikrokontrolera z zewnętrzną pamięcią danych PMiK Programowanie mikrokontrolera 8051 S. Szostak 17
Dane w wewnętrznej czy zewnętrznej pamięci danych? Wewnętrzny RAM Wolne porty P0 i P2 Szybszy dostęp Mniejszy pobór mocy Zewnętrzny RAM Dostępne 64 KB pamięci, Możliwe bankowanie pamięci Źródło Dallas (AN1771.pdf) PMiK Programowanie mikrokontrolera 8051 S. Szostak 18
Środowisko µvision firmy Keil PMiK Programowanie mikrokontrolera 8051 S. Szostak 19
Komponenty środowiska Keil PMiK Programowanie mikrokontrolera 8051 S. Szostak 20
Assembler Source File Object File from Cx51 Object File from Intel ASM51 or PL/M-51 Ax51 Macro Assembler Object File Library File Listing File LIBx51 Library Manager Lx51 Linker / Locator MAP File (*.m51) Library File Absolute Object File OHx51 Object HEX Converter mvision2 Debugger In-circuit debugger HEX File PROM Programmer PMiK Programowanie mikrokontrolera 8051 S. Szostak 21
PMiK Programowanie mikrokontrolera 8051 S. Szostak 22
Typy danych i ich zakres PMiK Programowanie mikrokontrolera 8051 S. Szostak 23
8051 dostęp do pamięci w języku C data bdata code: program memory accessed by movc @a + dptr idata xdata PMiK Programowanie mikrokontrolera 8051 S. Szostak 24
PMiK Programowanie mikrokontrolera 8051 S. Szostak 25
Umieszczanie zmiennych w różnych obszarach pamięci Akceptowalne są dwie konwencje deklaracji zmiennych 1. [typ zmiennej] [obszar pamięci] nazwa zmiennej int data var; 2. [obszar pamięci] [typ zmiennej] nazwa zmiennej data int var; Deklaracja wskaźników data int *p; int data *p; xdata int data *p; Preferowana jest konwencja 1 czyli dla deklaracji zmiennej [typ zmiennej] [obszar pamięci] nazwa zmiennej dla deklaracji wskaźnika [typ zmiennej wskazywanej przez wskaźnik] [obszar pamięci w której przechowywana jest zmienna] * [obszar pamięci w której przechowywany jest wskaźnik] nazwa wskaźnika int data * xdata p; PMiK Programowanie mikrokontrolera 8051 S. Szostak 26
Umieszczenie urządzeń zewnętrznych w przestrzeni pamięci danych Źródło http://www.adatronik.com.pl PMiK Programowanie mikrokontrolera 8051 S. Szostak 27
Dostęp do urządzeń I/O umieszczonych w zewnętrznej pamięci danych (xdata) sposób 1 Zastosowanie wskaźnika void main (void) { volatile unsigned char xdata *p = (char xdata *) 0x8000; p[0] = 0xAA; p[1] = 0x55; } ;---- Variable 'p' assigned to Register 'R6/R7' ---- 0000 7F00 MOV R7,#00H 0002 7E80 MOV R6,#080H ; SOURCE LINE # 5 0004 8F82 MOV DPL,R7 0006 8E83 MOV DPH,R6 0008 74AA MOV A,#0AAH 000A F0 MOVX @DPTR,A ; SOURCE LINE # 6 000B A3 INC DPTR 000C 7455 MOV A,#055H 000E F0 MOVX @DPTR,A PMiK Programowanie mikrokontrolera 8051 S. Szostak 28
Dostęp do urządzeń I/O umieszczonych w zewnętrznej pamięci danych (xdata) sposób 2 Zastosowanie makra XBYTE #include <absacc.h> void main (void) { XBYTE[0x8000] = 0xAA; XBYTE[0x8001] = 0x55; } 0000 908000 MOV DPTR,#08000H 0003 74AA MOV A,#0AAH 0005 F0 MOVX @DPTR,A ; SOURCE LINE # 7 0006 A3 INC DPTR 0007 7455 MOV A,#055H 0009 F0 MOVX @DPTR,A PMiK Programowanie mikrokontrolera 8051 S. Szostak 29
Dostęp do urządzeń I/O umieszczonych w zewnętrznej pamięci danych (xdata) sposób 3 Alokacja zmiennej pod ustalonym adresem poprzez użycie dyrektywy _at_ volatile unsigned char xdata mm_dev_reg0 _at_ 0xFC00; volatile unsigned char xdata mm_dev_reg1 _at_ 0xFC01; void main (void) { mm_dev_reg0 = 0xAA; mm_dev_reg1 = 0x55; } 0000 908000 MOV DPTR,#mm_dev_reg0 0003 74AA MOV A,#0AAH 0005 F0 MOVX @DPTR,A ; SOURCE LINE # 7 0006 A3 INC DPTR 0007 7455 MOV A,#055H 0009 F0 MOVX @DPTR,A PMiK Programowanie mikrokontrolera 8051 S. Szostak 30
Zmienne typu volatile unsigned char xdata inp1; // wejście urządzenia #1 unsigned char xdata out1; // wyjście urządzenia #1 void func (void) { while (inp1 & 0x01) // powtarzaj dopóki ustawiony jest najmłodszy bit danej { out1 = 0x00; // zmieniaj bit 0 out1 = 0x01; } } Jak ten kod naprawdę może działać? Deklaracja zmiennej jako volatile oznacza, że jej wartość może być niezależna od wykonywanego kodu programu (np. może być wymuszana przez urządzenia zewnętrzne, system przerwań, itp.) i dla tego typu zmiennych kompilator nie może optymalizować dostępu do niej. Brak takiej deklaracji spowoduje, że kompilator zoptymalizuje do niej dostęp co może spowodować inne niż zamierzaliśmy działanie programu. Rozwiązanie volatile unsigned char xdata inp1; // wejście urządzenia #1 volatile unsigned char xdata out1; // wyjście urządzenia #1 PMiK Programowanie mikrokontrolera 8051 S. Szostak 31
Zmienne typu const /* zmienna pi jest przechowywana w xdata */ const float xdata pi = 3.1415927; ------------------------------------------------------------------------------------------------ const unsigned char mask [] = { 0x01, 0x02, 0x04, 0x08 }; // definiowanie maski const unsigned char *cp = mask; unsigned char *p = mask; /* to samo co cp */.. *p = 'a'; // Taka deklaracje nie spowoduje wygenerowania błędu ale jej wynik jest nieokreślony *cp = 'a'; // To już spowoduje wygenerowanie błędu ------------------------------------------------------------------------------------------------ char text [] = "Witamy na PMiK"; char *const textp = text;... *textp = 'A'; // OK (zmiana text[0]) textp++; // Błąd (textp jest typu const) textp[2] = 'B'; // OK (zmiana text[2]) PMiK Programowanie mikrokontrolera 8051 S. Szostak 32
Rozszerzenia jęcyka C (ANSI C) Dostęp do rejestrów SFR Określają w jakiej pamięci ma być umieszczona dana PMiK Programowanie mikrokontrolera 8051 S. Szostak 33
Przykładowe deklaracje zmiennych Źródło : C51 Compilator Keil Software c51.pdf PMiK Programowanie mikrokontrolera 8051 S. Szostak 34
Format deklaracji funkcji Źródło : C51 Compilator Keil Software c51.pdf PMiK Programowanie mikrokontrolera 8051 S. Szostak 35
Przekazywanie parametrów funkcji Źródło : C51 Compilator Keil Software c51.pdf PMiK Programowanie mikrokontrolera 8051 S. Szostak 36
W jaki sposób funkcja zwraca wyniki Źródło : C51 Compilator Keil Software c51.pdf PMiK Programowanie mikrokontrolera 8051 S. Szostak 37
Obsługa przerwań 8051 Używaj 3-go zestawu rejestrów void timer0 (void) interrupt 1 using 3 { if (++licznik_1 == 2000) { // licz do 2000 licznik_2++; // inkrementuj licznik_2 licznik_1 = 0; // czyść licznik_1 } } Źródło : C51 Compilator Keil Software c51.pdf PMiK Programowanie mikrokontrolera 8051 S. Szostak 38
Przerwania w 8051 Źródło : C51 Compilator Keil Software c51.pdf PMiK Programowanie mikrokontrolera 8051 S. Szostak 39
Funkcje typu intrinsic Żeby używać tych funkcji trzeba dołączyć header <INTRINS.H> Źródło : C51 Compilator Keil Software c51.pdf PMiK Programowanie mikrokontrolera 8051 S. Szostak 40