MIKROPROCESORY – architektura i programowanie
Transkrypt
MIKROPROCESORY – architektura i programowanie
MIKROPROCESORY – architektura i programowaniewykład dla IV roku WIEiK (2003/2004) Przykład programu do obsługi komunikacji po magistrali 8-bitowej wg. własnego protokołu. (Fragmenty “widziane” przez komputer “master”) Kontynuując nasze studia nad oprogramowaniem µkontrolerów na przykładzie komunikacji równoległej pomiędzy układami wieloprocesorowymi poznamy dwie wersje programu dla komputera “master”. Założenia dotyczące trybu pracy, funkcji i treści komunikatów są takie jak poprzednio. Sygnały, które były zewnętrznymi przerwaniami (INT0 i INT1) dla poznawanych poprzednio programów procesorów “slave” są tu zwykłymi sygnałami wyjściowymi wytwarzanymi przez programowe sterowanie liniami portu P1 (P1.1 = AST Address Strobe i P1.0 = DST DataSTrobe) . Przeanalizowanie istotnych fragmentów kodów obydwu programów, poznanego poprzednio programu “slave” i poniższego “master”, pozwala zrozumieć szczegóły dialogu, protokołu wybranego dla tej transmisji równoległej, a w szczególności współzależności czasowe sygnałów generowanych i odbieranych przez poszczególne procesory. MIKROPROCESORY – architektura i programowaniewykład dla IV roku WIEiK (2003/2004) Wersja programu “master” dla asemblera i µkontrolera 89C52 Fragment kodu z częścią deklaracji zmiennych ... STACK DATA 0E0H $MOD812 ;=================================================================== ; DEFINITIONS ;=================================================================== ; STACK DATA70H STATUS DATA22H ;adressable bits 17 - 10 ; LICZRB EQU 06H LICZSB EQU 0DH LIJAN EQU 011H LISJA EQU 08H THSET EQU 0FDH ;19200 baud rate with Timer1 (if SMOD) ; FLBOA DATA30H MASK DATA31H BOS DATA32H BOS1 DATA33H BOS2 DATA34H ; CHASH DATA35H PWRL DATA36H HV_LV DATA37H ; MIKROPROCESORY – architektura i programowaniewykład dla IV roku WIEiK (2003/2004) ; RBUF SETBU ; DST AST R_W RESET ACK IREQ ONOFF CSEG ORG DATA40H DATA60H BIT BIT BIT BIT BIT BIT BIT P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 000H AJMP START ;==================================================================== ; PROCEDURE DELAY 100ms (assume 8Mhz clock) DELAY: PUSHACC PUSHB MOV B,#167 ;167 * 600us = 100.2ms DLY001: MOV A,#200 ;200 * 2 * 1.5us= 600us DJNZ ACC,$ ;sit here for 600us DJNZ B,DLY001 ;repeat 167 times ; POP B POP ACC RET ;----------------------------------------------------------------------------------------------- MIKROPROCESORY – architektura i programowaniewykład dla IV roku WIEiK (2003/2004) ; SENDCHAR SENDCHAR: ; sends ASCII value contained in A to UART JNB TI,$ ; wait til present char gone CLR TI ; must clear TI MOV SBUF,A RET ;____________________________________________________________________ ; SENDSTRING SENDSTRING: ; sends ASCII string to UART starting at location ; DPTR and ending with a null (0) value PUSHACC PUSHB CLR A MOV B,A IO0010: MOV A,B INC B MOVC A,@A+DPTR JZ IO0020 ACALL SENDCHAR SJMP IO0010 IO0020: POP B POP ACC RET ;____________________________________________________________________ MIKROPROCESORY – architektura i programowaniewykład dla IV roku WIEiK (2003/2004) ; GETCHAR GETCHAR: ; waits for a single ASCII character to be received ; by the UART. places this character into A. JNB RI,$ MOV A,SBUF CLR RI RET ;---------------------------------------------------------------------------------------------------START: MOV SP,#STACK ANL STATUS,#00H ;clear STATUS ; ; initiate timer and serial transmission MOV SCON,#52H ;SERIAL MODE 1,READ ENBL, TI UP ; MOV PCON,#80H ;double speed (for 19200 now) MOV TMOD,#021H ;T1 mode2, T0 mode1 MOV TH1,#THSET MOV TL1,#THSET MOV TH0,#00H MOV TL0,#00H CLR RI SETB TI ; SETB EA ;allow interrupts SETB ET0 ;Timer0 ; SETB P1.4 ;ACK , DIGITAL READ SETB TR1 ;start timer1 MIKROPROCESORY – architektura i programowaniewykład dla IV roku WIEiK (2003/2004) ; tutaj następują części programu, które opuszczamy ; ....... ; set or read ? albo: ACALL GETCHAR ;czytanie znaku, ktory wybiera jedna z funkcji programu CJNE A,#031H,nonof ; skok, gdy to nie ten znak (ASCII 0x31) ;--------------------------------------------------------; read mask (HV) from operator and send to bus ; (włączanie i wyłącznie “podległych” kontrolerów na wybranej BOARD, wg. MASK ACALL GETCHAR MOV FLBOA,A ACALL GETCHAR MOV MASK,A ; CLR R_W ;master wybiera kierunek transportu MOV P2,FLBOA ;ustawienie adresu na linie do wysłania CLR P3.5 ;CHIP ENABLE – uaktywnienie układu pośredniczącego CLR AST ;To dedcyduje o przerwaniach INT0 w kontrolerach “podległych” JNB ACK,$ ;oczekiwanie na potwierdzenie SETB AST ;”zdjęcie” wymuszenia przerwań SETB P3.5 ; MOV P2,MASK ;ustawienie byte danych na linie (też) do wyslania CLR P3.5 JB ACK,$ ;sprawdzenie, czy poprzednie potwierdzenie skasowane CLR DST ;To spowoduje INT1 w zaadresowanym poprzednio procesorze JNB ACK,$ ;oczekiwanie na potwierdzenie odebrania danych SETB DST SETB P3.5 AJMP albo MIKROPROCESORY – architektura i programowaniewykład dla IV roku WIEiK (2003/2004) Nordch: ;inna funkcja – master wysyla do kontrolera BOARDu ;żądanie przysłania danych z podprocesora CHASH CJNE A,#063H,nordlv ;-------------------------------------------; send channel no and read buffer by bus then send by serial ACALL GETCHAR ;odbieramy adres podleglego kontrolera MOV FLBOA,A ACALL GETCHAR ; oraz jego kolejnego podleglego MOV CHASH,A ; CLR R_W ;przygotowanie do wysylania MOV P2,FLBOA CLR P3.5 CLR AST ; znany nam juz dialog JNB ACK,$ SETB AST SETB P3.5 ; MOV P2,CHASH CLR P3.5 JB ACK,$ CLR DST ; powtorzony dla wybranego podleglego JNB ACK,$ ; by podac mu numer jego “slave”, ktorego raport jest SETB DST ; oczekiwany SETB P3.5 ; SETB R_W ;ustawiamy tor na czytanie MOV P2,#0FFH ;takze rejestr portu ! CLR P3.5 ; MIKROPROCESORY – architektura i programowaniewykład dla IV roku WIEiK (2003/2004) MOV R0,#RBUF MOV R1,#LIJAN ;dane beda przychodzi do bufora RBUF ;znana jest liczba oczekiwanych byte'ów danych JB ACK,$ CLR DST JNB ACK,$ MOV @R0,P2 SETB DST INC R0 DJNZ R1,agjr ;pętla dla wczytania LIJAN bytów ; agjr: ; SETB P3.5 MOV R0,#RBUF MOV R1,#LIJAN ; agjs: ;Raport zostanie odesłany “wyżej” po łączu szeregowym MOV ACALL A,@R0 SENDCHAR INC DJNZ R0 R1,agjs MOV ACALL DPTR,#SEPERATOR SENDSTRING ; ; ; AJMPalbo ; nordlv: ;poczatek innej funkcji i kontynuacja programu MIKROPROCESORY – architektura i programowaniewykład dla IV roku WIEiK (2003/2004) Jako interesujące porównanie oraz dla późniejszych wykładów o mikrokontrolerach RISK przeanalizyjemy jedną z funkcji omawianych dla 89C52 zapisaną w C dla 8-bitowego kontrolera Atmega 103/128: czytanie danych o wybranym, podległym procesorze na wybranej BOARD BOOL read_chann_LV (BYTE nr_card, BYTE nr_chann, BYTE bufinLV[]) /* bufinLV[0]= STATUS, bufinLV[1] = Vcc (in 20 mV units) bufinLV[2] = Icc (in 10 mA units) bufinLV[3] = Vccout (in 50 mV units) bufinLV[4] = Vccret (in 20 mV units) bufinLV[5] = Vdd (in 20 mV units) bufinLV[6] = Idd (in 10 mA units) bufinLV[7] = Vddout (in 50 mV units) bufinLV[8] = Vddret (in 20 mV units) bufinLV[9] = Vpin (in 50 mV units) bufinLV[10]= Ipin (in 0.01 mA units) bufinLV[11]= VCSel (in 40 mV units) bufinLV[12]= Ivcsel (in 0.1 mA units) bufinLV[13]= Module temp sensor1 voltage (in 2.5 mV) bufinLV[14]= " " " " bufinLV[15]= Module temp sensor2 voltage (in 2.5 mV) bufinLV[16]= " " " " */ { BYTE FLBOA, CHASH; UINT16 j; if (nr_card % 3 != 1) return FALSE; if (nr_chann < 0 | nr_chann > 3 ) return FALSE; MIKROPROCESORY – architektura i programowaniewykład dla IV roku WIEiK (2003/2004) PORTD |= 0x78; DDRD |= 0x78; DDRE &= 0xEF; PORTE |= 0x10; //D.6 DST, D.5 RESET, D.4 R_W, D.3 AST // ALL OUTPUT // E.4 INPUT (acknowlege) // E.4 INPUT FLBOA=nr_card; CHASH=nr_chann * 32; // S, B bits not set (of SBRbbbbb) // Jan's folklore // SEND THE REQUEST I.E. 2 BYTES: BOARD ADDRESS AND CHANNEL NUMBER //an unassociated ACK should never be on the bus while (!(PINE & 0x10)) NOP(); //some spec diagnostics needed !!! // send address DDRA = 0xFF; // Adress out PORTA = FLBOA; CLEARBIT(PORTD, 4); //R_W, ACTIVE LOW = ATMEGA WRITES TO THE BUS CLEARBIT(PORTD, 3); //AST, ACTIVE LOW while (PINE & 0x10) NOP(); // here some timeout needed! SETBIT(PORTD, 3); //TAKE address STROBE OUT while (!(PINE & 0x10)) NOP(); //see if ACKN taken out PORTA = CHASH; //OK so position and send the channel nr CLEARBIT(PORTD, 6); //DST, ACTIVE LOW while (PINE & 0x10) NOP(); //wait for acknowlege SETBIT(PORTD, 6); //GET DST OUT MIKROPROCESORY – architektura i programowaniewykład dla IV roku WIEiK (2003/2004) // READ DATA ON REQUESTED CHANNEL SEND BY CARD CONTROLLER DDRA = 0x00; //Direction: input PORTA = 0xFF; //needed? SETBIT(PORTD, 4); //R_W UP. ATMEGA READS NOW for(j=0; j<17; j++) //0=STATUS, 1=4 high bits of voltage { while (!(PINE & 0x10)) NOP(); //see if ACKN taken out CLEARBIT(PORTD, 6); //Data strobe LOW = REQUEST DATA BYTE while (PINE & 0x10) NOP(); //wait for acknowlege = DATA READY bufinLV[j] = PINA; //SO TAKE IT SETBIT(PORTD, 6); //AND get Data strobe out } return TRUE; }