;***************************************************** ;* 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 ;inclue arquivo __CONFIG _LVP_OFF & _MCLRE_OFF & _BODEN_OFF & _LVP_OFF & _CP_OFF & _PWRTE_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 temporizador T2 res 1 ;variável para temporizador T3 res 1 ;variável para temporizador T4 res 1 ;variável para temporizador AUX res 1 ;variável para dado recebido ;************************************************************** ;*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