; 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 con interrupt #include "p18f26k20.inc"; il file con la definizine dei registri specifici del PIC in uso UDATA_ACS bufferRx res 1 ; Buffer temporaneo con il byte ricevuto da UART ; ***************************************************************************** CODE 0x0000 ; vettore di reset, indirizzo 0. Il codice inizia qui goto main ; ***************************************************************************** ; ************************ C O D I C E I N T E R U P T ********************** ; ***************************************************************************** ISR CODE 0x0008 ; Interrupt Service Routine (Legacy mode) btfsc PIR1, RCIF ; Se RCIF è settato, un byte è arrivato all'UART bra GestioneUART ; Esegue il codice corrispondente retfie FAST ; Nessuna interrupt riconosciuta... Indizio di un problema? GestioneUART ; Ricevuto un byte movff RCREG, bufferRx ; Salva il byte ricevuto nel buffer di ricezione ; Automaticamente azzera RCIF (se FIFO vuoto) call elaboraByte ; Elabora il codice ricevuto retfie FAST ; Torna ad eseguire il codice principale ; ***************************************************************************** ; Legge il byte dal buffer e accende (A) o spegne (a) RC0 elaboraByte movf bufferRx, W ; Leggi il dato ricevuto sublw "A" ; Il dato ricevuto è una "A" maiuscola? bz ricevuta_A ; Esegui il codice corrispondente movf bufferRx, W ; Leggi il dato ricevuto sublw "a" ; Il dato ricevuto è una "a" minuscola? bz ricevuta_a ; Esegui il codice corrispondente bsf LATC, RC1 ; Carattere sconosciuto -> Accendi RC1 - Errore! bra torna ; Attendi un altro byte ricevuta_A bsf LATC, RC0 ; A -> Accendi RC0 bra torna ; Attendi un altro byte ricevuta_a bcf LATC, RC0 ; a -> spegni RC0 bra torna ; Attendi un altro byte torna return ; ***************************************************************************** ; ************** P R O G R A M M A P R I N C I P A L E ********************** ; ***************************************************************************** main call configura_IeO ; Configura le porte di Input/Output call configura_uart ; Configurazione della periferica EUSART e dei buffer bsf INTCON, PEIE ; Abilito le interruzioni dalle periferiche bsf INTCON, GIE ; Abilito la CPU a ricevere interruzioni ricomincia ; Fai qualcosa bra ricomincia ; Loop infinito ; ***************************************************************************** ; Configura l'EUSART per trasmissione asincrona a 9600 bit/s ; Abilita gli interrupt ed un buffer software ; Descrizione del setup: 18.1.2.9 (Ricezione) ; 18.1.1.7 (Trasmissione) 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 bsf BAUDCON, BRG16 bsf TRISC, TX ; Imposto come ingresso il pin di trasmissione (strano...) 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 bsf PIE1, RCIE ; Abilita EUSART a generare un interrupt quando arriva un byte ; Ricordarsi di attivare anche PEIE e GIE return ;***************************************************************************** ; Configura altre periferiche, diverse da EUSART (esempio) configura_IeO ; clrf TRISC ; Imposta PORTC come uscita clrf LATC ; Tutte le uscite di PORTC a zero (LED spenti) return END ; Fine del file