desktop

Curso de programación de PIC en PICBasic Pro

En parte estás errado. Por eso siempre les digo que lean la hoja de datos. ;)

En la sección ADCON0 se muestra la configuración de bits para la selección de los canales. ADCON0.JPG

ADCON0 funciona conjuntamente con el registro ADCON1 y muestra ésta tabla: ADCON1.JPG

Estableciendo adecuadamente los bits de los registros ADCON0 y ADCON1 se selecciona el canal o canales ADC que estarán activos.
En esos mismos registros también se configura el modo de operación.

El registro CMCON no involucra a todos los puertos porque no todos tienen comparadores análogos.
Éstos únicamente se encuentran en el puerto A y esto también lo puedes ver en la hoja de datos. (Sección: Comparator Module)

El puerto C no tiene conversores AD y tampoco tiene comparadores análogos, éste tiene otro tipo de funciones y su configuración depende de los módulos que quieras usar.
Si lo piensas utilizar como un puerto estándar Digital I/O, no hay mucho que configurar.
Pero recuerda que el módulo del Bus USB forma parte del puerto C.
 
Última edición:
Muchas gracias por tan pronta respuesta; leyendo nuevamente y comparando con lo que escribiste comprendí un poco mas, realicé una pequeña prueba y funcionó.

4 pulsadores N/A en el Puerto A (0,1,2,3) y un diodo led en el Puerto C.7

OSCCON=%01100110 ; Configura oscilador interno en 4MGH de frecuencia estable
CMCON = 7 ; Desactiva los comparadores analogicos de todos los pines del puerto A .

ADCON0 = 63 ; ADCON0 = 3F
ADCON1 = 15 ; ADCON1 = F

Define Osc 4 ; Define el Oscilador de 4 Mhz.

TRISA = %111111 ; Configura el Puerto A como Entrada.
TRISC = %00000000 ; Configura el Puerto C como Salida.

PORTC = $00 ; Inicializa el puerto C.

Inicio:
If PORTA.0 = 0 Then PORTC.7 = 1 ; Pregunta si RA0 = 0, entonces RC.7 = 1
If PORTA.1 = 0 Then PORTC.7 = 1 ; Pregunta si RA1 = 0, entonces RC.7 = 1
If PORTA.2 = 0 Then PORTC.7 = 1 ; Pregunta si RA2 = 0, entonces RC.7 = 1
If PORTA.3 = 0 Then PORTC.7 = 1 ; Pregunta si RA0 = 0, entonces RC.7 = 1

Pause 500 ; Hace una pausa de 1 segundo (500 ms)

Low PORTC.7 ; Apaga el Led
Pause 500 ; Hace una pausa de 1/2 segundo (500 ms)
GoTo inicio ; Salta a la etiqueta "Inicio"
End
 
Hola buenas noches, bueno en este momento me encuentro ensayando con las matrices de led, hasta ahora se mostrar una letra, lo que me gustaria hacer, es hacer que se desplace hacia la izquierda, mirando codigos que han subido en el foro no logro entender como hacen para que se desplace el texto utilizando el IC 74hc164, me podria hacer el favor de explicarme como hacerlo con PBP.

Codial saludo.
 
Hola. Buenos días. He estado practicando con el PIC18F2550 utilizando LED y buzzer en pequeños programas y me han funcionado.
No he tenido la necesidad de colocar los fuses en MCS ya que en el software del programador los coloco,
pero ahora empecé a utilizar un LCD de 16x2 con el PIC18F2550 tomando como ejemplo del tutorial de PBP sin tener buenos resultados.

En el LCD me salen varios caracteres, menos los que deben salir y en el proteus se muestra pero no como lo que debería salir.
Adjunto fotos, archivos de simulación y demás.

Agradecería mucho que me indicaran en que me tengo que corregir. Muchas gracias.

---------- Actualizado después de 2 horas ----------

Hola compañeros. Me autocorrijo en lo siguiente:

If P1 = 1 Then Call Mensaje1 ' Pregunta si RA0 = 1
If P2 = 1 Then Call Mensaje2 ' Pregunta si RA1 = 1

Corrección: P1 y P2 se deben igualar a 0

If P1 = 0 Then Call Mensaje1 ' Pregunta si RA0 = 1
If P2 = 0 Then Call Mensaje2 ' Pregunta si RA1 = 1

Y en el " Menu #1 " y " Menu #2 ", se deben llenar los 16 caracteres con espacios de lado y lado dentro de las comillas, para que se cubra totalmente el renglón superior y no aparezca parte del mensaje anterior.

Muchas gracias de todas maneras.
 

Adjuntos

  • LCD PIC18F2550.rar
    461 KB · Visitas: 53
Última edición por un moderador:
Hola a todos.
Vengo por aquí a molestar, a ver sí me pueden ayudar con un trabajito.
Se trata de hacer un control para un motor DC.
La idea es poner un número determinado de revoluciones y que si por motivo de trabajo las revoluciones se bajan, el pic aumente el duty del pwm para que el motor se recupere.

La verdad no sé como hacer la comparación de las variables, para que sí una disminuye, la otra aumente y me cambie el duty del pwm.

Aquí les subo los archivos para que vean de que hablo.
 

Adjuntos

  • gobernador.rar
    2.9 MB · Visitas: 44
Última edición por un moderador:
Hola buenas tardes, estoy realizando ejercicios con el pic 18f2550 y queria saber si es posible que con un pulsador se borre o cambie un dato ya programado en la eeprom de este pic, adjunto un sencillo ejercicio que hice, donde se simula el dato y la direccion donde fue guardado pero todavia no lo he podido cambiar con el pulsador. gracias.
 

Adjuntos

  • Memoria EEPROM.rar
    31.4 KB · Visitas: 36
  1. Si estás utilizando un cristal de 4 MHz, entonces la palabra de configuración no es correcta.
  2. Realizas comparaciones de estado de pines y variables, pero las variables nunca las inicializas.
  3. Haces llamadas a subrutinas pero usas Return, en ese caso debes usar GoSub [Etiqueta]
Puedes ir a subrutinas usando GoTo y retornar nuevamente con GoTo a una etiqueta.

En PICBasic se puede hacer así:
If Sentencia Then Mi_Rutina

O así:
If Sentencia Then GoTo Mi_Rutina

Y de la rutina regresas nuevamente con un GoTo: GoTo [Etiqueta]

Pero no debes llamar a una subrutina con Then Mi_Rutina, porque equivale a usar un GoTo
Cuando haces eso se produce un desborde de pila llevando el programa al vector de reset. (ORG 0)

Es decir, el programa se reinicia desde el principio por no tener un punto de referencia a donde regresar.

Entonces como mencioné, si piensas regresar con Return, debes llamar a la subrutina con GoSub o Call
 
  1. Si estás utilizando un cristal de 4 MHz, entonces la palabra de configuración no es correcta.
  2. Realizas comparaciones de estado de pines y variables, pero las variables nunca las inicializas.
  3. Haces llamadas a subrutinas pero usas Return, en ese caso debes usar GoSub [Etiqueta]
Puedes ir a subrutinas usando GoTo y retornar nuevamente con GoTo a una etiqueta.

En PICBasic se puede hacer así:
If Sentencia Then Mi_Rutina

O así:
If Sentencia Then GoTo Mi_Rutina

Y de la rutina regresas nuevamente con un GoTo: GoTo [Etiqueta]

Pero no debes llamar a una subrutina con Then Mi_Rutina, porque equivale a usar un GoTo
Cuando haces eso se produce un desborde de pila llevando el programa al vector de reset. (ORG 0)

Es decir, el programa se reinicia desde el principio por no tener un punto de referencia a donde regresar.

Entonces como mencioné, si piensas regresar con Return, debes llamar a la subrutina con GoSub o Call

Hola buenas noches, muchas gracias por tan pronta respuesta; inmediatamente corregiré lo de la inicializacion de las varibles y para llamar a las subrutinas utilizaré CALL, La verdad es que apenas con este pic 18f2550 que me regalaron, es que estoy colocando los fuses en el MCS ya que siempre con los otros pic mas pequeños utilizaba los fuses del programador, te agradecería enormemente si me indicaras cual es la palabra correcta para utilzar como oscilador externo un cristal de 4MHZ sin utilizar el USB en este pic 18f2550 y si no fuera molestia facilitarme uno o dos ejemplos en PBP donde con un pulsador pueda borrar y o cambiar un dato grabado anteriormente en una y o varias direcciones de la eeprom de este pic. Muy agradecido por tu atención prestada y tu sabio conocimiento. :apreton:
 
La palabra de configuración para un cristal de 4 MHz sin usar el módulo USB, es esta:
Código:
[B]Asm[/B]
[COLOR=Green]    Config FOSC = XT_XT, WDT = OFF, PWRT = ON, LVP = OFF
    Config USBDIV = 1, PLLDIV = 1[/COLOR]
[B]EndAsm[/B]
Para que funcione al compilar, se debe editar el archivo 18F2550.INC, comentando los fuses que vienen por defecto.
Esto ya se ha tratado aquí en el Foro: Bits de Configuracion PIC 18F4550/PicBasic Pro
El ejemplo citado en ese post también aplica para el PIC18F2550

Sobre los ejemplos de lectura y escritura de la EEPROM interna, no hay mucho que decir.
Lee sobre las instrucciones; Write y Read. Lo demás es cuestión de aplicarlas en tu programa.

Para obtener ayuda sobre las instrucciones, sitúa el cursor sobre la instrucción y presiona la tecla F1.
 
La palabra de configuración para un cristal de 4 MHz sin usar el módulo USB, es esta:
Código:
[B]Asm[/B]
[COLOR=Green]    Config FOSC = XT_XT, WDT = OFF, PWRT = ON, LVP = OFF
    Config USBDIV = 1, PLLDIV = 1[/COLOR]
[B]EndAsm[/B]
Para que funcione al compilar, se debe editar el archivo 18F2550.INC, comentando los fuses que vienen por defecto.
Esto ya se ha tratado aquí en el Foro: Bits de Configuracion PIC 18F4550/PicBasic Pro
El ejemplo citado en ese post también aplica para el PIC18F2550

Sobre los ejemplos de lectura y escritura de la EEPROM interna, no hay mucho que decir.
Lee sobre las instrucciones; Write y Read. Lo demás es cuestión de aplicarlas en tu programa.

Para obtener ayuda sobre las instrucciones, sitúa el cursor sobre la instrucción y presiona la tecla F1.

Buenos dias, te adjunto el archivo mejorado con algunas modificaciones; ya no me muestra errores; los fuses los cambié como me indicaste, pero editados de forma diferente ya que al colocarlos igual como los mostraste, me salian errores, escucho tus sujerencias de como quedó con la mejora que le hice; todavia estoy investigando como con un 3er pulsador poder cambiar o borrar 1, 2 o los 3 datos grabados anteriormente en las posiciones de memoria $00, $01, $02 de la eeprom del pic 185f2550. Muy agradecido por tu atención y colaboración al desarrollo del conocimiento de estos temas. :aplauso: (y)
 

Adjuntos

  • EEPROM MEJORADO.rar
    33.6 KB · Visitas: 44
Los fuses los cambié como me indicaste, pero editados de forma diferente, ya que al colocarlos igual como los mostraste, me salían errores.
Esa no es la forma correcta de escribir la palabra de configuración. No tiene la sintaxis que requiere MPASWIN.
La forma correcta es como te mencioné, y los errores se deben a que no lo estás haciendo como lo explico en el ejemplo del enlace que coloqué.

De la forma en como estás escribiendo la palabra de configuración no la toma en cuenta el compilador.

Si abres el archivo hexadecimal que se genera al compilar, verás que esos fuses no los toma en cuenta.
El archivo ejecutable sigue manteniendo los fuses por defecto del archivo 18F2550.INC

Fuses Incorrectos.jpg

Escribiendo la palabra de configuración correctamente, así deben quedar.
Fuses Correctos.jpg

Aquí el archivo ya se ha compilado con los fuses requeridos.

Lee con atención el ejemplo del enlace que mencioné anteriormente para que lo entiendas bien.

Suerte.
 
Buenos días. Te cuento que no comprendía, por que no había leído bien, debido a que me confié por tener el archivo.INC actualizado; hasta que con el 1er ejemplo me di cuenta que el secreto esta en comentar las 5 palabras de configuración en el archivo.INC y listo, el MCS compilo sin errores y para verificar utilicé el winpic para comparar con tu imagen siendo las 2 iguales. Muchas gracias nuevamente. :aplauso: :apreton: (y)

---------- Actualizado después de 2 horas ----------


Hola, buenos días. Te comento que en proteus me funcionó perfectamente, pero al montarlo físicamente en lcd no muestra nada; lo raro es que al volver a su estado inicial el archivo.INC y colocar los antiguos fuses corre a las mil maravillas y el lcd muestra todo.
La verdad no entiendo porque pasa esto. ¿Por qué sucederá esto? En el proteus funciona con el archivo .INC original y modificado, pero en la realidad con el circuito físico montado sólo funciona con el archivo.INC original y los fuses que te envié inicialmente.
 
Última edición por un moderador:
Te comento que en proteus me funcionó perfectamente, pero al montarlo físicamente en lcd no muestra nada; lo raro es que al volver a su estado inicial el archivo.INC y colocar los antiguos fuses corre a las mil maravillas y el lcd muestra todo.
La verdad no entiendo porque pasa esto. ¿Por qué sucederá esto?
Pues si es extraño que no te funcione físicamente.
Para verificar lo que comentas, monté el circuito en un protoboard y grabé el PIC con la palabra de configuración correcta. (O sea, la que te sugerí)

Tanto en proteus como en el protoboard, funcionan bien.

18F2550 Proteus.jpg
18F2550 Protoboard.jpg

Te recomiendo que realices un programa simple, como hacer destellar un LED cada 500 ms.
Cuando esté en funcionamiento, quita el cristal y el programa se debe detener.
Si el LED sigue destellando a la misma frecuencia u otra más baja, entonces quiere decir está entrando en funcionamiento el oscilador interno debido al fuse FCMEN y algo sigue mal con tu palabra de configuración.

Nota:
Por lo que mencionas, todo parece indicar que estás grabando el PIC con los fuses erróneos.
 
Hola. Buenos días. Aparentemente hice un avance en el programa donde con un pulsador borro o cambio 3 datos guardados con anterioridad en 3 direcciones diferentes de la EEPROM del PIC18F2550.

Les explico:
Al inicio del programa escribí 3 datos (1, 2, 3) en 3 direcciones diferentes de la EEPROM ($00, $01, $02)
Con los pulsadores SUMA y RESTA se pueden observar los 3 datos grabados en 3 direcciones diferentes de la EEPROM.
Con el pulsador BORRA se cambian los datos (1, 2, 3) por los datos (4, 5, 6) en 3 direcciones diferentes de la EEPROM ($00, $01, $02)
Para hacer este paso debe estar colocado en pantalla el dato 3, dirección de memoria $02.
Con el pulsador BORRA2 se cambian los datos (4, 5, 6) por los datos (1, 2, 3) en 3 direcciones diferentes de la EEPROM ($00, $01, $02)
Para hacer este paso debe estar colocado en pantalla el dato 4, dirección de memoria $00.

Aparentemente digo yo que se sobrescriben los datos en la EEPROM, pero al querer verificar con el software del programador, observo que en el visor de la EEPROM DATA no aparece nada grabado, teniendo en cuenta que utilicé WRITE y READ para escribir y leer los datos en la EEPROM.

Otro detalle que observe, es que cuando apago y prendo el circuito en simulador y físico, siempre aparecen los 3 datos grabados en el inicio, nunca los que sobrescribí.
¿Por qué sucederá esto? ¿No se supone que al grabar un dato en la EEPROM debería quedar guardado?
¿O es que solamente para que se puedan conservar los datos en la EEPROM en este PIC, sólo es posible a través de un PC?

Teniendo en cuenta esto, investigué un poco sobre la instrucción EEPROM y la apliqué al programa, y si se guardaron en la EEPROM los 3 datos inicialmente inscritos con el PC, pero al apagar y volver a prender en el simulador y circuito físico, no se guardaron los 3 datos sobrescritos; a no ser que esté utilizando mal la instrucción EEPROM.

Escucho ideas y sugerencias, o si no es posible hacer lo que quiero hacer.
Adjunto todos los archivos con simulación, también fotos del archivo .INC modificado para el PIC18F2550, foto menú de fuses que tiene mi programador con .INC modificado para programar el PIC18F2550 y que al probarlo en Proteus funciona pero al probarlo en físico, sólo se muestran 16 cuadros negros en el LCD.

Muchas gracias por la atención prestada de todos ustedes.
 

Adjuntos

  • PIC18F2550 MENSAJE2A.rar
    460.6 KB · Visitas: 47
Última edición por un moderador:
Pues si es extraño que no te funcione físicamente.
Para verificar lo que comentas, monté el circuito en un protoboard y grabé el PIC con la palabra de configuración correcta. (O sea, la que te sugerí)

Tanto en proteus como en el protoboard, funcionan bien.


Te recomiendo que realices un programa simple, como hacer destellar un LED cada 500 ms.
Cuando esté en funcionamiento, quita el cristal y el programa se debe detener.
Si el LED sigue destellando a la misma frecuencia u otra más baja, entonces quiere decir está entrando en funcionamiento el oscilador interno debido al fuse FCMEN y algo sigue mal con tu palabra de configuración.

Nota:
Por lo que mencionas, todo parece indicar que estás grabando el PIC con los fuses erróneos.

Hola buenos dias; Te comento que hice el ejercicio que me recomendaste con un led y el resultado fue el siguiente:

Con el archivo .INC original y los fuses que inicialmente le habia colocado, el led prendió normalmente haciendo su rutina de prendido y apagado cada 500 ms; al quitarle el cristal como me indicaste el led se apagó.

Con el archivo .INC modificado y los fuses que me indicaste le colocara, el led no prendió.

Que podria ser? o sera el pic? lo raro es que pedí prestado otro pic 18f2550 y sucede lomismo.
gracias
 
Es muy extraño lo que te sucede. Si yo compilo con los fuses por defecto y un cristal de 4 MHz, el LED destella más rápido, como a unos 250 ms.
En cambio, usando los fuses para configuración XT sin USB, el LED destella normalmente a 500 ms.

Este es el sencillo programa de prueba que usé.
Código:
[B]Asm[/B]
[COLOR=Green]    Config FOSC = XT_XT, WDT = OFF, PWRT = ON, LVP = OFF
    Config USBDIV = 1, PLLDIV = 1[/COLOR]
[B]EndAsm[/B]

Inicio:
    [B]Define[/B] OSC 4
    ADCON1 = 15
    
    TRISB.7 = 0
    
Programa:
    LATB.7 = 1
    [B]Pause[/B] 500
    LATB.7 = 0
    [B]Pause[/B] 500
    
    [B]GoTo[/B] Programa
    
    [B]End[/B]
Obviamente, para usar los fuses por defecto del archivo 18F2550.INC, comento los del programa y descomento los del archivo, y para usar los fuses del programa, comento los del archivo y descomento los del programa.

Si haces todo correctamente, deberías tener los mismos resultados que en las pruebas que yo he realizado.
 
Es muy extraño lo que te sucede. Si yo compilo con los fuses por defecto y un cristal de 4 MHz, el LED destella más rápido, como a unos 250 ms.
En cambio, usando los fuses para configuración XT sin USB, el LED destella normalmente a 500 ms.

Este es el sencillo programa de prueba que usé.
Código:
[B]Asm[/B]
[COLOR=Green]    Config FOSC = XT_XT, WDT = OFF, PWRT = ON, LVP = OFF
    Config USBDIV = 1, PLLDIV = 1[/COLOR]
[B]EndAsm[/B]

Inicio:
    [B]Define[/B] OSC 4
    ADCON1 = 15
    
    TRISB.7 = 0
    
Programa:
    LATB.7 = 1
    [B]Pause[/B] 500
    LATB.7 = 0
    [B]Pause[/B] 500
    
    [B]GoTo[/B] Programa
    
    [B]End[/B]
Obviamente, para usar los fuses por defecto del archivo 18F2550.INC, comento los del programa y descomento los del archivo, y para usar los fuses del programa, comento los del archivo y descomento los del programa.

Si haces todo correctamente, deberías tener los mismos resultados que en las pruebas que yo he realizado.

Hola buenos dias, realizaré el ejercicio y te comento. Yo adjunte una foto del menu de fuses que muestra mi programador K150; observaste algo extraño? habrá que cambiarle algún otro dato o está bien? gracias por tu atencon.
 
Lo que puedes hacer, es usar la interrupción externa por RB0, tomar el tiempo con el Timer 0 y en cada transición de la señal, limpiar el Timer y cambiar el flanco de interrupción.
De esta forma puedes medir lo que dura cada transición.
¿Qué tal, D@rkbytes?

Perdón por interrumpir el proyecto que vienen realizando.

Tengo unas dudas sobre como medir el ancho de pulso en alto de x señal (cuadrada con un duty cycle del 50%) que inyecto por el PIN_RB0.

Ya lo intenté con el comando pulsin y todo bien, ahora quiero experimentar con otros dos métodos que leí por la web, que son los siguientes:

1.- Utilizando el Timer0 y la interrupcion RB0 <---- Primero sería este.

2.- Utilizando el modulo CCP con el timer.

Bueno, sinceramente los he utilizado por separado.
He utilizado el timer0 para hacer parpadear un led variando el registro TMR0 y así obtener diferentes temporizaciones con sus respectivos cálculos utilizando la formula. OK.

Y al igual he utilizado la interrupción por RB0, pero todo esto por separado.
Ahora lo que se me complica es como unir la INT/RB0 con el Timer0 en la rutina para medir el ancho de pulso de una señal cuadrada cualquiera, no importa precisión.

O sea, ¿Cuales serían a detalle los pasos a seguir? ¿Alguien tendrá un ejemplo o aportarme?
Algo como empezar en la rutina de interrupción RB0, activando/desactivando el timer0 cambiando de flancos ascendente/descendente, etc.

Cabe mencionar que intenté adaptar un código ccs con resultados fallidos, no me hace ni pio y quiero mejor empezar desde cero.

Bueno, en este pseudo código lo único que hice es configurar todos los registros OPTION_REG e INTCON necesarios (creo) para hacer funcionar esta práctica.

Todos los aportes, ejemplos, comentarios, jalones de oreja, bienvenidos.

Gracias

Anexo pseudo código + proteus.
 

Adjuntos

  • img_02.jpg
    img_02.jpg
    141.8 KB · Visitas: 29
  • ancho de pulso.rar
    19.8 KB · Visitas: 44
Última edición por un moderador:
Yo adjunté una foto del menú de fuses que muestra mi programador K150.
¿Observaste algo extraño? ¿Habrá que cambiarle algún otro dato o está bien?
Lo extraño en ese programador es que ponga HS OSC w/PLL (O sea, Oscilador de alta frecuencia con PLL)
Cuando debería ser: XT used by USB. (En la configuración que se está usando no se usará el módulo USB)

En las pruebas que he realizado lo he grabado con el PICKit 3 y también con el JDM usando WinPic800, obteniendo los mismos resultados.

Los valores de los fuses para las tres aplicaciones son algo diferentes, sin embargo el valor número 1 es el mismo y es el que corresponde al tipo de oscilador.

Éstos son los valores leídos:

Con MicroBrn:
Fuse Value(s) (MicroBrn).jpg

Con WinPic800:
Fuse Value(s) (Winpic800).jpg

Con PICKit 3:
Fuse Value(s) (PICKit 3.jpg

Trata de grabar el PIC con otro programador y verifica su comportamiento.

Tengo unas dudas sobre como medir el ancho de pulso en alto
de x señal (cuadrada con un duty cycle del 50%) que inyecto por el PIN_RB0
O sea, cuales serían a detalle los pasos a seguir. ¿Alguien tendrá un ejemplo o aportarme?

Algo como empezar en la rutina de interrupción RB0, activando/desactivando el timer0
Necesitas seleccionar un rango para el prescaler establecido al Timer 0 usando el registro OPTION_REG.
Lo puedes hacer fijo desde 1:2 <> 1:256, eso depende de la frecuencia de trabajo y la frecuencia que quieras medir. (Ver; ciclos de instrucciones en un PIC.)
Algo más complicado es verificando el desborde del Timer 0 y cambiando el prescaler.

Después, durante el servicio de interrupción por RB0, (Interrupción externa) limpias el Timer 0, realizas un bucle de espera hasta que RB0 cambie de alto a bajo, das un tiempo de reestablecimiento de unos 3 o 10 us, y a continuación lees el valor del Timer 0.
Ese valor será el periodo que tardó el pulso en cambiar de estado.
Si lo requieres, puedes hacer una conversión dividiendo el valor de la lectura por el rango del prescaler.

Saludos.
 
Última edición:
Hola primero un saludo a esta magnifica comunidad.
Le escribo por que tengo una pregunta con respecto al ADC del PIC16F886 y es con respecto a su configuracion estoy usando este ej. de esta pagina la cual dejo en este linc http://mrchunckuee.blogspot.com/2014/08/uso-del-adc-con-pic16f887-encender-leds.html
como en este usan un 16F887 y tengo a mano un 16F886 cambie el puerto a representar para los led la cual lo tengo en el puertoB.

Le explico mi inquietud para que el ADC me trabaje tengo que poner una referencia en RA3/VREF, esto es asi por que eh visto el data del micro para configurar los registros ANSEL,ANSELH,CM1CON0,CM2CON0,etc y no logro hacer que RA3 me funcione como entrada y salida digital.

ADCON1 = %10000000
ADCON0 = %11000001
ANSEL = %00000001
CM1CON0 = 0
CM2CON0 = 0
ANSELH = 0

gracias de ante mano y agradesco sus sugerencia.
 
Atrás
Arriba