; **********************************************************************
; * File S1DEB1.asm scheda: GPC 324+ETI 324 con SXA51 *
; * GRIFO(R) via Dell'Artigiano 8/6 40016 S. Giorgio di Piano (BO) *
; * Tel. +39 051 892052 Fax. +39 051 893661 *
; * http://www.grifo.it http://www.grifo.com *
; * by Alessio Francesconi del 08.09.04 *
; **********************************************************************
; Programma di esempio per la sezione 1 della DEB 01, comandata da
; una GPC 324 connessa a una ETI 324.
; Tale sezione è composta da 16 tasti collegati a 16 led: la
; pressione di uno o più,di questi tasti determina lo stato logico
; 0 sulla linea, e l'accensione del led corrispondente via hardware.
; Questo programma ha il compito di comunicare con un pc via seriale
; (bit per carat.=8, stop bit=1, no parity, com.=asincrona, baud rate=19200),
; e di attivare i led del port 0 della DEB 01 la combinazione
; binaria del dato esadecimale (da 0 a F maiuscoli o minuscoli che siano)
; immesso tramite la tastiera del sistema di sviluppo.
; Tale codice esadecimale viene anche rappresentato sul monitor.
; Per comunicare con la ETI 324 occorre mappare questa all'indirizzo 50H.
; Per i movimenti e posizionamenti del cursore sono state
; adoperate alcune sequenze di comando secondo lo standard ADDS Viewpoint
; (vedi manuale GET51).
; Il collegamento è realizzato tramite un flat 26 vie che congiunge il
; connettore CN1 della GPC 324 con il connettore CN1 della ETI 324,e il
; connettore CN3 della stessa ETI 324 con il CN15 della DEB 01.
;
;
; Indirizzi delle periferiche di bordo
;
PDA EQU 0FF50H ;indirizzo registri dati dell'82c55 ottenuto
PDC EQU 0FF52H ;con: FF00 (indirizzo abaco I/O bus GPC 324),
CNT EQU 0FF53H ;50H (indirizzo mappaggio ETI 324) e 0..3
;offset per i singoli registri).
;
;
; Indirizzi gestione memorie
;
INIT EQU 8BH ;modo 0,port A output,port B e C input
RXCHAR EQU 0CH ;variabile contenente il valore ricevuto dalla seriale
TXCHAR EQU 0DH ;variabile contenente il valore da trasmettere ...
PORTA EQU 08H ;indirizzo di memoria interna contenente il valore rel. del portA
RECEIVED EQU 01H ;bit di ricezione della seriale:1 ricevuto,0 nulla
BITH EQU 09H ;indirizzo x caratteri esadecimali:0 car. non esadec.,1 x car. esadec.
;
; inizio programma principale
;
ORG 2050H ;Inizio della parte eseguibile
MOV DPTR,#CNT ;carica nel DPTR l'indirizzo del registro di controllo del 82C55
MOV A,#INIT ;carica in A il valore da scrivere nel registro di controllo del 82C55
MOVX @DPTR,A ;scrive nel registro di controllo dell'82C55 la parola di controllo
MOV SP,#2FH ;inizializzo il puntatore della prima locazione libera dello stack
CLR RS0 ;imposto l'indirizzo di memoria dei registri (00H-07H)
CLR RS1
ACALL SERIAL
MOV DPTR,#HEADING ;stampo a monitor la stringa "HEADING"
ACALL STRING
;
CYCLE: ACALL RICSER ;qui parte il ciclo richiamando la procedura
;della ricezione seriale
JNB RECEIVED,CYCLE
MOV TXCHAR,RXCHAR ;metto in tx quello che ho ricevuto
ACALL TRASMSER
MOV PORTA,TXCHAR ;metto sul port A il dato letto se si tratta
ACALL PORTLED ;di un valore esadecimale
MOV TXCHAR,#08H ;ritorna a sinistra di un carattere
ACALL TRASMSER
SJMP CYCLE ;salta alla rilettura del portC
;
; Procedura di inizializzazione seriale
;
SERIAL: PUSH PSW ;salvo PSW
MOV SCON,#50H ;seleziono modo 1, rx attivo
MOV TH1,#253 ;imposto a 253 il TH1
ANL PCON,#7FH ;azzero il bit 7 del PCON (SMOD):imposto baud rate
POP PSW ;ripristino PSW
RET
;
; Trasmissione in seriale di una stringa contenuta in memoria
;
STRING: PUSH PSW ;salvo i registri utilizzati dalla procedura
PUSH ACC
PUSH TXCHAR
STRINGLOOP: MOVX A,@DPTR ;carica in A il contenuto della memoria puntata da DPTR
JZ ENDSTRING ;se l'ultimo carattere letto e' nullo (00H) salta alla fine
MOV TXCHAR,A ;carica il carattere nella variabile per la trasmissione
ACALL TRASMSER ;trasmetti il carattere
INC DPTR ;incrementa il puntatore al carattere
SJMP STRINGLOOP ;il ciclo riparte per un altro carattere
ENDSTRING: POP TXCHAR ;ripristina i registri utilizzati dalla procedura
POP ACC
POP PSW
RET
;
; Proceura di attesa per la ricezione seriale
;
RICSER: PUSH PSW ;salvo i registri usati dalla procedura
PUSH 0
PUSH 1
MOV R0,90 ;90 ripetizioni del ciclo di ritardo
MOV R1,250 ;250 ripetizioni del ciclo di controllo ricezione
LOOP0: JBC RI,LOOP1 ;salta a LOOP1 se RI = 1 e azzera RI
DJNZ R0,$ ;decrementa R0 e salta alla stessa istruzione
DJNZ R1,LOOP0 ;decrementa il valore contenuto in R1
;salta a LOOP0 se in R1 non si trova uno 0
CLR RECEIVED ;se non ricevo nulla azzero RECEIVED
SJMP END_REC ;salta alla fine della procedura
LOOP1: MOV RXCHAR,SBUF ;salvo il valore ricevuto sulla seriale in RXCHAR
SETB RECEIVED ;imposto a 1 il bit di avvenuta ricezione
END_REC: POP 1 ;ripristino i sudetti registri
POP 0
POP PSW
RET
;
; Procedura di trasmissione sulla seriale
;
TRASMSER: PUSH PSW ;salvo PSW
TRASM1: JBC TI,TRASM2 ;salta a TRASM2 se TI = 1 e azzera TI
SJMP TRASM1 ;salta a TRASM1 perche' TI = 0
;seriale ancora in fase di trasmissione
TRASM2: MOV SBUF,TXCHAR
POP PSW ;ripristino PSW
RET
;
; Pone il dato della seriale sul port0 della DEB
;
PORTLED: PUSH PSW ;salvo i registri utilizzati dalla procedura
PUSH DPL
PUSH DPH
PUSH ACC
PUSH 0
MOV A,PORTA ;carico in A il valore da controllare
CJNE A,#30H,NUM1 ;se A>=0 (30H) resetta C,se A<0 setta C
NUM1: JC CLEARH ;se A<0 il carattere non e' esadecimale
CJNE A,#39H,NUM2 ;se A<9 (39H) setta C,se A>=9 resetta C
SETB C
NUM2: JNC COUNT1 ;se A>9 salta a COUNT1
MOV R0,#48 ;ES: carattere 1 ascii: 49: 49 - 48 = 1
SJMP LEDOUT
COUNT1: CJNE A,#41H,HEXCHAR1 ;se A>=A(41H) resetta C,se A=F resetta C
SETB C
HEXCHAR2: JNC COUNT2 ;se A>F salta a COUNT2
MOV R0,#55 ;ES: carattere A ascii: 65: 65 - 55 = 10
SJMP LEDOUT
COUNT2: CJNE A,#61H,LETTER1 ;se A>=a(61H) resetta C,se A=f resetta C
SETB C
LETTER2: JNC CLEARH ;se A>f salta a CLEARH
MOV R0,#87 ;ES: carattere a ascii: 97: 97 - 87 = 10
LEDOUT: MOV A,PORTA ;carico in A il valore da gestire
CLR C
SUBB A,R0 ;per trasformare i valori ASCII delle lettere
CLR C
CPL A ;inverto i bit da visualizzare,led attivi
MOV PORTA,A ;mando il dato sul port A
ACALL OUTPORT
SETB BITH ;indico che il carattere è esadecimale
;settando il bit di memoria BITH
SJMP ENDOUT ;salto alla fine della procedura
CLEARH: CLR BITH ;indico che il carattere non è esadecimale
;resettando il bit di memoria BITH
ENDOUT: POP 0 ;ripristino i suddetti registri
POP ACC
POP DPH
POP DPL
POP PSW
RET
;
; Pone il dato della var. PORTA in output sul port0
;
OUTPORT: PUSH PSW ;salvo i registri utilizzati dalla procedura
PUSH DPL
PUSH DPH
PUSH ACC
MOV A,PORTA ;mette la variabile PORTA in ACC
MOV DPTR,#PDA ;carico l'indirizzo del PORTA
MOVX @DPTR,A ;pone il dato in A
POP ACC ;ripristino i suddetti registri
POP DPH
POP DPL
POP PSW
RET
;
;
HEADING: DB 0CH,' N.B. MAPPARE LA ETI 324 CON INDIRIZZO 50H!'
DB 1DH,' Riporta sul port 0, il codice esadecimale del tasto premuto',1DH,' dalla tastiera del -sistema di sviluppo-: ',00H
END