Você está na página 1de 7

;*****************************************************

;* Programa PIC_RS232_F628.ASM
;* Estabelece comunicação serial RS232 com PC
;* a 9600bps, 8 bits de dados, sem paridade, 1 stop bit
;* Desenvolvido por : Marcio José Soares
;* Compilador MPLAB 6.32.00
;* PIC utilizado - PIC16F628A-I/P
;* Oscilador: interno a 4MHz
;*****************************************************
radix dec ;padrao->valores
decimal se nao informado outro
include <P16F628A.INC> ;inclue arquivo
__CONFIG _LVP_OFF & _MCLRE_OFF & _BODEN_OFF & _LVP_OFF & _CP_OFF & _PWRT
E_OFF & _WDT_OFF & _INTOSC_OSC_NOCLKOUT ;configura bits
;*****************************************************
;* Definições
;*****************************************************
#DEFINE bank0 BCF STATUS,RP0 ;seta banco 0 da memória
#DEFINE bank1 BSF STATUS,RP0 ;seta banco 1 da memória
PICRES equ 0x00
PICRAM equ 0x20
LED equ 0x00
;*****************************************************
;* Variáveis
;*****************************************************
org PICRAM ;inicio da RAM
T1 res 1 ;variável para temporizado
r
T2 res 1 ;variável para temporizado
r
T3 res 1 ;variável para temporizado
r
T4 res 1 ;variável para temporizado
r
AUX res 1 ;variável para dado recebi
do
;**************************************************************
;*define memoria de programa e vetor de reset
;**************************************************************
org PICRES ;reset
meureset:
goto inicio ;desvia do endereco 0x04 - interrupcao
;**************************************************************
;* endereço e rotina de interrupção
;**************************************************************
org 4 ;toda interrupção aponta para este endereço
minhaint:
goto IntVector ;desvia para tratamento da INT
;
;**************************************************************
;* inicio do programa
;**************************************************************
inicio:
movlw 0x00 ;ajuste para os bits INTCON
movwf INTCON
clrf PORTA
clrf PORTB
bank1 ;seleciona banco 1 para options e tris
movlw 0x00 ;ajusta como saída.
movwf TRISA ;
movlw 0x02 ;ajusta os bits em B como saida. RB1 é entrada
movwf TRISB ;coluna é saída, linha é entrada
bank0 ;volta ao banco 0... (padrão do reset)
;**************************************************************
;* seta canal serial no PIC
;**************************************************************
bank1 ;seleciona banco 1
movlw 0x19 ;velocidade selecionada 9600
movwf SPBRG ;8 bits, sem paridade, 1 stop bit
bsf TXSTA,TXEN ;habilita transmissao
bsf TXSTA,BRGH ;seleiona baud rate alto
bcf TXSTA,SYNC ;deleciona modo assincrono
bank0 ;volta para banco 0
bsf RCSTA,SPEN ;habilita port serial
bsf RCSTA,CREN ;habilita recepcao continua
bcf PIR1,RCIF ;limpa flag de interrupcao RCIF
bank1 ;seleciona banco 1
bsf PIE1,RCIE ;seta interrupçao RCIE
bank0 ;volta para banco 0
bsf INTCON,PEIE ;habilita perifericos
bsf INTCON,GIE ;habilita interrupçoes (Global)
movlw 0x07 ;desliga os conversores AD internos
movwf CMCON
;**************************************************************
movlw 0xFF ;carrega variável auxiliar
movwf AUX ;
bcf PORTA,LED ;apaga led
call _1000ms ;aguarda 1 segundo
call EnvMsg ;envia mensagem pela serial
;**************************************************************
;* loop principal
;* pisca led enquanto aguarda dado via RS232
;* trabalha com a INT de recepção
;**************************************************************
loop:
bsf PORTA,LED ;acende o led
call _1000ms
bcf PORTA,LED ;apada o led
call _1000ms
goto loop ;faz infinitamente
;***************************************************************
; subrotinas de interrupçoes
; salve o contexto geral se necessario - registros W, STATUS, etc
;***************************************************************
IntVector:
btfss PIR1,RCIF ;USART gerou int?
goto OutraInt ;nao, entao verifique outra int
movlw 0x06 ;mascara para bits
andwf RCSTA,W ;checa erros
btfss STATUS,Z ;encontrado erro???
goto RcvError ;sim, trata
movf RCREG,W ;Sem erros. Pega dado recebido
movwf AUX ;guarda caracter recebido
call enviaeco ;e envia mensagem e caracter de eco
goto IntEnd ;fim da int. Restaure o contexto se necessario
RcvError:
bcf RCSTA,CREN ;limpa status de recebimento
bsf RCSTA,CREN
goto IntEnd ;fim da int. Restaure o contexto se necessario
OutraInt:
goto $ ;não existe outra int. Apenas retorna
IntEnd:
retfie ;retorna da INT
;***************************************************************
; subrotinas para enviar mensagens via RS232
;***************************************************************
EnvMsg:
movlw 'T'
movwf TXREG ;envia caracter
call TestTx
movlw 'E'
movwf TXREG ;envia caracter
call TestTx
movlw 'S'
movwf TXREG ;envia caracter
call TestTx
movlw 'T'
movwf TXREG ;envia caracter
call TestTx
movlw 'E'
movwf TXREG ;envia caracter
call TestTx
movlw ' '
movwf TXREG ;envia caracter
call TestTx
movlw 'C'
movwf TXREG ;envia caracter
call TestTx
movlw 'O'
movwf TXREG ;envia caracter
call TestTx
movlw 'M'
movwf TXREG ;envia caracter
call TestTx
movlw '.'
movwf TXREG ;envia caracter
call TestTx
movlw ' '
movwf TXREG ;envia caracter
call TestTx
movlw 'R'
movwf TXREG ;envia caracter
call TestTx
movlw 'S'
movwf TXREG ;envia caracter
call TestTx
movlw '2'
movwf TXREG ;envia caracter
call TestTx
movlw '3'
movwf TXREG ;envia caracter
call TestTx
movlw '2'
movwf TXREG ;envia caracter
call TestTx
movlw 0x0D ;enter
movwf TXREG ;envia caracter
call TestTx
movlw 0x0A ;Line feed
movwf TXREG ;envia caracter
call TestTx
movlw 'T'
movwf TXREG ;envia caracter
call TestTx
movlw 'E'
movwf TXREG ;envia caracter
call TestTx
movlw 'C'
movwf TXREG ;envia caracter
call TestTx
movlw 'L'
movwf TXREG ;envia caracter
call TestTx
movlw 'E'
movwf TXREG ;envia caracter
call TestTx
movlw ' '
movwf TXREG ;envia caracter
call TestTx
movlw 'A'
movwf TXREG ;envia caracter
call TestTx
movlw 'L'
movwf TXREG ;envia caracter
call TestTx
movlw 'G'
movwf TXREG ;envia caracter
call TestTx
movlw 'O'
movwf TXREG ;envia caracter
call TestTx
movlw 0x0D ;enter
movwf TXREG ;envia caracter
call TestTx
movlw 0x0A ;line feed
movwf TXREG ;envia caracter
call TestTx
return
enviaeco:
movlw 'v'
movwf TXREG ;envia caracter
call TestTx
movlw 'o'
movwf TXREG ;envia caracter
call TestTx
movlw 'c'
movwf TXREG ;envia caracter
call TestTx
movlw 'e'
movwf TXREG ;envia caracter
call TestTx
movlw ' '
movwf TXREG ;envia caracter
call TestTx
movlw 't'
movwf TXREG ;envia caracter
call TestTx
movlw 'e'
movwf TXREG ;envia caracter
call TestTx
movlw 'c'
movwf TXREG ;envia caracter
call TestTx
movlw 'l'
movwf TXREG ;envia caracter
call TestTx
movlw 'o'
movwf TXREG ;envia caracter
call TestTx
movlw 'u'
movwf TXREG ;envia caracter
call TestTx
movlw '-'
movwf TXREG ;envia caracter
call TestTx
movlw '>'
movwf TXREG ;envia caracter
call TestTx
movf AUX,W ;envia caracter de eco
movwf TXREG ;envia caracter
call TestTx
movlw 0x0D ;enter
movwf TXREG ;envia caracter
call TestTx
movlw 0x0A ;Line feed
movwf TXREG ;envia caracter
call TestTx
return
;***************************************************************
; subrotina para testar buffer de transmissão
;***************************************************************
TestTx:
bank1
Tst:
btfss TXSTA,TRMT ;testa se buffer vazio
goto Tst ;não, aguarda
bank0
return ;buffer vazio, pronto para próximo TX
;**************************************************************
;* Temporiza com clock de 4MHz interno ou externo
;* Trata-se de um temporizador com espera ocupada
;**************************************************************
_1ms:
movlw 0x02 ;carrega W com 02
movwf T1 ;carrega T1 com W
movlw 0x00 ;carrega T4 com 0
movwf T4
goto car_1
_5ms:
movlw 0x06 ;carrega W com 06
movwf T1 ;carrega T1 com W
movlw 0x00 ;carrega T4 com 0
movwf T4
goto car_1
_20ms:
movlw 0x18 ;carrega W com 24
movwf T1 ;carrega T1 com W
movlw 0x00 ;carrega T4 com 0
movwf T4
goto car_1
_200ms:
movlw 0x01 ;carrega W com 1
movwf T1 ;carrega T1 com W
movlw 0x01 ;carrega T4 com 1
movwf T4
goto car_1
;aguarda 1 segundo com clock de 4MHz
_1000ms:
movlw 0x06 ;carrega W com 6
movwf T3 ;carrega T3 com 6
movlw 0x01 ;carrega T4 com 1
movwf T4
car:
movlw 0xff ;carrega W com 255
movwf T1 ;carrega T1 com W
btfsc T4,0 ;testa bit 0 de T4
decfsz T3,F ;decrementa T3
goto car_1
return
car_1:
movlw 0xFF ;carrega W com 255
movwf T2 ;carrega T2 com 255
dec_1:
decfsz T2,1 ;decrementa T2
goto dec_1 ;255 x T1 vezes
decfsz T1,1 ;decrementa T1
goto car_1 ;volta a carregar T2
btfsc T4,0 ;testa bit 0 de T4
goto car ;retorna 0 em W
return
;**************************************************************
;* fim do programa
;**************************************************************
end