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;
}

Podobne dokumenty