Ćw. 1 Wprowadzenie: Obsługa mikroprocesorowych modułów, podstawy techniki programowania, obsługa operacji WE/WY Problemy teoretyczne: Podstawy architektury mikrokontrolerów analogowych i mikrokonwerterów pamięć programu, pamięć danych, interfejs komunikacyjny RS-232, moduły programowanych liczników/dzielników, system przerwań. języki programowania mikrokontrolerów analogowych, środowisko programowe, emulatory programowe i sprzętowe obsługa operacji WE/WY, przechwytywanie strumieni danych przy pomocy terminala Program ćwiczenia: 1. Uruchomić mikrokomputer PC system operacyjny WINDOWS 7 i zalogować się w systemie jako użytkownik student (bez hasła). 2. W folderze..\mikrosys\ założyć unikalny folder dla studenckiej grupy laboratoryjnej (tylko w tym folderze można dokonywać zapisów i modyfikacji własnych plików). 3. Zapoznać się z podstawowymi własnościami mikrokonwerterów przeglądając odpowiednie pliki kart katalogowych dostępnych w zakładce Karty katalogowe aparatury Laboratorium A208 (pliki: AduC8xx.pdf): multiplekser kanałów analogowych, układ T-H, przetwornik A/C, napięcie referencyjne przetwornika, metody transferu danych uzyskiwanych z przetwornika, kanał monitorowania temperatury układu mikrokonwertera, pamięć (organizacja pamięci programu, pamięci danych, pamięci zewnętrznej, rodzaje pamięci, procesor rdzeniowy 8051, podstawowe własności, zegar systemowy, liczniki/dzielniki, porty WE/WY, moduły dodatkowe, zasilanie, urządzenia peryferyjne (moduły transmisji szeregowej, transmisji I 2 C, moduł nadzorcy systemu, moduł kontrolera zasilania), zastosowania modułu mikrokonwertera. 4. Zapoznać się z modułem typu EVAL-KIT ADuC8xx (zasilanie, konfigurowanie pamięci, podłączanie zewnętrznych analogowych sygnałów testowych: sinus, trójkąt, prostokąt)
t 0 1 2 3 4 5 6 7 khz x(t) y(t) U DC A x Reg. f x x1 x10 x100 x1000 oscyloskop Generator / Częstościomierz moduł ADuC831 AI7 AI6 AI5 AI4 AI3 AI2 AI1 AI0 Sensor temp. U REF A GND T/H rdzeń 8051/52 A/C U REF 2.5V RAM zewn. 2kB mikrokomputer UART RS232 Rys. 1. Schemat blokowy układu testowania przetwornika A/C modułu mikrokonwertera ADuC8xx (a) & zwolnione (b) wciśnij (c) wciśnij (PSEN=1) (PSEN=0) (RESET=1) (PSEN=1) (d) zwolnij (e) zwolnij (PSEN=0) (PSEN=1) Rys. 2. Zasada wprowadzenia modułu ADuC8xx w tryb ładowania programu użytkownika (-RESET, - Serial_Download kolejność wciskania i zwalnia przycisków) 5. Uruchomić program komunikacyjny HyperTerminal (ADuC8xx.ht), dostosować port oraz parametry transmisji do współpracy z minimodułem: - kanał komunikacyjny COM1: parametry transmisji (prędkość transmisji- 9600bitów/sek, 8 bitów danych, parzystość/brak, 1 bit stopu, brak sterowania przepływem danych, bufor FIFO z zapewnioną zgodnością z UART em 16550. - konfiguracja terminala ANSI. 6. Uruchomić i zapoznać się z obsługą pakietu programowego μvision2 do edycji, kompilowania, konsolidowania i uruchamiania aplikacji użytkownika w środowisku C- Keil (GS51.pdf) 7. W środowisku μvision2 zweryfikować parametry przetwarzania projektu (kompilacja, konsolidacja, hex-konwersja) stosując poniższe parametry: - opcje kompilacji C51 CD SB DB OE ROM(Small) Large - opcje konsolidacji BL51 NOOL RS(256) PL(68) PW(78) CO(0) 8. Załadować i uruchomić własny projekt Cw1_8xx.uv2 zawierający pojedynczy moduł programu Cw1_8xx.c.
W pliku źródłowym ustalić sekcje: definicji typu mikrokroprocesora zakresu dostępnych zasobów pamięci RAM/ROM zmiennych predefiniowanych zmiennych globalnych programu procedur WE/WY (#include <stdio.h>) aktywowania kanału komunikacynego np.: CFG831=0x11; // Uaktywnij pamiec 2kB pamieci RAM jako XDATA // KONFIGURACJA portu transmisji szeregowej - UART T3CON=0x085; // specjalizowany licznik L3 T3FD= 0x08; // szybkość transmisji 9600baud SCON = 0x052; printf("%ctestowanie PRZETWORNIKA A/C \n", 0x0C); 9. Przeprowadzić proces załadowania opracowanego modułu programowego (downloading) *.hex przy pomocy programu WSD.EXE (ustalić parametry downloadingu związane z parametrami kanału komunikacyjnego oraz zakresu procedur czyszczenia pamięci FlashEE). 10. Przetestować działanie: procedury restartu mikrokonwertera (wciśnięcie przycisku RESET), instrukcji scanf i wprowadzanie danych w zapisie: tekstowym i całkowitoliczbowym w postaci dziesiętnej i heksadecymalnej, instrukcji printf i wyprowadzanie danych w zapisie: tekstowym i całkowitoliczbowym w postaci dziesiętnej i heksadecymalnej, obsługi przycisku kontrolnego INT0 (powiązać działanie przycisku zobsługą przerwania sprzętowego) obsługi jednobitowych wskaźników typu LED
Rys. 3. Schemat blokowy mikrokonwertera AduC 831. f sampl sygnał wyzwalający przetwornik A/C Rys. 4. Schemat blokowy zegara/licznika-l2 pracującego w 16-bitowym trybie auto-przeładowania i generującego sygnał wyzwalania przetwornika A/C
Przykładowy program obsługi mikrokonwertera: (kolorem szarym zaznaczono linie źródłowe związane z zadawaniem częstości próbkowania) #include <ADuC831.h> // predefiniowane symbole ADuC831 #include <stdio.h> #define SENSTEMP 8 // kanal 8 #define DMASTOP 15 // DMA-> STOP #define DZ 18 // dzielnik Licznika2, zadawanie częstotliwości próbkowania // ZMIENNE DEFINIOWANE W WEWNETRZNEJ PAMIECI RAM idata int xdata *ptr; idata int num; bdata bit C; sbit P32 = P3^2; // linia INT0 = Port3.2 - przelacznik Int0 sbit LED = P3^4; // dioda LED idata unsigned char ch; // numer przetwarzanego kanalu xdata int DMASTART[1024]; // segment pamieci dla przeslan DMA // Procedura obslugi przerwania generowanego sygnalem ADCI z przetw. ADC void end_of_adc(void) interrupt 6 { // int_6*8+3 = 51dec = 33hex = ADCI TR2=0; // zakoncz wyzwalanie przetwornika C=0; // zeruj wskaznik // Procedura obslugi przerwania generowanego sygn. zewnetrznym INT0 // W obsludze tego przerwania realizujemy pomiar temperatury void interrupt_0 () interrupt 0 { int T; ADCCON1 = 0x80; ADCCON2 = SENSTEMP; for (T=0; T<100; T++) ; SCONV = 1; while (!ADCI); T=((ADCDATAH & 0x0F) * 256) + ADCDATAL; ADCCON1=0x00; printf ( "\ntemperatura binarnie = %u bit",t ); // wlaczenie zasilania przetwornika // wlaczenie sensora temp. // opoznienie programowe // rozkaz pojedynczej konwersji // oczekiowanie na zakonczeniu konwersji SCCONV<=0 // odbior wyniku przetwarzania // wylaczenie zasiolania przetwornika // wyswietlenie binarnej wartosci wyniku przetwarzania A/C main() { int i, DMACOUNT; CFG831=0x11; // Uaktywnij pamiec 2kB pamieci RAM jako XDATA // KONFIGURACJA portu transmisji szeregowej - UART T3CON=0x085; // specjalizowany licznik L3 T3FD= 0x08; // szybkość transmisji 9600baud SCON = 0x052; printf("%ctestowanie PRZETWORNIKA A/C \n", 0x0C); printf("\nwprowadz numer kanalu przetwarzania A/C (0-15):?"); // Numer przetwarzaniego kanalu scanf ("%bd", &ch); ch&=0xf; // liczba: od 0 do 14 printf("\npodaj liczbe probek sygnalu pomiarowego DMACOUNT:?"); // Liczba próbek mierzonego sygnału scanf ("%u", &DMACOUNT); printf("\nwybrales kanal nr=%bd i N=%d probek sygnalu badanego", ch, DMACOUNT); // PRE-KONFIGURACJA zewnetrznej RAM dla DMA w pojedynczym kanale for(i=0; i<dmacount; i++) DMASTART[i] = ch << 12; DMASTART[i]=DMASTOP << 12; // Zancznik konca bloku danych pomiarowych: Stop DMA for (i=0; i<=dmacount; i++) { if (i % 8 ==0) printf("\n"); printf("%3d=%04x ", i, DMASTART[i] ); // Wydruk kontrolny prekonfigurowanego obszaru RAM // KONFIGURACJA ADC dla konwersji typu DMA... DMAL=0; // adres inicjujacy kanal operacji DMA DMAH=0;
DMAP=0; TL2,TH2=0; RCAP2L=0x10000-DZ; RCAP2H=(0x10000-DZ)>>8; ADCCON1=0x9E; ADCCON2=0x40; C=1; EA=1; EADC=1; TR2=1; // koniecznie w takim porzadku: DMAL, DMAH, DMAP) // Fsys=11059200Hz // Tosc=12/Fosc -> 1.085us // okres probkowania = T2 =(DZ*1.085us) // [RCAP2H,RCAP2L]= 65536 - DZ // tryb zasilania -> normaly // tryb przesylania danych -> DMA // wyzwalanie przetwornika -> Timer2 // lokany wskaznik warunku // globalne zezwolenie obslugi przerwan // zezwolenie obslugi przerwan przetwornika ADC // zezwolenie na prace licznika L2 // Trwa konwersja i przesylanie danych DMA // kiedy transmisja DMA jest kompletna, przetwornik ADC generuje // przerwanie i zeruje bit C while (C); // wynik przetwarzania ADC jest juz dostepny w RAM EA=0; // wstrzymana obsluga przerwan - globalnie EADC=0; // wstrzymana obsluga przerwan od przetwornika A/C ADCCON1=0x00; // zasilanie przetwornika wylaczone for(i=0; i<=dmacount; i++) { // wydruk kontrony zawartosci pamieci RAM if (i % 8== 0) printf("\n"); printf("%3d=%04x ", i, DMASTART[i] ); // wydruk kontrolny w postaci slupka danych for(i=0; i<=dmacount; i++) printf("\n%4u ", DMASTART[i] & 0x0FFF ); printf("\n"); IT0=1; // zezwolenie na obsluge przerwania 0 EA=1; // zezwolenie na obsluge przerwan EX0=1; // zezwolenie na obsluge przerwania zewnetrznego INT0 (przycisk) printf("\nczekam na INT0\n"); while(1) { for (i=0; i<30000; i++) ; LED = ~LED ; // KONIEC // Test przetwarzania w trybie pojedynczej konwersji A/C // opoznienie programowe // negacja stanu wysterowania diody LED na przeciwny
PRZYKŁADOWE WYNIKI Panel aplikacji terminala znakowego TESTOWANIE PRZETWORNIKA A/C Wprowadz numer kanalu przetwarzania A/C (0-15):?0 Podaj liczbe probek sygnalu pomiarowego DMACOUNT:?128 Wybrales kanal nr=0 i N=128 probek sygnalu badanego 0=0000 1=0000 2=0000 3=0000 4=0000 5=0000 6=0000 7=0000 8=0000 9=0000 10=0000 11=0000 12=0000 13=0000 14=0000 15=0000... 112=0000 113=0000 114=0000 115=0000 116=0000 117=0000 118=0000 119=0000 120=0000 121=0000 122=0000 123=0000 124=0000 125=0000 126=0000 127=0000 128=F000 0=05C9 1=0535 2=04A7 3=0424 4=03AB 5=033F 6=02E4 7=029D 8=0262 9=0236 10=021B 11=020A 12=0220 13=0242 14=0271 15=02B1... 120=038C 121=0400 122=0482 123=050E 124=05A1 125=0639 126=06D3 127=0000 128=F000... 1154 1294 1441 Przykłady inicjalizacji portów transmisji szeregowej dla wybranych typów mikrokontrolerów analogowych #ifdef ADuC831 CFG831=0x01; // Uaktywnij pamiec 2kB pamieci RAM jako XDATA T3CON=0x085; // KONFIGURACJA portu transmisji szeregowej - UART T3FD=0x08; SCON=0x052; #ifdef ADuC812 // KONFIGURACJA portu transmisji szeregowej - UART SCON = 0x52; // 8bit, nieparzystosc, 1 bit stopu TMOD = 0x20; // konfiguracja Timer1.. TH1 = 0xFD; //..dla predkosci transmisji 9600[b/s] (baud) TR1 = 1; #ifdef ADuC834 CFG834=0x01; T3CON = 0x82; T3FD = 0x12; SCON = 0x52; #ifdef ADuC824 RCAP2H=0xFFh; RCAP2L=-5; // (close enough to 9600baud) TH2=0xFFh; TL2=-5; SCON=0x52h; T2CON=0x34h; // Uaktywnij pamiec 2kB pamieci RAM jako XDATA // config UART for 9830baud