Saludos a todos los seguidores!!! Hace unos días un seguidor del blog me comentaba que estaba realizando su practica del ADC en PBP y Microcode Studio y se encontró la publicación "Uso del ADC con PIC16F887 - Encender LEDs" pero tenia problemas al intentar leer mas de una entrada analógica ya que solo podía leer una sola entrada a la vez, bueno revisando el datasheet se me ocurrió una solución (mejor dicho una propuesta) para resolver su problema y es ese es el motivo de esta publicación.
Circuito:
Para iniciar seguí con la propuesta de encender unos LEDs conectados al puerto B, C y D de nuestro PIC16F887, como entradas he colocado un potenciometro en AN0, AN1 y AN4, lo demás pues ya es básico su oscilador y botón de Reset, la mecánica sera fácil para cada potenciometro le toca encender una cantidad de LEDs (que son los que están en cada puerto), así que el circuito nos queda de la siguiente forma:
Ahora bien la teoría del ADC y como configurarlo esta en la publicación antes mencionada, retomando el código anterior se puede hacer este ejemplo para iniciar lo único que se debe de hacer es leer AN0 y guardar el valor en una variable, después leemos AN1 y lo guardamos en otra variable, por ultimo leer AN4 y guardarlo en una tercera variable (si se tiene mas entradas pues se sigue la misma mecánica), procesamos el valor leido o en este caso hacemos la división y luego mostramos los valores en el puerto, bueno esta es la forma en la que se me ocurrió resolverlo se que el código falta pulirlo y depurarlo pero para efectos demostrativos es suficiente.
Código:
El código es el siguiente:
Descargas:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'**************************************************************** | |
'* Name : USO DE 3 CANALES ANALOGICOS CON EL PIC16F887 * | |
'* Author : https://mrchunckuee.blogspot.com/ * | |
'* Notice : Copyright (c) 2014 MrChunckuee * | |
'* : All Rights Reserved * | |
'* Date : 01/06/2014 * | |
'* Version : 1.0 * | |
'* Notes : * | |
'* : * | |
'**************************************************************** | |
DEFINE OSC 4 | |
; PARÁMETROS DEL ADC | |
DEFINE ADC_BITS 10 ; NÚMERO DE BITS | |
DEFINE ADC_CLOCK 3 ; USAR CLOCK RC DEL ADC | |
DEFINE ADC_SAMPLEUS 50 ; TIEMPO DE MUESTREO EN 50uS | |
; VARIABLES | |
RES_AN0 VAR WORD ; | |
RES_AN1 VAR WORD ; VARIAVLE PARA EL RESULTADO DE LA CONVERSIÓN | |
RES_AN4 VAR WORD ; | |
VAL_AN0 var BYTE ; | |
VAL_AN1 var BYTE ;VARIABLE PARA LA SALIDA | |
VAL_AN4 var BYTE ; | |
; CONFIGURACION DE ENTRADAS-SALIDAS | |
TRISA.0 = 1 ; RA0 (AN0) COMO ENTRADA | |
TRISA.1 = 1 ; RA1 (AN1) COMO ENTRADA | |
TRISA.5 = 1 ; RA5 (AN4) COMO ENTRADA | |
TRISB = 0 ; PORTB SALIDA (ADC) | |
TRISC = 0 ; PORTC SALIDA (ADC) | |
TRISD = 0 ; PORTD SALIDA (ADC) | |
;LIMPIAMOS EL PUERTO ANTES DE MOSTRAR | |
PORTA = 0 | |
PORTB = 0 | |
PORTC = 0 | |
PORTD = 0 | |
MAIN: | |
GOSUB CONFIG_ADC ;CONGIGURAMOS Y LEEMOS EL ADC | |
; DIVIDIMOS ENTRE 127 YA QUE 1023/8 LEDS = 127.875 | |
; LO DEJAMOS EN 127 PARA TENER UNA TOLERANCIA | |
VAL_AN0 = RES_AN0/127 | |
VAL_AN1 = RES_AN1/127 | |
VAL_AN4 = RES_AN4/127 | |
;ENDENCEMOS LOS LEDs EN B, C Y D DEPENDIENDO DEL VALOR OPTENIDO | |
GOSUB MUESTRO_AN0 | |
GOSUB MUESTRO_AN1 | |
GOSUB MUESTRO_AN4 | |
GOTO MAIN; REGRESA A LA ETIQUETA MAIN (BUCLE INFINITO) | |
CONFIG_ADC: | |
ADCON1 = %10000000 | |
ADCON0 = %11000001 ; SELECCIONA AN0 | |
ADCIN 0, RES_AN0 ; LEER AN0 | |
ADCON0 = %11000101 ; SELECCIONA AN1 | |
ADCIN 1, RES_AN1 ; LEER AN1 | |
ADCON0 = %11010001 ; SELECCIONA AN4 | |
ADCIN 4, RES_AN4 ; LEER AN4 | |
RETURN | |
MUESTRO_AN0: | |
; ESTO ES PARA ENCENDER LOS LEDS DEL PUERTO B | |
; DEPENDIENDO DEL VOLTAJE DE ENTRADA EN RA0 | |
SELECT CASE VAL_AN0 | |
CASE 0 | |
PORTB = %00000000 | |
CASE 1 | |
PORTB = %00000001 | |
CASE 2 | |
PORTB = %00000011 | |
CASE 3 | |
PORTB = %00000111 | |
CASE 4 | |
PORTB = %00001111 | |
CASE 5 | |
PORTB = %00011111 | |
CASE 6 | |
PORTB = %00111111 | |
CASE 7 | |
PORTB = %01111111 | |
CASE 8 | |
PORTB = %11111111 | |
END SELECT | |
RETURN | |
MUESTRO_AN1: | |
; ESTO ES PARA ENCENDER LOS LEDS DEL PUERTO C | |
; DEPENDIENDO DEL VOLTAJE DE ENTRADA EN RA1 | |
SELECT CASE VAL_AN1 | |
CASE 0 | |
PORTC = %00000000 | |
CASE 1 | |
PORTC = %00000001 | |
CASE 2 | |
PORTC = %00000011 | |
CASE 3 | |
PORTC = %00000111 | |
CASE 4 | |
PORTC = %00001111 | |
CASE 5 | |
PORTC = %00011111 | |
CASE 6 | |
PORTC = %00111111 | |
CASE 7 | |
PORTC = %01111111 | |
CASE 8 | |
PORTC = %11111111 | |
END SELECT | |
RETURN | |
MUESTRO_AN4: | |
; ESTO ES PARA ENCENDER LOS LEDS DEL PUERTO D | |
; DEPENDIENDO DEL VOLTAJE DE ENTRADA EN RA4 | |
SELECT CASE VAL_AN4 | |
CASE 0 | |
PORTD = %00000000 | |
CASE 1 | |
PORTD = %00000001 | |
CASE 2 | |
PORTD = %00000011 | |
CASE 3 | |
PORTD = %00000111 | |
CASE 4 | |
PORTD = %00001111 | |
CASE 5 | |
PORTD = %00011111 | |
CASE 6 | |
PORTD = %00111111 | |
CASE 7 | |
PORTD = %01111111 | |
CASE 8 | |
PORTD = %11111111 | |
END SELECT | |
RETURN | |
END; FIN DEL PROGRAMA |
Descargas:
Aquí el enlace directo para DESCARGAR los archivos disponibles, también puedes revisar o descargar la información desde mi repositorio en GitHub, si no sabes como descargarlo puedes checar aquí, bueno por el momento es todo si tienes dudas, comentarios, sugerencias, inquietudes, traumas, etc. dejarlas y tratare de responder lo mas pronto posible.
Donaciones:
Si te gusta el contenido o si los recursos te son de utilidad, comparte el enlace en tus redes sociales o sitios donde creas que puede ser de interés y la otra puedes ayudarme con una donación para seguir realizando publicaciones y mejorar el contenido del sitio. También puedes hacer donaciones en especie, ya sea con componentes, tarjetas de desarrollo o herramientas. Ponte en contacto para platicar, o puedes volverte uno de nuestros sponsors.
Pido una retroalimentación avisando cada que un enlace no sirva o tenga errores al momento de abrirlo, así también si una imagen no se ve o no carga, para corregirlo en el menor tiempo posible.
0 Comentarios