PWM PIC16F877A en MikroC

Holass

estoy trabajando con el PIC16F877A y deseo realizar una modulación por ancho de pulsos (PWM).
trabajo en mikroC y simulando en proteus. soy nuevo en esto y realice circuitos básicos I/O con leds, pero no he logrado obtener la salida PWM.

Estoy usando este codigo, que lo extrai de
http://www.micro-examples.com/public/microex-navig/doc/097-pwm-calculator.html

El drama esque en el simuladro no tengo ninguna respuesta =/





****************************************************************
void main()
{
unsigned char dc ;

TRISC = 0 ; // set PORTC as output
PORTC = 0 ; // clear PORTC

/*
* configure CCP module as 4000 Hz PWM output
*/
PR2 = 0b01111100 ;
T2CON = 0b00000101 ;
CCP1CON = 0b00001100 ;
CCP2CON = 0b00111100 ;

for(;;) // forever
{
/*
* PWM resolution is 10 bits
* don't use last 2 less significant bits CCPxCON,
* so only CCPRxL have to be touched to change duty cycle
*/
for(dc = 0 ; dc < 128 ; dc++)
{
CCPR1L = dc ;
CCPR2L = 128 - dc ;
Delay_ms(100) ;
}
for(dc = 127 ; dc > 0 ; dc--)
{
CCPR1L = dc ;
CCPR2L = 128 - dc ;
Delay_ms(100) ;
}
}
}
****************************************************************



Gracias por su tiempo :confused:
 

Adjuntos

  • Sin título.jpg
    Sin título.jpg
    131.9 KB · Visitas: 146
En la ayuda del programa hay un ejemplo con el 16f887 (la version nueva del 877)
 
Estan en la carpeta de ejemplos del mikroC, para el pic16f877A este es el codigo pero....


unsigned short current_duty, old_duty;

void InitMain() {
PORTB = 0; // set PORTB to 0
TRISB = 0; // designate PORTB pins as output

ADCON1 = 7; // all ADC pins to digital I/O
PORTA = 255;
TRISA = 255; // configure PORTA pins as input

PORTC = 0; // set PORTC to 0
TRISC = 0; // designate PORTC pins as output
PWM1_Init(5000); // Initialize PWM1 module at 5KHz
}

void main() {
initMain();

current_duty = 16; // initial value for current_duty
old_duty = 0; // old_duty will keep the 'old current_duty' value
PWM1_Start(); // start PWM1

while (1) { // endless loop
if (Button(&PORTA, 0,1,1)) // button on RA0 pressed
current_duty++ ; // increment current_duty
if (Button(&PORTA, 1,1,1)) // button on RA1 pressed
current_duty-- ; // decrement current_duty

if (old_duty != current_duty) { // if change in duty cycle requested
PWM1_Change_Duty(current_duty); // set new duty ratio,
old_duty = current_duty; // memorize it
PORTB = old_duty; // and display on PORTB
}
Delay_ms(200); // slow down change pace a little
}
}


he intentado realizar variaciones significatibas en el ancho del pulso, pero el proteus no me muestra nada
la otra duda que tengo, las salidas del PWM son CCP1 y CCP2, pero la salida me sale por el RB0 :S y las otras son nulas.

este es mi cto en proteus :confused:
 

Adjuntos

  • Sin título.jpg
    Sin título.jpg
    189.9 KB · Visitas: 208
Última edición:
Te recomendaria que leyeras y revisaras las libreria que ya trae incorporadas microC en este caso seria la del PWM. Y te sacarias de muchos problemas o bien tambien puedes darle una leida al datasheep.
 

Adjuntos

  • pwm.txt
    90 bytes · Visitas: 7
hola, el ejemplo que sta buscando el autor original del tema, es generar un PWM con el modulo del hardware (CCP)... el tema ya es viejo, pero hace poco me puse a estudiar un poco a mikroC y mikroBASIC por que me parecian fantansticas las librerias de GLCD... en el intento, me tope con que no son tan eficientes las librerias de pwm y hpwm...me refiero a que la estructura de la funcion pwm por software viene dada por:

PWM2_Init(“freq”). ; configuramos frecuencia del pwm
PWM2_Set_Duty(“ciclo de trabajo). ; configuramos el duty
PWM2_Start(). ; iniciamos el pwm
PWM2_Stop() ; paramos el pwm

y eso conlleva a que si quiero cambiar la frecuencia del PWM en el trnscurso del programa, no me deja; O sea, hay que hacerlo todo manual y pesa mas que un programa escrito en Picbasic Pro...
Busque ejemplos para ver si no era yo el que estaba usando lineas de por demas, y realmente no hay mucha info al respecto.
ojalá alguien pueda extender un poco mas la poca info que hay al respecto, por que abandone este compilador al ver que tiene estas limitaciones... saludos
 
Atrás
Arriba