programas para pic18f452

Hola , espero que me puedan ayudar , si es posible que me faciliten programitas pequeños con ese pic , para aprender a manejarlo mejor, codigos en assembler, gracias de antemano.
 
Tengo un programa que lee una de las entrada analogas del PIC y transmite su valor al computador por el modulo USART asincronico (para emplear el max232). A que correo le envio el archvio.
 
Hola.
Este programa es uno de los ultimos en que estoy trabajando, Permite el manejo del ISD25120. Yo empleo el USART para unas opciones de configuración desde el computador.

Está configurada la interrupción del Rx, con lo cual se genera una interrupción cada vez que el PIC recibe un dato. El modulo usart esta configurado a 9600 baudios, datos de 8 bits sin paridad y 1 bit stop, con un XT de 4MHz

Todas las tareas estan en funciones independientes con lo cual se pueden utilizar las funciones individualmente. Por ejemplo si no quiere trabajar con interrupciones no se necesita configurar INTCON, y en la parte del programa donde se quiera recibir un dato se coloca :
call URX
De esta manera el PIC queda en modo espera hasta que le llegue un dato por el USART.

Si lo que quiere es trasnmitir un dato, se llama la función UTX, por ejemplo si quiero trasnmitir el caracter 'G' se debe escribir:
movlw 'G'
call UTX

Y ya se transmite el dato.

Ahora si se quiere utilizar el CAD solo se debe colocar en W el valor de configuración de ADCON0 y se llama la función CAD.

Del código puede tomar las funciones que vaya a necesitar, pero recuerde agregar las lineas
referentes a la configuración de cada módulo del PIC, donde se mencionan los TRISC,TRSISA,TRISE, ADCON1, TXSTA,SPBRG,etc. El significado de cada valor para estos registros los puede consultar en el datasheet del PIC, aunque si tiene alguna duda, le puedo colaborar con gusto, pero no se preocupe si no respondo rápidamente.

Aquí está el código:

;OSCILADOR DE 4MHZ

;**********************************************************************************
;La señal de sonido debe permanecer un tiempo pequeño en el rango de valores y luego
;durar otro tiempo en un rango inferiro al minimo de la señal del aplauso configurada




;Programa para la operación del ISD251200.

;Se comunica con el computador, el cual, le da las ordenes de grabar y reproducir.

;El PIC está siempre en modo recepción por interrupciones.
;Se tiene que cada ranura del ISD es de 0.5 seg, luego se tiene un temporizador de
;ese valor para las acciones grabar y reproducir slots

;Si el computador envia la orden de grabar:
;El computador envia 'G',luego el byte de la dirección donde se va agrabar y el byte
;Con el tiempo de grabacion.
;Después comienza la reproducción del sonido.
;El PIC debe recibir la 'G', reconocer el modo grabar y recibir el byte de la
;dirección a grabar, seguido de la activación del ISD en modo grabar.
;La grabación sólo se mantiene durante el tiempo de grabación configurado en el PIC,

;Si el computador envía la orden de reproducir:
;El computador envía 'R',luego el byte con la dirección a reproducir.
;El PIC debe recibir 'R', luego la dirección y el byte para el tiempo. enviarla al
; ISD, para después activar
; el modo reproducción.
;Se activa el temporizador y después de terminado vuelve a reproducir esa misma
;dirección de forma automática quedando en un ciclo.

;Orden reset
;El computador envía 'S'.
;El PIC debe recibir 'S' y hacer un reset por instrucción, con esto se puede salir
;de cualquier modo en el que se encuentre como el de reproducción.

;Si se da la orden de reproduccion multiple:
;El computador envia 'F', luego envia las posiciones que va a reproducir, y el
; byte FF para anunciar que ahe termiando de cargar los datos. Luego debe enviar
;el byte con el tiempo de cada slot
;El PIC debe recibir el comando 'F', entrar en modo recepción y cada vez que reciba
;un dato lo compara con FFh para saber si termina de guardar, cuando termina, recibe
;el tiempo de cada slot y comienza el cilo para reproducir las direcciones grabadas


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

;**********************************************************************************
;***** Definicion de pines *****

;1 MCLR ENTRADA ejecutar un reset en el circuito
;2 RA0 ENTRADA Señal del micrófono
;3 RA1
;4 RA2
;5 RA3
;6 RA4
;7 RA5
;8 RE0
;9 RE1
;10 RE2
;11 VDD Voltaje de polarización +5V
;12 VSS Referencia a tierra
;13 OSC1 XT
;14 OSC2 XT
;15 RC0 SALIDA CE
;16 RC1 SALIDA PD
;17 RC2 SALIDA P/R
;18 RC3 ENTRADA EOM
;19 RD0 SALIDA LED testigo
;20 RD1
;21 RD2
;22 RD3
;23 RC4 SALIDA A8
;24 RC5 SALIDA A9
;25 RC6 SALIDA Tx
;26 RC7 ENTRADA Rx
;27 RD4
;28 RD5
;29 RD6
;30 RD7
;31 VSS Referencia a tierra
;32 VDD Voltaje de polarización +5V
;33 RB0 SALIDA A0
;34 RB1 SALIDA A1
;35 RB2 SALIDA A2
;36 RB3 SALIDA A3
;37 RB4 SALIDA A4
;38 RB5 SALIDA A5
;39 RB6 SALIDA A6
;40 RB7 SALIDA A7
;*************************************************************************************

;*************************************************************************************
;Mapeo de RAM
;0x20-0x3F = Variables matematias de usuario
;0x40-0x50 = Regsitros varios.
;0x6D-0x7F = Almacenar variables matematicas


;0xA0-0XAF = Registros para los datos del LCD primer renglon
;0xB0-0XBF = Registros para los datos del LCD segundo renglon

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

list p=18f452
#include <p18f452.inc>


;*************************************************************************************
;***** Definición de registros especiales *****
;Banco 0

indf0 equ 0xFEF ;Dato 1
indf1 equ 0xFE7 ;Dato 2
indf2 equ 0xFDF ;ans

status equ 0xFD8 ;Registro de banderas.
bsr equ 0xFE0

fsr0l equ 0xFE9
fsr0h equ 0xFEA
fsr1l equ 0xFE1
fsr1h equ 0xFE2
fsr2l equ 0xFD9
fsr2h equ 0xFDA
postinc0 equ 0xFEE

trisA equ 0xF92 ;Configuracion de los puertos
trisB equ 0xF93
trisC equ 0xF94
trisD equ 0xF95
trisE equ 0xF96

portA equ 0xF80 ;Datos de los puertos
portB equ 0xF81
portC equ 0xF82
portD equ 0xF83
portE equ 0xF84

adcon1 equ 0xFC1 ;Conversor analogo-digital
adcon0 equ 0xFC2
adresl equ 0xFC3
adresh equ 0xFC4

intcon equ 0xFF2
pie1 equ 0xF9D
pir1 equ 0xF9E

pcl equ 0xFF9
pclath equ 0xFFA

wreg equ 0xFE8

rcsta equ 0xFAB ;Configuracion del RX
txsta equ 0xFAC ;Configuracion del TX
txreg equ 0xFAD ;DAto a transmitir
rcreg equ 0xFAE ;Dato recibido
spbrg equ 0xFAF ;Velocidad de comunicacion



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


;*************************************************************************************
;Banco 0
;Variables ayuda para CAD
resA1 equ 0x080 ;Contador de caracteres

;Variables ayuda para ESPERA
resB1 equ 0x082 ;Contadores
resB2 equ 0x083
resB3 equ 0x084

;Variables ayuda para INTER,RETINTER
wtemp equ 0x086 ;Temporal para WREG
bsrtemp equ 0x087 ;temporal para BSR
statemp equ 0x088 ;TEmporal para status

;Variables para la interrupcion de recepcion
dato equ 0x0A0 ;Valor que se recibio
contador equ 0x0A1 ;Coantador de datos recibidos
tiempo equ 0x0A2 ;Tiempo de cada slot

;Variables para el manejo de la señla análoga
minimo equ 0x0B0 ;Valor minimo para la señal
maximo equ 0x0B1 ;Valor maximo para la señal
señal equ 0x0B2 ;Señal de entrada
limite1 equ 0x0B4 ;Contador para la señal en rango
limite2 equ 0x0B5 ;Contador para señal en silencio
conta equ 0x0B6 ;Contador para cada duty cicle

;Posiciones donde se guardaran los datos
dir1 equ 0x0C0 ;Posicion inicial

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


;*************************************************************************************
;Definicion de bits especiales
#define rp0 status,5

#define go adcon0,2 ;Inicia la conversión AD
#define c status,0
#define z status,2
#define gie intcon,7 ;Habiltador de interrupciones

#define rcif pir1,5 ;Bandera de interrupcion del RX
#define trmt txsta,1 ;Indica si se esta transmitiendo

#define ce portC,0 ;SAlida habilitar el ISD
#define pd portC,1 ;SAlida activa operación del ISD
#define pr portC,2 ;Salida reproducir o grabar del ISD
#define eom portC,3 ;Entrada para indicar el fin de mensaje

#define led portD,0 ;LED testigo

;*************************************************************************************
;Rutinas
org 0x00
goto INICIO
org 0x08
goto INTER

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

;*************************************************************************************
;Atiende las interrupciones
INTER movff wreg,wtemp ;wtemp = wreg
movff bsr,bsrtemp ;bsrtemp = bsr
movff status,statemp ;statemp = status

btfsc rcif ;rcif =? 1
goto INTRX ;Interrupcion por recepcion

goto RETINT ;Retorno de interrupcion
;*************************************************************************************

;**********************************************************************************
;Funcion que atiende la interrupcion de recibir comandos
INTRX bcf rcif ;Borra la bandera de interrupcion
bcf led ;Apaga el LED
movff rcreg,dato ;dato = rcreg; Valor recibido

movlw 'G' ;W = 'G'
cpfseq dato ;dato =? W.
goto INTRX_1 ;No recibio 'G'

goto GRABAR ;Recibió orden de grabar

INTRX_1 movlw 'R' ;W = 'R'
cpfseq dato ;dato =? W.
goto INTRX_2 ;No recibio 'R'

goto REPRO ;Recibió orden de reproducir

INTRX_2 movlw 'F' ;W = 'F'
cpfseq dato ;dato =? W.
goto INTRX_3 ;Continua comparando

goto FRASE ;Recibió la orden de frase

INTRX_3 movlw 'm' ;W = 'm'
cpfseq dato ;dato =? W.
goto INTRX_4 ;No recibio 'm'

goto MINIMO ;Recibió orden de minimo

INTRX_4 movlw 'M' ;W = 'M'
cpfseq dato ;dato =? W.
goto INTRX_5 ;No recibio 'M'

goto MAXIMO ;Recibió orden de maximo

INTRX_5 movlw 'N' ;W = 'N'
cpfseq dato ;dato =? W.
goto INTRX_6 ;No recibio 'N'

goto ALTO ;Recibió orden de ciclo alto

INTRX_6 movlw 'n' ;W = 'N'
cpfseq dato ;dato =? W.
goto INTRX_S ;No recibio 'n'

goto BAJO ;Recibió orden de ciclo bajo

INTRX_S goto RETINT ;Retorna de la interrupción
;**********************************************************************************

;**********************************************************************************
;Funcion para cambiar el valor del ciclo alto del aplauso
ALTO call URX ;Recibe el nuevo mínimo
movff rcreg,limite1 ;limite1 = rcreg.
goto RETINT ;Retorna de la interrupcion
;**********************************************************************************

;**********************************************************************************
;Funcion para cambiar el valor del ciclo bajo del aplauso
BAJO call URX ;Recibe el nuevo mínimo
movff rcreg,limite2 ;limite2 = rcreg.
goto RETINT ;Retorna de la interrupcion
;**********************************************************************************


;**********************************************************************************
;Funcion para cambiar el valor mínimo
MINIMO call URX ;Recibe el nuevo mínimo
movff rcreg,minimo ;minimo = rcreg.
goto RETINT ;Retorna de la interrupcion
;**********************************************************************************

;**********************************************************************************
;Funcion para cambiar el valor máximo
MAXIMO call URX ;Recibe el nuevo máximo
movff rcreg,maximo ;maximo = rcreg.
goto RETINT ;Retorna de la interrupcion
;**********************************************************************************

;**********************************************************************************
;Funcion para cuando se recibe el comando de grabar
GRABAR call URX ;Recibe la dirección donde se grabara
movff rcreg,dato ;dato = rcreg.
movff dato,portB ;portB = dato. Coloca la dirección

call URX ;Recibe el tiempo de reproducción

bsf ce ;Desactiva el ISD
bcf pd ;Activa PD
bcf pr ;activa la grabación
movlw .5 ;W = 5
call ESPERA2 ;Tiempo de Tpud
bcf ce ;Inicia la grabación

movf rcreg,0 ;W = rcreg
call ESPERA ;Espera el tiempo de un slot

bsf ce ;Desactiva el integrado
bsf pd ;Desactiva el integrado
movlw .5 ;W = 5
call ESPERA2 ;Tiempo TPDR

goto RETINT ;Retorna de la interrupción
;**********************************************************************************

;**********************************************************************************
;Funcion para cuando se recibe el comando de reproducir
;Recibiendo la dirección a reproducir y quedando en un ciclo reproduciendo sólo ese
;slot.
REPRO call URX ;Recibe la dirección a reproducir
movff rcreg,dato ;dato = rcreg.
movff dato,portB ;portB = dato. Coloca la dirección

call URX ;Recibe el tiempo de grabación

bsf ce ;Deshabilta el ISD
bcf pd ;Activa PD
bsf pr ;activa la reproducción
movlw .5 ;W = 5
call ESPERA2 ;Tiempo Tpud
bcf ce ;Inicia la reproducción

; call ESPERA ;Espera el tiempo de un slot
; movf rcreg,0 ;W = rcreg

REPRO_1 btfsc eom ;eom =? 0
goto REPRO_1 ;Continua reproducinedo

bsf ce ;Desactiva el integrado
bsf pd ;Desactiva el integrado
movlw .5 ;W = 5
call ESPERA2 ;Tiempo Tpud

goto RETINT ;Retorna de la interrupcion
;**********************************************************************************

;**********************************************************************************
;Funcion para reproducir ciertas posiciones de memoria
;Recibiendo las direcciónes a reproducir y luego el timepo de rerproducción de cada
;slot.
FRASE clrf contador ;contador = 0
clrf fsr0h ;fsr0h = 0. Banco 0
movlw dir1 ;W = &dir1
movwf fsr0l ;fsr0l 0 W. Direccion de incio

FRASE_1 call URX ;Recibe la dirección a reproducir
movff rcreg,dato ;dato = rcreg.

incf contador,1 ;contador += 1.
movff dato,postinc0 ;indf0 = dato. fsr0 +1

movlw h'FF' ;W = FFh
cpfseq dato ;dato =? W.
goto FRASE_1 ;Continua recibiendo los datos

call URX ;Recibe el tiempo de cada slot
movff rcreg,tiempo ;tiempo = rcreg

clrf fsr0h ;fsr0h = 0. Banco 0
movlw dir1 ;W = &dir1
movwf fsr0l ;fsr0l 0 W. Direccion de incio

decf contador,1 ;contador -= 1

FRASE_2 movff postinc0,portB ;portB = indf0. frs0 +1

bsf ce ;Desactiva el ISD
bcf pd ;Activa PD
bsf pr ;activa la reproducción
movlw .5 ;W = 5
call ESPERA2 ;Tiempo Tpud
bcf ce ;Inicia la reproducción

; movf tiempo,0 ;W = tiempo.
; call ESPERA ;Espera el tiempo de un slot

FRASE_3 btfsc eom ;eom =? 0
goto FRASE_3 ;Continua reproducinedo

bsf ce ;Desactiva el integrado
; bsf pd ;Desactiva el integrado
; movlw .5 ;W = 5
; call ESPERA2 ;Tiempo Tpud

decfsz contador,1 ;contador -= 1 =? 0
goto FRASE_2 ;Termina de reprducir las posiciones


goto RETINT ;Retorna de la interrupcion
;**********************************************************************************

;****************************************************************************************
;Rutina para transmitir el dato que este en W.
UTX movwf txreg ;txreg = W. Carga el dato a transmitir
UTX2 btfss trmt ;Para saber cuando termino la transmision
goto UTX2 ;Sigue esperando
return ;Retorna al lugar del salto
;****************************************************************************************

;****************************************************************************************
;Rutina para recibir un dato y dejarlo en W.
URX btfss rcif ;Para saber cuando recibe
goto URX ;Sigue esperando
movff rcreg,wreg ;wreg = rcreg.
bcf rcif ;Borra el estado de la bandera
return ;Retorna al lugar del salto
;****************************************************************************************

;*************************************************************************************
;Función para restaurar los valores de seguridad y retornar de la interrupcion
RETINT movff statemp,status ;status = statemp
movff wtemp,wreg ;wreg = wtemp
movff bsrtemp,bsr ;bsr = bsrtemp
retfie ;Retorno de interrupción
;*************************************************************************************

;**********************************************************************************
;Rutina para el conversor que toma el valor de W para configurar adcon0
CAD movff wreg,wtemp ;wtemp = wreg
movff bsr,bsrtemp ;bsrtemp = bsr
movff status,statemp ;statemp = status

movlb .0 ;Banco 0
movwf adcon0 ;adcon0 = W.
movlw .15 ;W =
movwf resA1 ;resA1 = W. Tiempo de espera
CAD_1 decfsz resA1,1 ;resA1 -= 1 =? 0
goto CAD_1 ;Espera el tiempo necesario
bsf go ;Empieza la conversion
CAD_2 btfsc go ;go =? 0.
goto CAD_2 ;Sigue digitalizando

movff statemp,status ;status = statemp
movff wtemp,wreg ;W = wtemp
movff bsrtemp,bsr ;bsr = bsrtemp
return ;Retorna
;****************************************************************************************

;**********************************************************************************
;Rutina que toma el valor de W y realiza una espera de un tiempo T = W * 10mS
ESPERA2 movff wreg,wtemp ;wtemp = wreg
movff bsr,bsrtemp ;bsrtemp = bsr
movff status,statemp ;statemp = status

movwf resB1 ;resB1 = W.
ESPERA2_1 movlw .156 ;W =
movwf resB2 ;resB2 = W
ESPERA2_2 movlw .20 ;W =
movwf resB3 ;resB3 = W.
ESPERA2_3 decfsz resB3,1 ;resB3 = resB3 - 1 =?0.
goto ESPERA2_3 ;Si aun 'resB3' no es cero vuelve a decrementarlo.
decfsz resB2,1 ;resB2 = rsB2 - 1 =?0
goto ESPERA2_2 ;Si aun 'resB2' no es cero realizo otra vez el cont1.
decfsz resB1,1 ;resB1 = resB1 - 1 =?0
goto ESPERA2_1 ;Si aun 'resB1' no es cero realizo otra vez el cont2.

movff statemp,status ;status = statemp
movff wtemp,wreg ;W = wtemp
movff bsrtemp,bsr ;bsr = bsrtemp
return ;Vuelvo a la rutina que llamo la funcion
;**********************************************************************************

;**********************************************************************************
;Rutina que toma el valor de W y realiza una espera de un tiempo T = W * 100mS
ESPERA movff wreg,wtemp ;wtemp = wreg
movff bsr,bsrtemp ;bsrtemp = bsr
movff status,statemp ;statemp = status

movwf resB1 ;resB1 = W.
ESPERA_1 movlw .165 ;W =
movwf resB2 ;resB2 = W
ESPERA_2 movlw .200 ;W =
movwf resB3 ;resB3 = W.
ESPERA_3 decfsz resB3,1 ;resB3 = resB3 - 1 =?0.
goto ESPERA_3 ;Si aun 'resB3' no es cero vuelve a decrementarlo.
decfsz resB2,1 ;resB2 = rsB2 - 1 =?0
goto ESPERA_2 ;Si aun 'resB2' no es cero realizo otra vez el cont1.
decfsz resB1,1 ;resB1 = resB1 - 1 =?0
goto ESPERA_1 ;Si aun 'resB1' no es cero realizo otra vez el cont2.

movff statemp,status ;status = statemp
movff wtemp,wreg ;W = wtemp
movff bsrtemp,bsr ;bsr = bsrtemp
return ;Vuelvo a la rutina que llamo la funcion
;**********************************************************************************

;**********************************************************************************
;Función para generar las señales para reproducir, en W debe estar la dirección


;**********************************************************************************
;*************************************************************************************
;Rutina principal
INICIO movlb .0 ;Banco 0

;Configuración de los puertos
movlw b'00000001' ;W = 01h.
movwf trisA ;trisA = W.Configura el puerto B.
movlw b'00000000' ;W = 00h.
movwf trisB ;trisB = W.Configura el puerto B.
movlw b'10001000' ;W = 88h.
movwf trisC ;trisC = W.Configura el puerto C.
movlw b'11111110' ;W = FEh
movwf trisD ;trisD = W.

;Inicialización de puertos
clrf portB ;Borra el estado del puerto B
clrf portC ;Borra el estado del puerto C
clrf portD ;Borra el estado del puerto D

;Configuración del USART

movlw b'00100110' ;W = 26h
movwf txsta ;txsta = W.Configura el TX
movlw b'10010000' ;W = 90h
movwf rcsta ;rcsta = W. Configura el RX
movlw .25 ;W = 25d
movwf spbrg ;spbrg = W.Configura velocidad

;Configura interrucpiones
movlw b'11000000' ;W = E0h.
movwf intcon ;intcon = W. Configura las interrupciones
movlw b'00100000' ;w = 20h
movwf pie1 ;pie = W.

bsf led ;Activa led testigo

bsf ce ;Desactiva el Integrado
bsf pd ;Inhabilta operaciones
bsf pr ;Evita grabar por accidente

movlw b'00000100' ;W = 04h.
movwf adcon1 ;adcon1 = W. Configura CAD.

; movlw b'11000000' ;W = C0h
; movwf t0con ;t0con = W

CICLO bcf led ;Apaga el LED
movlw b'01000001' ;W =41h.
call CAD ;Digitaliza por el canal AN0

movff adresh,señal ;señal = adresh.
movf minimo,0 ;W = minimo
cpfsgt señal ;señal >? W
goto CICLO ;señal es menor a minimo

movf maximo,0 ;W = maximo
cpfslt señal ;señal <? W.
goto CICLO ;señal es mayor a maximo

movff limite1,conta ;conta = limite1

LUZ_1 movlw b'01000001' ;W =41h.
call CAD ;Digitaliza por el canal AN0
movff adresh,señal ;señal = adresh.
movf minimo,0 ;W = minimo
cpfsgt señal ;señal >? W
goto CICLO ;señal es menor a minimo

movf maximo,0 ;W = maximo
cpfslt señal ;señal <? W.
goto CICLO ;señal es mayor a maximo
decfsz conta,1 ;conta -= 1 =? 0
goto LUZ_1 ;Continua comparando la señal

movff limite2,conta ;conta = limite2

LUZ_2 movlw b'01000001' ;W =41h.
call CAD ;Digitaliza por el canal AN0
movff adresh,señal ;señal = adresh.
movf minimo,0 ;W = minimo
cpfslt señal ;señal <? W
goto CICLO ;señal es menor a minimo

decfsz conta,1 ;conta -= 1 =? 0
goto LUZ_2 ;Continua comparando la señal


bsf led ;Activa el LED
movlw .10 ;
call ESPERA ;Espera un momento

goto CICLO ;Repite el ciclo
;*************************************************************************************


end ;Fin de archivo
 
Hola.
Este programa es uno de los ultimos en que estoy trabajando, Permite el manejo del ISD25120. Yo empleo el USART para unas opciones de configuración desde el computador.

Está configurada la interrupción del Rx, con lo cual se genera una interrupción cada vez que el PIC recibe un dato. El modulo usart esta configurado a 9600 baudios, datos de 8 bits sin paridad y 1 bit stop, con un XT de 4MHz

Todas las tareas estan en funciones independientes con lo cual se pueden utilizar las funciones individualmente. Por ejemplo si no quiere trabajar con interrupciones no se necesita configurar INTCON, y en la parte del programa donde se quiera recibir un dato se coloca :
call URX
De esta manera el PIC queda en modo espera hasta que le llegue un dato por el USART.

Si lo que quiere es trasnmitir un dato, se llama la función UTX, por ejemplo si quiero trasnmitir el caracter 'G' se debe escribir:
movlw 'G'
call UTX

Y ya se transmite el dato.

Ahora si se quiere utilizar el CAD solo se debe colocar en W el valor de configuración de ADCON0 y se llama la función CAD.

Del código puede tomar las funciones que vaya a necesitar, pero recuerde agregar las lineas
referentes a la configuración de cada módulo del PIC, donde se mencionan los TRISC,TRSISA,TRISE, ADCON1, TXSTA,SPBRG,etc. El significado de cada valor para estos registros los puede consultar en el datasheet del PIC, aunque si tiene alguna duda, le puedo colaborar con gusto, pero no se preocupe si no respondo rápidamente.

Aquí está el código:
 
Atrás
Arriba