;-----------------------------------------------------------------------
; RXSER.ASM - Programma dimostrativo per la ricezione seriale di dati
; By Claudio Fin 2001 - Ultimo aggiornamento 11-4-2004
;-----------------------------------------------------------------------
; USO PORTE:
;
; RA0 in       Ingresso seriale
; RA1 out
; RA2 out
; RA3 out
; RA4 out(oc)
;
; RB0 out      Uscita 0
; RB1 out      Uscita 1
; RB2 out      Uscita 2
; RB3 out      Uscita 3
; RB4 out      Uscita 4
; RB5 out      Uscita 5
; RB6 out      Uscita 6
; RB7 out      Uscita 7
;-----------------------------------------------------------------------

;-----------------------------------------------------------------------
; DEFINIZIONI
;-----------------------------------------------------------------------
                PROCESSOR   16F84a         ;clock 4 Mhz
                RADIX       DEC
                INCLUDE     "P16F84a.INC"
                __CONFIG    1111111110001b
#DEFINE         BANK0       BCF STATUS,RP0
#DEFINE         BANK1       BSF STATUS,RP0
#DEFINE         RXIN        PORTA,0
                ORG         12
BL              RES         1              ;numero bit da ricevere
CL              RES         1              ;contatore durata bit
DL              RES         1              ;valore ricevuto

;-----------------------------------------------------------------------
; PROGRAMMA 
;-----------------------------------------------------------------------
                ORG         0

;----------PREDISPOSIZIONE PORTE

                CLRF        PORTB          ;prescrive valore su PORTB
                BANK1
                CLRF        TRISB          ;Predispone porta B come uscite
                MOVLW       00001B
                MOVWF       TRISA          ;Predispone solo RA0 come input
                BANK0

;----------CICLO PRINCIPALE DEL PROGRAMMA

MAINLOOP        CALL        SERRX          ;riceve un byte
                MOVF        DL,W
                MOVWF       PORTB          ;lo scrive sulla porta B
                GOTO        MAINLOOP

;-----------------------------------------------------------------------
; Routine per ricezione seriale 9600 8-N-1 (Clock 4MHz)
;
; Si deve definire il pin da usare come ricezione "RXIN"
; ad esempio con: #DEFINE  RXIN  PORTA,0
;
; Variabili di lavoro necessarie:
;
; BL            RES          1              ;numero bit da ricevere
; CL            RES          1              ;contatore durata bit
; DL            RES          1              ;valore ricevuto
;
; Per ricevere un byte si chiama SERRX che restituisce in DL
; il byte ricevuto. Gli errori controllati sono la presenza
; di uno 0 dopo 1/2 bit dallo start e di un 1 dopo 9,5 bit.
; Se viene rilevato un errore la routine lo ignora e si
; rimette in ricezione, altrimenti ritorna al chiamante.
;
; Attenzione: prima di chiamare la routine deve essere attivo il banco0.
;-----------------------------------------------------------------------
SERRX       BTFSC       RXIN
            GOTO        $-1
            MOVLW       15
            MOVWF       CL
            DECFSZ      CL,F
            GOTO        $-1
            MOVLW       9
            MOVWF       BL
RX001       BCF         STATUS,C
            BTFSC       RXIN
            BSF         STATUS,C
            RRF         DL,F
            MOVLW       32
            MOVWF       CL
            DECFSZ      CL,F
            GOTO        $-1
            DECFSZ      BL,F
            GOTO        RX001
            BTFSC       STATUS,C
            GOTO        SERRX
            BTFSS       RXIN
            GOTO        SERRX
            RETURN
;-----------------------------------------------------------------------
           END