Skip to content

Instantly share code, notes, and snippets.

@jerivas
Created November 20, 2013 19:38
Show Gist options
  • Save jerivas/7569607 to your computer and use it in GitHub Desktop.
Save jerivas/7569607 to your computer and use it in GitHub Desktop.
;Muestra en el puerto serial el valoar analógico leído al presionar el boton
title "PIC18F4550 Valor analógico por comunicación serie"
list p=18F4550 ;Tipo de procesador
#include <p18f4550.inc> ;Incluye archivo de cabecera del PIC
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
clrf PORTC
movlw 0xB0 ; Tx Rx
movwf TRISC ; Configurar puerto C
clrf SPBRGH ; FOSC/[16 (n + 1)]
movlw 0x33 ;((8000000/9600)/16)-1 = (833.33/16)-1 = 51
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 0x00 ; ABDOVF RCIDL RXDTP TXCKP BRG16 - WUE ABDEN
movwf BAUDCON ; 0 0 0 0 0 X 0 0
movlw B'00001110'
movwf ADCON1 ;Configura PORTA0 como entrada analogica
movlw B'10000000'
movwf ADCON2 ;Tiempo de adquisición 0TAD y velocidad FOSC/2
bcf PIR1, ADIF ;Limpiar bandera del A/D
bsf PIE1, ADIE ;Habilitar interrupcion del A/D
bsf INTCON, PEIE ;Habilitar interrupciones perifericas
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_ADC
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_ADC:
bsf ADCON0,GO ;Inicia la conversion A/D
Espera_ADC:
btfsc ADCON0,GO ;Se completo la conversion?
goto Espera_ADC ;No: Esperar al ADC
movf ADRESL,W ;Si: Copiar la parte baja de la conversión
movwf TXREG ;Enviar 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
movf Cont_char, w ;Se obtienen datos ASCII de la tabla al inicio del código
call Msg1
movwf Char
movf Char,W
btfsc STATUS,2 ;Fin del mensaje? 0x00?
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
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