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