Yo quiero hacer algunas preguntas sobre este tema no se si ya está agotado,si es así consultare por mail
Va la pregunta ejemplo cargo el fuente .c PWM con POTS en un 18F4550 por medio de un bootloader y no funciona, cambie de salidas,etc, bueno dejo el programa que cargo.
este es el PWM_init
Alguien podría dar una mano. Muchas gracias
Va la pregunta ejemplo cargo el fuente .c PWM con POTS en un 18F4550 por medio de un bootloader y no funciona, cambie de salidas,etc, bueno dejo el programa que cargo.
Código:
//////////////////////////////////////////////////////////////////////////
////Control de 3 canales PWM por software //
////se utiliza para mesclar el brillo de tres leds;rojo,verde,azul //
////utilizando potenciometro conectados a puerto AN0,AN1 y AN2 //
////recuerde que la libreria PWM.h debe estar en la misma carpeta //
////donde se encuentre su codigo fuente //
//////////////////////////////////////////////////////////////////////////
#include <18F4550.h>
#device ADC=8
#fuses HSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#include "usb_bootloader.h"
#use delay(clock = 48000000)
#Define CH0 PIN_D0 //led ROJO conectado a rb5, cambie de pin si desea
#Define CH1 PIN_D1 //led VERDE conectado a rb6, cambie de pin si desea
#Define CH2 PIN_D3 //led AZUL conectado a rb7, cambie de pin si desea
#include <PWM.h> //libreria para generar PWM de 8 bit por software
#use fast_io(d)
//#use fast_io(a)
void main (void)
{
unsigned byte value;
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(AN0_TO_AN2); //A0,A1,A2 entradas analogicas
set_tris_d(0xF0);
output_d(0);
//output_a(0);
delay_ms(20);
PWM_init(150); //Inicia MACRO para generar PWM por software, RTCC_DIV_2
while(true)
{
set_adc_channel(0);
delay_us(50);
value=read_adc(); //lee canal AN0
write_duty0(value);//escribe canal PWM0
output_high(CH0);
set_adc_channel(1);
delay_ms(150);
value=read_adc(); //lee canal AN1
write_duty1(value);//escribe canal PWM1
output_low(CH0);
output_high(CH1);
set_adc_channel(2);
delay_ms(150);
value =read_adc(); //lee canal AN2
output_low(CH1);
write_duty2(value);//escribe canal PWM2
}
}
Código:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
////libreria PWM.h, version 8Bit //
////author: dinoelectro //
////www.forosdeelectronica.com //
////dino_barreto@hotmail.com //
////Con esta libreria podra generar ondas PWM con una resolucion de 8bit. //
////Por defecto las ondas generadas salen por los pines B0, B1 y B2, pero cualquier otro PIN puede ser //
////configurado como salida PWM; Por ejemplo: para generar las ondas en los pines A0,A1 y A2 usted deberia //
////hacer la definicion de los canales como sigue: //
//// #define CH0 PIN_A0 //
//// #define CH1 PIN_A1 //
//// #define CH2 PIN_A2 //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef CH0 #define CH0 PIN_D0 #endif //si no ha definido, PIN_B0 sera canal0 PWM por defecto
#ifndef CH1 #define CH1 PIN_D1 #endif //si no ha definido, PIN_B1 sera canal1 PWM por defecto
#ifndef CH2 #define CH2 PIN_D3 #endif //si no ha definido, PIN_B2 sera canal2 PWM por defecto
unsigned byte intcount =0;
unsigned byte dutycycle0=0;
unsigned byte dutycycle1=0;
unsigned byte dutycycle2=0;
unsigned byte Reload;
///////////////////////////////////////////////////////////////////////////////////////////////////////
////Funcion PWM_init(load) //
////USO: //
//// Esta funcion inicia y habilita interrupcion por timer0 //
//// el timer0 es necesario para generar la onda PWM cuya //
//// frecuencia esta directamente realacionada con el cristal //
//// que haya elejido y con el valor que carga en el timer0 //
////Parametros: //
//// load: puede tomar un valor de 0... 255 //
//// mientras mayor sea el valor de load, mayor sera la frecuencia de la onda PWM // //
////VALOR DE RETORNO: //
//// ninguno //
///////////////////////////////////////////////////////////////////////////////////////////////////////
void PWM_init(load)
{
if (load >240) load=240;
Reload = load;
setup_timer_0(RTCC_INTERNAL|RTCC_8_BIT);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////
////Funciones Write_Duty0, Write_Duty1, Write_Duty2 //
////USO: //
//// Estas funciones escriben el valor del ciclo util en los canales 0, 1 y 2; respectivamente //
////PARAMETROS: //
//// value, es el ciclo util, puede tomar un valor entre 0 y 255 //
////VALOR DE RETORNO: //
//// ninguno //
///////////////////////////////////////////////////////////////////////////////////////////////////////
void write_duty0(value) {dutycycle0=value;}
void write_duty1(value) {dutycycle1=value;}
void write_duty2(value) {dutycycle2=value;}
///////////////////////////////////////////////////////////////////////////////////////////////////////
#int_timer0
void timer0_isr()
{ set_timer0(Reload);
if (intcount--==0)
{
output_high(CH0);
output_high(CH1);
output_high(CH2);
}
if (intcount==dutycycle0)output_low(CH0);
if (intcount==dutycycle1)output_low(CH1);
if (intcount==dutycycle2)output_low(CH2);
}
Última edición por un moderador: