Zapis i odczyt bitu Opóźnienie programowe
Transkrypt
Zapis i odczyt bitu Opóźnienie programowe
Zapis i odczyt bitu Opóźnienie programowe dr inŜ. Stefan Brock 2008/2009 dr inŜ. Stefan Brock 2008/2009 Opóźnienie programowe Opóźnienie programowe • Zalety – moŜna uzyskać bardzo krótkie opóźnienia – nie wymagają sprzętowych liczników – działa w kaŜdym systemie • Wady – trudno uzyskać precyzyjne odmierzanie czasu zaleŜy od kompilatora – moŜe wymagać ‘dostrojenia’ po zmianie parametrów dr inŜ. Stefan Brock 2008/2009 dr inŜ. Stefan Brock 2008/2009 Zapis i odczyt bitów Operacje na bitach • Operatory w języku C: – logiczne: OR: || AND: && NOT: ! – bitowe: OR: | AND: & NOT: ~ XOR:^ • • • • dr inŜ. Stefan Brock 2008/2009 Ustawianie (zawsze 1) Kasowanie (zawsze 0) Negacja (na wartość przeciwną) Testowanie (bez zmiany wartości bitu) dr inŜ. Stefan Brock 2008/2009 1 Ustawianie bitu - bitowe OR Kasowanie bitu - bitowe AND TR0=1; • Adresowanie bajtowe: TCON=TCON|0x10; xxxx xxxx | 0001 0000 ============= TCON|=(1<<4); xxx1 xxxx • Adresowanie bitowe: Jak skasować jedną instrukcją dwa bity? TCON|=((1<<4)|(1<<0)) dr inŜ. Stefan Brock 2008/2009 dr inŜ. Stefan Brock 2008/2009 Bezpośrednia negacja bitu - XOR TR0=~TR0; • Adresowanie bajtowe: TCON=TCON^0x20; xxxx xxxx ^ 0010 0000 ============= TCON^=(1<<5); xxyx xxxx a b a^b 0 0 0 y=~x • Adresowanie bitowe: 1 0 0 1 1 1 dr inŜ. Stefan Brock 2008/2009 1 1 0 bit 7 TF1 GATE bit 3 IE1 GATE bit 6 TR1 C/T' bit 2 IT1 C/T' bit 5 TF0 M1 bit 1 IE0 M1 Testowanie bitów • Adresowanie if (TR0) a=10; bitowe: if (TR0 & TR1) b=17; if !(TR1) c=7; else c=8; • Adresowanie if (TMOD & 0x10) a=10; if (TCON & 0x50) b=17; bajtowe: xyxz xxxx & 0101 0000 =========== 0y0z 0000={0x00,0x40,0x10,0x50} F T T T dr inŜ. Stefan Brock 2008/2009 Rejestry sterujące pracą układów licznikowych Rejestr: TCON TMOD Rejestr: TCON TMOD TR0=0; • Adresowanie bajtowe: TCON=TCON&0xEF; xxxx xxxx & 1110 1111 ============= TCON&=~(1<<4); xxx0 xxxx • Adresowanie bitowe: Schematyczna budowa układu czasowego bit 4 TR0 M0 bit 0 IT0 M0 TCON - adresowanie bitowe TMOD - adresowanie bajtowe dr inŜ. Stefan Brock 2008/2009 dr inŜ. Stefan Brock 2008/2009 2 Rejestry sterujące pracą układów licznikowych Rejestr: TCON TMOD Rejestr: TCON TMOD bit 7 TF1 GATE bit 3 IE1 GATE bit 6 TR1 C/T' bit 2 IT1 C/T' bit 5 TF0 M1 bit 1 IE0 M1 bit 4 TR0 M0 bit 0 IT0 M0 TCON - adresowanie bitowe TMOD - adresowanie bajtowe dr inŜ. Stefan Brock 2008/2009 Bity rejestru TCON • TF1 (7), TF0 (5) - Flaga licznika. Bit ustawiany sprzętowo wskutek przepełnienia, zerowany sprzętowo w chwili rozpoczęcia wykonywania procedury obsługi przerwania. • TR1 (6), TR0 (4) - bit włączający układ licznikowy • IE1 (3), IT1(2), IE(1), IT(0) - bity związane z obsługą przerwań zewnętrznych dr inŜ. Stefan Brock 2008/2009 Bity rejestru TMOD • GATE - bramkowanie licznika. – GATE=1 - liczy gdy: INTx=1 i TRx=1 – GATE=0 - liczy gdy: TRx=1 • C/T' - źródło zliczanych impulsów – „0” - zliczanie cykli maszynowych (impulsów o częstotliwości fosc/12) – "1" - zliczanie impulsów zewnętrznych (z Tx) dr inŜ. Stefan Brock 2008/2009 Wybór trybu pracy licznika M1 0 0 1 M0 0 1 0 1 1 • M1, M0 - bity wyboru trybu pracy dla dr inŜ. Stefan Brock 2008/2009 danego układu licznikowego Tryb 0 liczników T0/T1 Tryb pracy: Tryb 0 Tryb 1 Tryb 2 układ T0 - tryb 3, układ T1 zatrzymany dr inŜ. Stefan Brock 2008/2009 dr inŜ. Stefan Brock 2008/2009 3 Tryb 1 liczników T0/T1 Tryby 0 i 1 liczników • Tryb 0: Stan licznika jest określony zawartością odpowiedniego rejestru THx oraz pięciu młodszych bitów rejestru TLx. Przepełnienie tego 13-bitowego licznika spowoduje ustawienie odpowiedniego bitu przerwania TFx • Tryb 1: Tak samo, lecz licznik 16-bitowy dr inŜ. Stefan Brock 2008/2009 Tryb 2 liczników T0/T1 dr inŜ. Stefan Brock 2008/2009 Tryb 2 liczników T0/T1 • 8-bitowe liczniki z automatycznym przeładowywaniem. Przepełnienie licznika TLx ustawia odpowiedni znacznik TFx oraz powoduje przepisanie zawartości THx do odpowiedniego rejestru TLx. • Wartość THx pozostaje bez zmiany. dr inŜ. Stefan Brock 2008/2009 dr inŜ. Stefan Brock 2008/2009 Tryb 3 licznika T0 Tryb 3 licznika T0 dr inŜ. Stefan Brock 2008/2009 • Dwa niezaleŜne liczniki 8-bitowe, utworzone z rejestrów TL0 i TH0. • Rejestr TL0 pracuje w układzie identycznym jak w trybach 1 • Rejestr TH0 pracuje równieŜ jako timer 8-bitowy zlicza wyłącznie impulsy zegarowe. Sterowanie przez TR1 i TF1. • T1 zastosowania nie wymagające bitów TR1 i TF1. • Wykorzystywany do generacji sygnału taktującego dr inŜ. Stefan Brock 2008/2009 dla układu transmisji szeregowej. 4 Struktura programu dla mikrokontrolera Część inicjująca Wykonuje się jeden raz Część wykonawcza W pętli nieskończonej dr inŜ. Stefan Brock 2008/2009 void main(void) { unsigned char a,b; a=b=0; TMOD=0x01; TH0=0x3C; TL0=0xB0; TR0=1; while(1) { if (TF0) { TF0=0; TL0=0xB0; TH0=0x3C; a++; if (a>19) {a=0; b++; } // if (a>19) } // if (TF0) } // while(1) } // main() dr inŜ. Stefan Brock 2008/2009 a=b=0; inicjalizacja zmiennych TMOD=0x01; 0000 0001 T1 - tryb 0, timer, bez bramkowania T0 - tryb 1, timer, bez bramkowania TH0=0x3C; TL0=0xB0; Wartość początkowa: 0x3CB0 = 15536 Wartość przeładowania 0xFFFF+1=65536 RóŜnica (do zliczenia) - 65536-15536=50000 Dla fosc=12 MHz fclk=1 MHz Tclk=1 µs T=50 ms TR0=1; - start T0 dr inŜ. Stefan Brock 2008/2009 while(1) { pętla nieskończona if (TF0) { oczekiwanie na przepełnienie T0 TF0=0; kasowanie flagi TF0 TL0=0xB0; programowe przeładowanie T0 do TH0=0x3C;wartości startowej-najpierw młodszy a++; programowy licznik - co 50 ms if (a>19){ co 20 przejście - co 1 s a=0; programowy licznik -sekundnik b++; miejsce na wyświetlenie nowej wartości }}} dr inŜ. Stefan Brock 2008/2009 Struktura programu dla mikrokontrolera Źródła przerwań w 8051 Część inicjująca Wykonuje się jeden raz Część wykonawcza W pętli nieskończonej zdarzenie 1 Przerwanie 1 zdarzenie 2 Przerwanie 2 dr inŜ. Stefan Brock 2008/2009 dr inŜ. Stefan Brock 2008/2009 5 Struktura programu dla mikrokontrolera Źródła przerwań w 8051 • Przerwania zewnętrzne INT0, INT1 – aktywne poziomem lub zboczem • Przerwania od Timerów T0, T1 – w momencie przepełnienia • Przerwanie od portu szeregowego – pusty bufor nadajnika lub pełny bufor odbiornika zdarzenie 2 Część inicjująca Wykonuje się jeden raz Część wykonawcza W pętli nieskończonej Przerwanie 2 zdarzenie 1 dr inŜ. Stefan Brock 2008/2009 dr inŜ. Stefan Brock 2008/2009 Przerwanie 1 Struktura programu dla mikrokontrolera Część inicjująca Wykonuje się jeden raz zdarzenie 1 zdarzenie 2 Przerwa nie 1 Przerwa nie 2 Część wykonawcza W pętli nieskończonej • • • • • Priorytety przerwań • KaŜde z przerwań moŜe być przypisane do jednego z 2 poziomów priorytetów – wysokiego lub niskiego • Przerwanie wysokiego priorytetu moŜe przerwać obsługę przerwania niskiego priorytetu • W ramach jednego priorytetu przerwania są sprawdzane według ustalonej kolejności: dr inŜ. Stefan Brock 2008/2009 dr inŜ. Stefan Brock 2008/2009 Kolejność sprawdzania przerwań w ramach tego samego poziomu Jak przerwanie jest obsługiwane IE0 (jako pierwszy) TF0 IE1 TF1 RI + TI (jako ostatni) UWAGA – Dotyczy jednoczesnych zgłoszeń przerwań dr inŜ. Stefan Brock 2008/2009 • Po ustaleniu waŜnego przerwania (p priorytecie większym niŜ aktualny) procesor wykonuje sprzętowo generowany rozkaz skoku LCALL do ustalonego adresu pamięci. • Dotychczasowa zawartość PC jest składowana na stosie. • Kasowana jest flaga przerwania (nie dla RI+TI) • Zgłoszenia nie obsłuŜonych przerwań oczekują na swoją kolej. dr inŜ. Stefan Brock 2008/2009 6 Układ przerwań Jak przerwanie jest obsługiwane • Adresy skoków (wektory przerwań): • IE0 0003 H 000B 0013 • TF1 001B • RI + TI 0023 • TF0 • IE1 H H – po 8 bajtów odstępu H H • Obsługa przerwania kończy się po wykonaniu instrukcji RETI – zdjęcie ze stosu wartości PC i powrót do poprzedniej akcji. dr inŜ. Stefan Brock 2008/2009 Rejestr IE – adresowany bitowo dr inŜ. Stefan Brock 2008/2009 Rejestr IP – adresowany bitowo dr inŜ. Stefan Brock 2008/2009 Tryb przerwań zewnętrznych - TCON •TCON.3 IE1 (TCON.1 IE0) Przerwanie zewnętrzne 1(0) Flaga zewnętrznego przerwania •Set – sprzętowy po wykryciu przerwania na wejściu •Reset – po wejściu do procedury obsługi •TCON.2 IT1 (TCON.0 IT0) Typ sygnału generującego przerwanie dr inŜ. Stefan Brock 2008/2009 •Set/Reset – programowy •0 – przerwanie wywoływane niskim dr inŜ. Stefan Brock 2008/2009 #include <ADUC831.H> ; FUNCTION T0_handler (BEGIN) void T0_handler(void) interrupt 1 { P0 ^=0x01; } void main(void) { TMOD=1; TR0=1; ET0=1; EA=1; while(1); } XRL P0,#01H RETI ; FUNCTION T0_handler (END) ; FUNCTION main (BEGIN) MOV TMOD,#01H SETB TR0 SETB ET0 SETB EA ?C0002: SJMP ?C0002 FUNCTION main (END) dr inŜ. Stefan Brock 2008/2009 7 #include <ADUC812.H> unsigned char x,y; void handler_T0(void) interrupt 1 { x++; } void handler_E0(void) interrupt 0 { y++; while (P3&0x01); // Pętla -zdarzenie zew. } void main (void) { TMOD=1; //T0 - 16 bitowy TR0=1; //Start T0 ET0=1; // Zgoda na przerwania od T0 IT0=1; // EX0 - aktywne zboczem EX0=1; // Zgoda na EX0 PT0=1; // Wysoki priorytet T0 EA=1; // Zgoda globalna while(1); dr inŜ. Stefan Brock 2008/2009 } unsigned char x,y,z,w; void handler_T0(void) interrupt 1 using 1 { x=(y+x)+(y-w)+(3+y-z)-(w+z)*(2*y-x); } void handler_E0(void) interrupt 0 using 2 { unsigned char x,y,z,w; void handler_T0(void) interrupt 1 { x=(y+x)+(y-w)+(3+y-z)(w+z)*(2*y-x); } Decyduje o kolejności przerwań void handler_E0(void) interrupt 0 { x=(y+x)+(y-w)+(3+y-z)(w+z)*(2*y-x); } dr inŜ. Stefan Brock 2008/2009 PUSH ACC PUSH B PUSH PSW MOV PSW,#08H MOV A,y ................................... MOV x,A POP PSW POP B POP ACC RETI PUSH PUSH PUSH PUSH PUSH PUSH ACC B PSW AR5 AR6 AR7 MOV A,y ................................... MOV x,A POP POP POP POP POP POP RETI AR7 AR6 AR5 PSW B ACC Wybór banku rejestrów - PSW x=(y+x)+(y-w)+(3+y-z)-(w+z)*(2*y-x); } dr inŜ. Stefan Brock 2008/2009 .................................... MOV PSW,#08H - RS1=0, RS0=1 - wybór banku 1 MOV MOV PSW,#010H - RS1=1, RS0=0 - wybór banku 2 PSW,#010H .................................... dr inŜ. Stefan Brock 2008/2009 Rozmieszczenie banków rejestrów Źródła przerwań w uC 831 • Przerwania zewnętrzne INT0, INT1 – aktywne poziomem lub zboczem • Przerwania od Timerów T0, T1 – w momencie przepełnienia • Przerwanie od portu szeregowego – pusty bufor nadajnika lub pełny bufor odbiornika dr inŜ. Stefan Brock 2008/2009 • • • • • • WDS - Watchdog Timer PSMI - Power Supply Monitor ADCI - Analog Digital Converter SPI-I2C - magistrale szeregowe TF2 - Timer 2 Flag TII - Time interval counter dr inŜ. Stefan Brock 2008/2009 8 Kolejność sprawdzania przerwań w ramach tego samego poziomu - uC 831 Wektory przerwań w uC 831 Source Vector Address IE0 0003H TF0 ` 000BH IE1 0013H TF1 001BH RI + TI 0023H TF2+EXF2 002BH ADCI 0033H I2CI+ISPI 003BH PSMI 0043H TII 0053H WDS 005BH dr inŜ. Stefan Brock 2008/2009 dr inŜ. Stefan Brock 2008/2009 Rejestry sterowania przerwaniami Rejestr IE • IE Interrupt Enable Register - adresowany bitowo • IP Interrupt Priority Register - adresowany bitowo • IEIP2 Secondary Interrupt Enable Register - adresowany bajtowo Bit Name Description 7 EA Enable All Interrupt 6 EADC Enable ADC Interrupt 5 ET2 Enable Timer 2 Interrupt 4 ES Enable UART Serial Port Interrupt 3 ET1 Enable Timer 1 Interrupt 2 EX1 Enable External Interrupt 1 1 ET0 Enable Timer 0 Interrupt 0 EX0 Enable External Interrupt 0 dr inŜ. Stefan Brock 2008/2009 dr inŜ. Stefan Brock 2008/2009 Rejestr IP Bit Name Description (Interrupt Priority 1=High 0=Low) 7 ---- Reserved for Future Use 6 PADC ADC 5 PT2 Timer 2 4 PS UART Serial Port 3 PT1 Timer 1 2 PX1 External Interrupt 1 PT0 Timer 0 0 PX0 External Interrupt 0 dr inŜ. Stefan Brock 2008/2009 Nr w języku C 0 1 2 3 4 liczone jako 5 wielokrotność 6 przesunięcia 7 o 8 bajtów 8 10 11 Rejestr IEIP2 Bit Name Description 7 ---- Reserved for Future Use 6 PTI 5 PPSM Priority - Power Supply Monitor Interrupt Priority - Time Interval Interrupt 4 PSI Priority for SPI/I2C Interrupt 3 ---- This Bit Must Contain Zero 2 ETI Enable Time Interval Counter Interrupt 1 EPSMI Enable Power Supply Monitor Interrupt 0 ESI Enable SPI/I2C Serial Port Interrupt dr inŜ. Stefan Brock 2008/2009 9