Skip to content

Instantly share code, notes, and snippets.

@davidae1704
Created November 15, 2013 17:13
Show Gist options
  • Save davidae1704/7488017 to your computer and use it in GitHub Desktop.
Save davidae1704/7488017 to your computer and use it in GitHub Desktop.
codigo de guia 11 modificado
;***************************************************************************************
; Cálculos
;***************************************************************************************
; X: Condición no importa
; Baud rate = 8000000/(16 (51 + 1))
; = 9615.3846 = 9615
; Error = (Baud Rate calculado - Baud Rate deseado)/Baud Rate deseado
; = (9615 - 9600)/9600 = 0.16%
title "PIC18F4550 Comunicación serie"
List p=18F4550;Tipo de procesador
include "p18F4550.INC" ;Incluye archivo de cabecera
;con los símbolos del PIC utilizado.
CONFIG FOSC = INTOSCIO_EC
CONFIG WDT = OFF
CONFIG PBADEN = OFF
CONFIG MCLRE = ON
CONFIG DEBUG = ON
CONFIG LVP = OFF
CBLOCK 0x20 ;Bloque de variables de datos en memoria de programa
Dato
Char ; Variable de conteo de datos en blanco.
Cont_char ; Variable que apunta los caracteres.
var50us ; Contador de 50 microsegundos
var10ms ; Contador para 10 ms
var600ms ; Variable de 600 ms para retardos
ENDC
;***************************************************************************************
org 0x00 ;Vector de Reset para el programa principal
goto Inicio
org 0x08 ;Vector de rutina de servicio
goto inttim
;***************************************************************************************
; Cadenas de Mensajes
ORG 0x20
Msg1
addwf PCL,1 ; Salto indexado, sumar al PC lo que tenga w
DT "************************",0x0D,0x0A
DT " Universidad Don Bosco",0x0D,0x0A
DT "***********************",0x0D,0x0A
DT "Escriba caracteres ASCII:_",0x0D,0x0A,0x00
;***************************************************************************************
ORG 0x150
Inicio
bsf OSCCON,6;Divisor de preescala
bsf OSCCON,5;fosc= 8Mhz
bsf OSCCON,4
movlw 0x04
movwf FSR0H
clrf FSR0L
clrf PORTC
movlw 0xB0 ; Tx Rx
movwf TRISC ; Configurar puerto C
clrf SPBRGH ; FOSC/[16 (n + 1)]
movlw 0x10 ;((8000000/9600)/16)-1 = (833.33/16)-1 = 51 (16)
movwf SPBRG; Ver página 245 del Datasheet
movlw 0x2C ; CSRC TX9 TXEN(1) SYNC SENDB BRGH TRMT TX9D
movwf TXSTA ; X 0 1 0 1 1 0 0
movlw 0x90 ; SPEN RX9 SREN CREN ADDEN FERR OERR RX9D
movwf RCSTA; 1 0 X 1 0 0 0 0
movlw 0x08 ; ABDOVF RCIDL RXDTP TXCKP BRG16 - WUE ABDEN
movwf BAUDCON ; 0 0 0 0 1 X 0 0
movlw 0x0F
movwf ADCON1 ;Configura PORTA como puerto digital
movlw 0x07
movwf CMCON
movlw 0xF0
movwf TRISA
bsf TRISB,0 ; Configura pin RB0 como entrada para pulsador.
movlw 0xFF
movwf TRISD ; Configura el puerto D como entradas digitales
clrf PORTC
clrf PORTA
clrf var50us ;limpia las variables necesarias para los eventos de tiempo.
clrf var10ms
clrf var600ms
movlw 0x64 ;Registro de período 100
movwf PR2 ;100/2000000 = 50uS
movlw 0x04 ;Post y pre escala de 1
movwf T2CON ;Configurar el Timer2
bsf INTCON,GIE ;Habilitación de máscara global
bsf INTCON,PEIE
bsf PIE1,TMR2IE ;Activación máscara local T2
bsf IPR1,TMR2IP ;Bit de prioridad alto
;***************************************************************************************
; Subrutina de control de teclado
Init
call Mess1
Init2
btfsc PORTB,0 ;Detecta si hubo activación del pulsador
goto Lee_PC
clrf var50us
clrf var10ms
clrf var600ms
espera
btfss var600ms,0 ;Retardo de 600ms
goto espera
goto Lee_switchs
Lee_PC
btfss PIR1,RCIF ;Detecta si hubo Recepción de dato
goto Init2 ;Si no hubo, vuelve a leer al pulsador.
movf RCREG,W ; Manda a W el dato recibido
movwf Dato ; Lo envía a la variable “Dato”
andlw 0x0F ;Enmascara los bits menos significativos
movwf PORTA ;Envía al puerto A los bits menos significativos del dato en puerto D
swapf Dato,W ;Intercambia Nibbles en “Dato” y guarda en W
andlw 0x0F ;Enmascara los bits menos significativos
movwf PORTC ;Envía a puerto C
goto Init2
Lee_switchs
movf PORTD,W ;Lee el dato de los interruptores del puerto D
movwf TXREG ;Envía el dato al buffer de transmisión
movwf Dato ;También lo mueve a la variable Dato
andlw 0x0F ;Enmascara los bits menos significativos
movwf PORTA ;Envía al puerto A los bits menos significativos del dato en puerto D
swapf Dato,W ;Intercambia Nibbles en “Dato” y guarda en W
andlw 0x0F ;Enmascara los bits menos significativos
movwf PORTC ;Envía a puerto C
Tx_complete2
clrf var50us
espera1 btfss var50us,0 ;Retardo de 50us
goto espera1
btfss TXSTA,TRMT ;Verifica si ya se terminó la transmisión
goto Tx_complete2
goto Init2 ;Vuelve a verificar pulsador en RB0
;***************************************************************************************
; Subrutinas de mensajes
Mess1
movlw h'01'
movwf Cont_char
Other
clrwdt
clrf Cont_char;movf Cont_char, w ; Se obtienen datos ASCII
movf INDF0;call Msg1 ; de la tabla al inicio del código
movwf Char
movf Char,W ; final del mensaje 0x00?
btfsc STATUS,2
goto Outmsg1
movwf TXREG
Tx_complete
clrwdt
clrf var50us
espera2
btfss var50us,0 ;Retardo de 50us
goto espera2
btfss TXSTA, TRMT ;Se espera a terminar la transmisión.
goto Tx_complete
MOVLW 0X0A
CPFSLT FSR0L
GOTO Outmsg1
incf FSR0L;incf Cont_char,F ; Se apunta nuevo carácter
;incf Cont_char, f
goto Other ; Lazo hasta terminar el mensaje
Outmsg1
return
;***************************************************************************************
; Rutina de servicio de interrupcion del timer 2 para retardos
inttim:
bcf INTCON,GIE ;Enmascarar interrupciones
btfss PIR1,TMR2IF ;Timer flag ?
goto fin ;NO, Terminar
incf var50us ;Incrementamos var50us
movlw d'200'
cpfseq var50us ;Se alcanzaron 10ms?
goto fin ;NO salte al final
clrf var50us ;Limpiar la variable
incf var10ms ;Incrementamos var10ms
movlw d'60'
cpfseq var10ms ;Se alcanzaron 10ms?
goto fin ;NO salte al final
clrf var10ms ;Limpiar la variable
incf var600ms ;Incrementamos var600ms
fin: bcf PIR1,TMR2IF ;Limpiar la bandera del timer2
bsf INTCON,GIE ;Habilitación de máscara global
retfie
END
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment