; Assembly PIC18 - Versione 0.1 - Agosto 2017 ; Copyright (c) 2016-2017, Vincenzo Villa ; Creative Commons | Attribuzione - Condividi allo stesso modo 4.0 Internazionale (CC BY-SA 4.0) ; Creative Commons | Attribution-Share Alike 4.0 Unported ; https://www.vincenzov.net/tutorial/PIC18/assembly/uart.htm ; PIC18F26K20 / MPLAB X 3.55 / MPASM v5.72 ; Trasmissione seriale asincrona di una stringa #include "p18f26k20.inc"; il file con la definizine dei registri specifici del PIC in uso EXTERN init_data ; Subroutine di inizializazione (in idata.asm) UDATA_ACS ritardo res 2 ; Contatore utilizzato nel ciclo di ritardo idata_message IDATA_ACS hello db "Hello World\0" ; Stringa di saluto ; ***************************************************************************** CODE 0x0000 ; vettore di reset, indirizzo 0. Il codice inizia qui call init_data ; Inizializza le variabili call configura_IeO ; Configura le porte di Input/Output (opzionale) call configura_uart ; Configurazione della periferica EUSART ; Invia "Hello World " ancora lfsr FSR0, hello ; Punta all'inizio del buffer da trasmettere next_byte clrf WREG ; Stringa terminata (carattere NULL)? cpfseq INDF0 bra invia ; No: trasmette il byte bra invia_CR_LR ; Si: trasmette un "a capo" (CR+LF) invia movf POSTINC0, W ; Copia in WFEG il byte e punta al byte successivo call invia_byte ; Trasmette WREG bra next_byte ; Passa al byte sucessivo invia_CR_LR movlw 0x0D ; Trasmissione di Carriage Return call invia_byte movlw 0x0A ; Trasmissione di Line Feed call invia_byte call delay ; Attesa di circa un secondo bra ancora ; Ricomincia da capo ; ***************************************************************************** ; Trasmette il byte contenuto in WREG, aspettando l'effettivo invio prima di ritornate invia_byte movwf TXREG ; Scrive WREG nel regisro di trasmissione: inizia la trasmissione nop ; Attendi un'istruzione (richiesto per il corretto funzionamento) attendi btfss PIR1, TXIF ; Byte trasmesso? bra attendi ; No, attendi return ; Trasmissione completata ; ***************************************************************************** ; Configura l'EUSART per trasmissione asincrona: 9600 bit/s asincroni configura_uart movlw D'25' ; Inizializza il registro a 16 bit del generatore di Baud Rate movwf SPBRG ; Tabella 18.5 movlw 0 movwf SPBRGH bsf TXSTA, BRGH ; Tabella 18.5 bsf BAUDCON, BRG16 ; Tabella 18.5 bsf TRISC, TX ; Imposto come ingresso il pin di trasmissione bsf RCSTA, SPEN ; Attivo la periferica EUSART bcf TXSTA, SYNC ; Attivo la modalità asincrona bsf TXSTA, TXEN ; Attivo il trasmettitore return ;***************************************************************************** ; Ciclo di ritardo - 800 ms (circa) @ 1 MHz delay movlw 0xFF ; Imposta il ritardo a 0xFFFF (max) movwf ritardo+1 movwf ritardo ripeti decfsz ritardo ; decrementa la variabile contatore (LSB) e salta ; l'istruzione seguente quanto contatore.LSB=0 bra ripeti ; ripeti decfsz ritardo+1 ; decrementa la variabile contatore (MSB) e salta ; l'istruzione seguente quanto contatore.MSB=0 bra ripeti ; ripeti return ;***************************************************************************** configura_IeO ; (esempio) clrf TRISC ; Imposta PORTC come uscita clrf LATC ; Tutte le uscite di PORTC a zero (LED spenti) return END ; Fine del file