; Assembly PIC18 - Versione 0.1 - Aprile 2018 ; Copyright (c) 2016-2018, 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_rx.htm ; PIC18F26K20 / MPLAB X 4.15 / MPASM v5.77 ; Ricezione UART #include "p18f26k20.inc"; il file con la definizine dei registri specifici del PIC in uso UDATA_ACS dato res 1 ; Byte ricevuto da UART CODE 0x0000 ; vettore di reset, indirizzo 0. Il codice inizia qui call configura_IeO ; Configura le porte di Input/Output (opzionale) call configura_uart ; Configurazione della periferica EUSART ricomincia call ricevi_byte ; Leggi un byte, se arrivato bnc ricomincia ; Il flag C non è settato -> nessun byte arrivato ; Attendi un altro byte movwf dato ; Memorizza il byte ricevuto sublw "A" ; Il dato ricevuto è una "A" maiuscola? bz ricevuta_A ; Esegui il codice corrispondente movf dato, W sublw "a" ; Il dato ricevuto è una "a" minuscola? bz ricevuta_a ; Esegui il codice corrispondente bra ricomincia ; Nessun dato utile. Attendi un altro byte ricevuta_A bsf LATC, RC0 ; A -> Accendi RC0 bra ricomincia ; Attendi un altro byte ricevuta_a bcf LATC, RC0 ; a -> spegni RC0 bra ricomincia ; Attendi un altro byte ; ***************************************************************************** ; Se è arrivato un byte da UART, lo salva in WREG, setta il flag C e ritorna ; Se nessun byte è arrivato da UART, azzera il flag C e ritorna ricevi_byte btfss PIR1, RCIF ; Se RCIF è settato, un byte è arrivato bra nessun_dato ; Nessun byte è arrivato dato_arrivato ; Un byte è arrivato movf RCREG, W ; Sposta in WREG il byte ricevuto bsf STATUS, C ; Segnala tramite il flag carry (1 = arrivato) return ; Torna nessun_dato ; Nessun byte è arrivato bcf STATUS, C ; Segnala tramite il flag carry (0 = non arrivato) return ; Torna ; ***************************************************************************** ; 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 TRISC, RX ; Imposto come ingresso il pin di ricezione bsf RCSTA, SPEN ; Attivo la periferica EUSART bsf RCSTA, CREN ; Attivo il ricevitore bcf TXSTA, SYNC ; Attivo la modalità asincrona bsf TXSTA, TXEN ; Attivo il trasmettitore 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