; ********************************************************************** ; * File Demo_ppi.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 10.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 il pc e di far scorrere ; l'accensione di un led in una sola direzione utilizzando i led di ; entrambi i port, in sequenza, dell'82c55. Inoltre al termine dello ; spazzolamento, ossia, quando il led acceso è l'ultimo del port 1 (LD16) ; viene emesso un souno tramite il buzzer. ; Perchè questo avvenga bisogna mettere il jumper J10 in posizione 2-3, il ; quale collega il buzzer, appunto, alla sezione 1; l'emissione del souno ; avviene mediante la generazione di un'onda quadra sulla linea del port 1 ; che gestisce quel led. ; 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 PDB EQU 0FF51H ;con: FF00H (indirizzo abaco I/O bus GPC 324), PDC EQU 0FF52H ;50H (indirizzo mappaggio ETI 324) e 0..3 CNT EQU 0FF53H ;offset per i singoli registri dati). ; ; Gestione memorie ; INIT EQU 82H ;modo 0,port A e C in output,port B in input PORTA EQU 08H ;indirizzo di memoria interna contenente il valore rel. del port A PORTC EQU 09H ;indirizzo di memoria interna contenente il valore rel. del port C TXCHAR EQU 0DH ;indirizzo di memoria contenente il valore da trasmettere sulla seriale DELAY EQU 11H ;variabile utilizzata nella procedura di ritardo di 100 usec (DELAY100) ; ; Inizio programma (main) ; ORG 2050H ;Inizio del codice in memoria 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 ;inizializza la seriale MOV DPTR,#HEADING ;stampo a monitor la stringa "HEADING" ACALL STRING ; CYCLE_LED: MOV PORTA,#0FEH ;accendo il primo led del port0 MOV PORTC,#0FFH ;tengo spenti i led del port1 MOV R0,#08 ;inizializzo il contatore x eseguire otto cicli CYCLE_A: MOV R2,#256 ;registro usato nella procedura DELAY100 ACALL DELAY100 ;richiamo procedure x il ritardo ACALL OUTPORTAC ;procedura che visualizza il contenuto delle variabili MOV A,PORTA ;PORTA e PORTC sui led della DEB01 RL A ;shift del led acceso verso sinistra MOV PORTA,A DJNZ R0,CYCLE_A ;qui finisce il ciclo delle accensioni del port0 MOV PORTA,#0FFH ;una volta finite le accensioni del port0,si spengono tutti i led MOV PORTC,#0FEH ;primo led acceso del port1 MOV R0,#08 ;inizializzo contatore x altri otto cicli CYCLE_C: MOV R2,#256 ;registro usato nella procedura del ritardo ACALL DELAY100 ACALL OUTPORTAC ;questa volta visualizzo PORTC MOV A,PORTC RL A MOV PORTC,A CJNE R0,#01,BUZZER ;controllo se lo shift è arrivato all'ultimo led ACALL SOUND BUZZER: DJNZ R0,CYCLE_C ;qui finisce il ciclo delle accensionidel port1 MOV PORTC,#0FFH ;una volta finite le accensioni del port1,si spengono tutti i led AJMP CYCLE_LED ; ; Procedura per la rappresentazione sui Port A e C del dato acquisito ; OUTPORTAC: PUSH PSW ;salvo i registri utilizzati nella 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 sul port A MOV A,PORTC ;mette la variabile PORTA in ACC MOV DPTR,#PDC ;carico l'indirizzo del PORTA MOVX @DPTR,A ;pone il dato sul port A POP ACC ;ripristino i suddetti registri POP DPH POP DPL POP PSW RET ; ; 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 ; ; Procedura per l'emissione del suono dal buzzer della DEB 01 ; SOUND: MOV R5,#256 ;contatore esterno per la durata del beep CYCLEBUZ: MOV R4,#200 ;contatore per la durata del livello alto dell'onda MOV PORTC,#7FH ;pongo l'ultimo led acceso ACALL OUTPORTAC ;richiamo la procedura per visualizzare quest'ultimo BUZ1: DJNZ R4,BUZ1 MOV R4,#150 ;contatore per la durata del livello basso dell'onda MOV PORTC,#0FFH ;spengo l'ultimo led ACALL OUTPORTAC BUZ2: DJNZ R4,BUZ2 DJNZ R5,CYCLEBUZ ;il ciclo si ripete per la durata del beep RET ; ; Procedura che consente la trasmissione di dati 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 ;scrive nel buffer della seriale il car. da trasmettere POP PSW ;ripristino PSW RET ; ; Procedura per scrivere parti di testo via seriale ; STRING: PUSH PSW ;salvo 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 sopra indicati POP ACC POP PSW RET ; ; Procedura fissa che crea un ritardo di circa 100 microsecondi variabile moltiplicando R2 ; DELAY100: MOV DELAY,#100 DJNZ DELAY,$ DJNZ R2,DELAY100 RET ; ; HEADING: DB 0CH,' MAPPARE LA ETI 324 CON INDIRIZZO 50H!' DB 1DH,' Fa scorrere la accensione di un led in una sola direzione,',1DH,' con emissione di un suono alla fine dello spazzolamento.',00H END