Ayuda PWM PIC16F877A
3 participantes
Página 1 de 1.
Ayuda PWM PIC16F877A
Hola necesito ayuda con el PWM en un pic 16f877a, a una frecuencia de 1khz para un led,
el codigo es el siguiente la verdad me es dificil identificar si esta bien con el simulador proteus.
la intension es ocupar un potenciometro para el puerto analogo digital y dependiento si esta al maximo (1023) controlar la intensidad de luz del led.
El codigo original es de risanti modificado.
Quedo en espera de su apoyo.
Saludos cordiales!!!
el codigo es el siguiente la verdad me es dificil identificar si esta bien con el simulador proteus.
la intension es ocupar un potenciometro para el puerto analogo digital y dependiento si esta al maximo (1023) controlar la intensidad de luz del led.
- Código:
/* ----------------------------------------------------------------------- */
/* Template source file generated by piklab */
#include <pic16f877a.h>
#include <pic/adc.h>
/* ----------------------------------------------------------------------- */
/* Configuration bits: adapt to your setup and needs */
typedef unsigned int word;
word at 0x2007 CONFIG = _RC_OSC & _WDT_OFF & _PWRTE_OFF & _BODEN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _DEBUG_OFF & _CP_OFF;
//**********Funciones Usadas*************
void pwm1_send(unsigned int valor);
void pwm2_send(unsigned int valor);
void main() {
int valor=0;
TRISA=1;
TRISB=0;
TRISC=0;
PORTA=0;
PORTB=0;
PORTC=0;
//Habilito TMR0
TMR0=0;
adc_init(FOSC_2, A1_R0, INT_OFF); //Uso de Rutina ADC de PIC, iniciacion
OPTION_REG=135; //Configuro preescaler de TMR0
//****************PWM 1 Volt**********************************
T2CON=1; //PreScaler 4
PR2=249; //PR2 249, parA 1KHZ
//PWM1 RC2
CCPR1L=0; //Ancho del Ciclo debe ser 1ms
CCP1CON=12;
//PWM2 RC1
CCPR2L=0; //Ancho del Ciclo debe ser 1ms
CCP2CON=12;
TMR2ON=1;//Tmr2 Encendido
while(1) {
valor=adc_read(0);
pwm1_send(valor); //valor del analogo-digital
pwm2_send(1023); //siempre al maximo
}
}
/*****************PWM 1 RC2****************/
void pwm1_send(unsigned int valor)
{
unsigned char temp,temp1 ;
temp=valor>>2;
temp1=(valor & 0x03)<<4;
//******Valor de PWM*******
CCPR1L=temp;
CCP1CON=temp1|12;
//************************
}
/******PWM 2 RC1****************/
void pwm2_send(unsigned int valor)
{
unsigned char temp,temp1 ;
temp=valor>>2;
temp1=(valor & 0x03)<<4;
//******Valor de PWM*******
CCPR2L=temp;
CCP2CON=temp1|12;
//************************
}
El codigo original es de risanti modificado.
Quedo en espera de su apoyo.
Saludos cordiales!!!
tony8a87- Participante Activo
- Mensajes : 34
Fecha de inscripción : 10/08/2010
Re: Ayuda PWM PIC16F877A
Saludos quiero compartir mi primer codigo usando pwm con exito, aun tengo algunas pequeñas dudas y necesito mejorar mi codigo y apartir de ello generar una libreria para su facil uso.
En este codigo hago encender un led por el cpp1 del 100% al 0% con decremento de 10%.
Mi gran duda es el famoso duty cycle, porque entiendo que el valor maximo debe 1023 que deberia ser 100% de trabajo sin embargo usando el link:
http://www.micro-examples.com/public/microex-navig/doc/097-pwm-calculator.html
me da otros valores para diferentes porcentajes.
La simulación funciona bien y en la vida real también, caresco de un osiloscopio para comprar en realidad si respeta la frecuencia que defini, asi que en uno de estos días ire de visita a mi vieja escuela y realizare mis pruebas.
Saludos cordiales!!!!!!
En este codigo hago encender un led por el cpp1 del 100% al 0% con decremento de 10%.
- Código:
/* ----------------------------------------------------------------------- */
/* Template source file generated by piklab */
#include <pic16f877a.h>
#include <pic/delai.h>
/* ----------------------------------------------------------------------- */
/* Configuration bits: adapt to your setup and needs */
typedef unsigned int word;
word at 0x2007 CONFIG = _XT_OSC & _WDT_OFF & _PWRTE_OFF & _BODEN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _DEBUG_OFF & _CP_OFF;
//PWM registers configuration
//Fosc = 4000000 Hz
//Fpwm = 250.00 Hz (Requested : 250 Hz)
//Periodo PWM = 1/Fpwm = 4*10exp-3=0.004
//PR2 = (Periodo PWM/4*Tosc*Prescaler) - 1= 249
////////Calculo de CCPR1L:CCP1CON<5:4>:////////////////
//PWM duty cycle = %Ciclo de trabajo*Periodo PWM
//CCPR1L:CCP1CON<5:4> = (% Ciclo/ Fpwm)/(Tosc*Prescaler)
void pwm1_send();
void main() {
TRISC=0;
PORTC=0;
PR2=249;
T2CON = 0b00000111;
CCPR1L=0;
CCP1CON=12;
TMR2ON=1;
while(1) {
pwm1_send();
}
}
void pwm1_send(){
CCPR1L = 0b11111001;
CCP1CON = 0b00111100;
delay_ms(100);
CCPR1L = 0b11100000;
CCP1CON = 0b00111100;
delay_ms(100);
CCPR1L = 0b11000111;
CCP1CON = 0b00111100;
delay_ms(100);
CCPR1L = 0b10101110;
CCP1CON = 0b00111100;
delay_ms(100);
CCPR1L = 0b10010101;
CCP1CON = 0b00111100;
delay_ms(100);
CCPR1L = 0b01111100;
CCP1CON = 0b00111100;
delay_ms(100);
CCPR1L = 0b01100011;
CCP1CON = 0b00111100;
delay_ms(100);
CCPR1L = 0b01001010;
CCP1CON = 0b00111100;
delay_ms(100);
CCPR1L = 0b00110001 ;
CCP1CON = 0b00111100 ;
delay_ms(100);
CCPR1L = 0b00011000;
CCP1CON = 0b00111100;
delay_ms(100);
CCPR1L = 0b00000000;
CCP1CON = 0b00111100;
delay_ms(100);
}
Mi gran duda es el famoso duty cycle, porque entiendo que el valor maximo debe 1023 que deberia ser 100% de trabajo sin embargo usando el link:
http://www.micro-examples.com/public/microex-navig/doc/097-pwm-calculator.html
me da otros valores para diferentes porcentajes.
La simulación funciona bien y en la vida real también, caresco de un osiloscopio para comprar en realidad si respeta la frecuencia que defini, asi que en uno de estos días ire de visita a mi vieja escuela y realizare mis pruebas.
Saludos cordiales!!!!!!
tony8a87- Participante Activo
- Mensajes : 34
Fecha de inscripción : 10/08/2010
Yo tmb quiero hacer un PWM
Hola, soy nuevo en el foro, estaba aprendiendo a programar con PCWH, con ccs, y me artaron los problemas con windows, entonces me estoy mudando a ubuntu, y estoy en la tarea de empezar a programar pic con piklab. Quiero hacer lo mismo que vos tengo un 16F887, y quero con un potenciómetro variar el ancho del pulso y a una frecuencia de 1kHz, mis dudas son: ¿Qué es el preescaler? ¿Dónde puedo conseguir algun libro o cuál es la manera que uds recomiendan para aprender SDCC? Y yo tengo armado un clon de propic para grabar los pic, a piklab lo configuro como programador directo?, ¿me sirve este grabador? Desde ya muchas gracias me parece muy copado el foro, y bueno, todavía no entiendo bien el codigo del PWM, pero le pondremos ganas para poder hacerlo Saludos
PD: Ahi estoy leyendo el datasheets, y sale algo del preescaler, lo que se es que en el ejemplo de arriva vale 16, si después puedo aportar algo interesante del datasheet lo agrego
PD: Ahi estoy leyendo el datasheets, y sale algo del preescaler, lo que se es que en el ejemplo de arriva vale 16, si después puedo aportar algo interesante del datasheet lo agrego
Última edición por martincruz el Sáb 28 Mayo 2011 - 3:37, editado 1 vez (Razón : editado para agregar información)
martincruz- Nuevo Usuario
- Mensajes : 6
Fecha de inscripción : 27/05/2011
Re: Ayuda PWM PIC16F877A
Hola martincruz, bienvenido al foro.
Respecto al prescaler: el funcionamiento es sencillo, el timer normalmente (sin prescaler o con prescaler=1) se incrementa en cada ciclo de reloj, si pones el prescaler a 2, entonces se incrementa cada 2 ciclos de reloj, si lo pones a 16 pues cada 16 ciclos de reloj.
Para SDCC no hay ningun libro que yo sepa, puedes empezar por ir mirando ejemplos, por el foro seguro que encuentras unos pocos, mira en la sección Herramientas de compilación - SDCC.
No conozco el Propic, pero si es por puerto paralelo no debería haber problema en Piklab, si no te funciona puedes probar linea a linea, en la configuración del programador, en el botón New/Test, ahí puedes ir poniendo cada linea alta/baja e ir midiendo tensiones a ver si están correctas, también puedes cambiar las lineas del puerto paralelo que corresponde a cada linea del programador en caso de que la configuración que trae Piklab no corresponda con la de tu programador.
Saludos
Respecto al prescaler: el funcionamiento es sencillo, el timer normalmente (sin prescaler o con prescaler=1) se incrementa en cada ciclo de reloj, si pones el prescaler a 2, entonces se incrementa cada 2 ciclos de reloj, si lo pones a 16 pues cada 16 ciclos de reloj.
Para SDCC no hay ningun libro que yo sepa, puedes empezar por ir mirando ejemplos, por el foro seguro que encuentras unos pocos, mira en la sección Herramientas de compilación - SDCC.
No conozco el Propic, pero si es por puerto paralelo no debería haber problema en Piklab, si no te funciona puedes probar linea a linea, en la configuración del programador, en el botón New/Test, ahí puedes ir poniendo cada linea alta/baja e ir midiendo tensiones a ver si están correctas, también puedes cambiar las lineas del puerto paralelo que corresponde a cada linea del programador en caso de que la configuración que trae Piklab no corresponda con la de tu programador.
Saludos
Re: Ayuda PWM PIC16F877A
Si estuve viendo de hacer eso del new test, pero no cambia nada, parece estar muerto.... el propic2 dos tiene luces que indican si hay comunicación, pero nada.... parece que no esta haciendo nada el propic, por las dudas me voy a poner a medir con el tester... pero la verdad ya me estoy resignando... no! Hasta que no lo haga andar tengo que seguir jajaj. Gracias por la respuesta.
martincruz- Nuevo Usuario
- Mensajes : 6
Fecha de inscripción : 27/05/2011
Re: Ayuda PWM PIC16F877A
martincruz escribió:Si estuve viendo de hacer eso del new test, pero no cambia nada, parece estar muerto.... el propic2 dos tiene luces que indican si hay comunicación, pero nada.... parece que no esta haciendo nada el propic, por las dudas me voy a poner a medir con el tester... pero la verdad ya me estoy resignando... no! Hasta que no lo haga andar tengo que seguir jajaj. Gracias por la respuesta.
Saludos te sugiero revisar el siguiente link, se trata de realizar tu propio programador usb hardware libre, tiene versión para linux, yo tengo compre un ensamble mexicano y me ha funcionado muy bien. Con respecto al pwm el preescaler es parte de una formula para realizar el ancho de pulso. He estado algo detenido con los pics de momento también mi intención es ocupar un pwm variable.
http://usbpicprog.org/?page_id=193
http://sourceforge.net/projects/usbpicprog/files/usbpicprog-hardware/usbpicprog-0.3.2-hardware/
Saludos cordiales!!!
tony8a87- Participante Activo
- Mensajes : 34
Fecha de inscripción : 10/08/2010
Re: Ayuda PWM PIC16F877A
Muchas gracias por responder. Con respecto al preescaler, ya lo entendí El programador USB del link se ve muy bonito y el software también. En un futuro lo armaré, pero hoy por hoy quisiera hacer andar este propic2 es una lástima que lo reemplace, con el poco funcionamiento que tiene.... y puede programar una gran variedad de pics, y solo por un proiblema de configuración no quisiera cambiarlo todavía muchas gracias saludos
martincruz- Nuevo Usuario
- Mensajes : 6
Fecha de inscripción : 27/05/2011
Temas similares
» PWM en lenguaje C, PIC16F877A
» Cargador de baterías universal con SDCC y PIC16F877A.
» Fuente de alimentación digital 0-25V con SDCC y PIC16F877A.
» Ayuda con PWM
» master prog en linux??
» Cargador de baterías universal con SDCC y PIC16F877A.
» Fuente de alimentación digital 0-25V con SDCC y PIC16F877A.
» Ayuda con PWM
» master prog en linux??
Página 1 de 1.
Permisos de este foro:
No puedes responder a temas en este foro.