TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: sokoloko en 02 de Septiembre de 2010, 17:39:04
-
Hola amigos,
Estoy aprendiendo poco a poco en esto de programar PIC (basicamente en C), y temas de entradas y salidas digitales, mas o menos lo controlo (al menos lo básico). Pero ahora tenia en mente complicarme un poco mas y creo que me he pasado de complicación. :?
Me gustaria en un 16f88, tener una entrada analogica con un potenciometro entre 0 y 5v, y una salida PWM con un led que parpadee y varie su velocidad de parpadeo segun el valor del potenciometro.
Me podeis orientar un poco sobre como "diseñar" el programa. ;-)
Gracias!!!!
-
Hola,
Tras varias pruebas y lecturas, he decidido ir por pasos.
Primero voy a inentar que me funcione la parte A/D y despues me meto con el codigo PWM.
Tengo este codigo que segun la entrada analogica, enciende 3 Leds (menos 33% enciende Led1, entre 33 y 66% Led2 y mas de 66% Led3)
Pero no me funciona, algun consejo??
#include <16f88.h>
#device adc=10
#use delay(clock=8000000)
#fuses HS, NOWDT, NOLVP, NOMCLR
#define motor PIN_B2
#define on PIN_B0
#define puff PIN_B1
int duty;
void main(void){
//CONFIGURACIÓN CONVERSOR AD
SETUP_ADC(ADC_CLOCK_INTERNAL); //TIEMPO DE CONVERSION Fosc/8
SETUP_ADC_PORTS(sAN0); // CONFIGURACION DE AN0 COMO CANAL ANALÓGICO
SET_ADC_CHANNEL(0); //SELECCIONAMOS EL CANAL 0 PARA LA CONVERSION
//CONFIGURACION MÓDULO CCP
//setup_timer_2(T2_DIV_BY_16,124,1); //configuramos el timer 2 para una frecuencia de 1000hz
//SETUP_CCP1(CCP_PWM); //CONFIGURAMOS MODULO CCP PARA PWM
//SET_PWM1_DUTY(50); //DAMOS UN CICLO DE TRABAJO INICIAL DE 50%
while(1){
duty=read_adc(); //leemos canal analogico que nos devuelve un numero entre 0 y 1024
if(duty>=800) { //si el numero es mayor que 100 le asiugnamos el valor 100
output_high(puff); // Encender LED
output_low(motor);
output_low(on); }
if(duty>400 && duty<800) { //si el numero es mayor que 100 le asiugnamos el valor 100
output_high(on); // Encender LED
output_low(puff);
output_low(motor); }
if(duty<400) { //si el numero es mayor que 100 le asiugnamos el valor 100
output_high(motor); // Encender LED
output_low(on);
output_low(puff); }
//SET_PWM1_DUTY(duty); //establecemos el nuevo ciclo d etrabajo
}
}
PD: Adjunto codigo en C, hex y simulacion en proteus.
-
Hola sokoloko, he estado viendo tu programa y por el momento le veo dos errores:
Declaras int duty; y luego pones instrucciones como: if(duty >= 800) Recuerda que las variables tipo int solo son de 8 bits (0 -->255), por lo que la deberias declarar como: long int duty;.
Luego veo que tienes la siguiente línea en el archivo 16F88_A-D.c del archivo que subiste:
duty = duty * 10; //dividimos el numero entre 10 para tener un numero entre 0 y 102,4 Me imagino que debe ser un error de tipografía y que quisiste poner:
duty = duty / 10; //dividimos el numero entre 10 para tener un numero entre 0 y 102,4
Si veo algo más te cuento.
Saludos!
-
BuuuuFFFFF!!!!!!!
Mil gracias Bmb, has dado con el problema :-) :-) :-)
Ha sido cambiar la variable a Long y funcionar a la perfección. La linea que comentas:
duty = duty / 10; //dividimos el numero entre 10 para tener un numero entre 0 y 102,4
Como bien supones era de unas pruebas y tenia que ir comentada.
Pero por fin puedo continuar con la aplicación.
Muchas gracias :mrgreen: