# PWM PIC16F877A en MikroC



## bukeriano (May 4, 2010)

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


----------



## DOA (May 4, 2010)

En la ayuda del programa hay un ejemplo con el 16f887 (la version nueva del 877)


----------



## bukeriano (May 5, 2010)

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


----------



## johncaro12 (Ene 27, 2012)

la solucion es conseguir la nueva version de proteus... tal parece que las antiguas no simulan pwm..
saludos


----------



## algofer (Mar 19, 2016)

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.


----------



## torres.electronico (Mar 20, 2016)

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


----------

