;-----------------------------------------------------------------------
; TXSER.ASM - Programma dimostrativo per l'invio seriale di dati
; By Claudio Fin 2001 - Ultimo aggiornamento 11-4-2004
;-----------------------------------------------------------------------
; USO PORTE:
;
; RA0 out
; RA1 out
; RA2 out
; RA3 out
; RA4 out(oc)   Uscita seriale
;
; RB0 in(p-up)  Ingresso 0
; RB1 in(p-up)  Ingresso 1 
; RB2 in(p-up)  Ingresso 2
; RB3 in(p-up)  Ingresso 3
; RB4 in(p-up)  Ingresso 4
; RB5 in(p-up)  Ingresso 5
; RB6 in(p-up)  Ingresso 6
; RB7 in(p-up)  Ingresso 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         TXOUT       PORTA,4        ;PIN da cui trasmettere
BL              EQU         12             ;numero di bit da trasmettere
CL              EQU         13             ;contatore ritardo durata bit
DL              EQU         14             ;dato da trasmettere
RITARDO1        EQU         15
RITARDO2        EQU         16

;-----------------------------------------------------------------------
; PROGRAMMA
;-----------------------------------------------------------------------
                ORG         0

;----------PREDISPOSIZIONE PORTE

                MOVLW       10000B
                MOVWF       PORTA          ;prescrive valore su PORTA
                BANK1
                CLRF        TRISA          ;Predispone porta A come uscite
                BCF         OPTION_REG,7   ;Attiva pull-ups su porta B
                BANK0

;----------CICLO PRINCIPALE DEL PROGRAMMA

MAINLOOP        MOVF        PORTB,W        ;legge porta B
                CALL        SERTX          ;trasmette il byte
                MOVLW       12             ;cicli di ritardo
                MOVWF       RITARDO1
                CLRF        RITARDO2
                DECFSZ      RITARDO2,F
                GOTO        $-1
                DECFSZ      RITARDO1,F
                GOTO        $-3
                GOTO        MAINLOOP
;-----------------------------------------------------------------------
; Subroutine trasmissione seriale 9600 8-N-1 (4MHz clock)
; Si deve definire il pin da usare come trasmissione "TXOUT"
; ad esempio con: #DEFINE TXOUT PORTA,4
;
; Questo pin all'accensione andra' settato come uscita e
; tenuto normalmente a 1.
;
; Variabili di lavoro necessarie:
;
; BL            EQU         ...          ;numero di bit da trasmettere
; CL            EQU         ...          ;contatore ritardo durata bit
; DL            EQU         ...          ;dato da trasmettere
;
; Per trasmettere un byte si deve caricare il suo
; valore in W ed effettuare una call a SERTX.
; Attenzione: prima di chiamare la routine deve
; essere attivo il banco 0.
;-----------------------------------------------------------------------
SERTX           MOVWF       DL
                BCF         STATUS,C
                MOVLW       10
                MOVWF       BL
TX001           BTFSS       STATUS,C
                GOTO        $+4
                NOP
                BSF         TXOUT
                GOTO        $+4
                BCF         TXOUT
                NOP
                NOP
                MOVLW       30
                MOVWF       CL
                DECFSZ      CL,F
                GOTO        $-1
                BSF         STATUS,C
                RRF         DL,F
                DECFSZ      BL,F
                GOTO        TX001
                RETURN
;-----------------------------------------------------------------------
                END