Autor Tema: PWM con PIC16F877A  (Leído 11359 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado QQ001

  • PIC10
  • *
  • Mensajes: 6
PWM con PIC16F877A
« en: 04 de Noviembre de 2010, 01:11:05 »
Hola a todos, espero que estén bien...

Soy nuevo en los foros y en la programación de PIC's, tal vez mis dudas puedan parecer tontas, pero he aprendido que preguntando se llega a Roma. Espero me puedan ayudar...

Mi principal problema es que solo he programado micros Atmel en ensamblador y necesito generar PWM en lenguaje C y con el PIC16F877A, pero tengo un par de dudas...

He visto que en CCS declaran que tipo de oscilador usarán (rc, xt, etc.), o la frecuencia del ocsilador (delay_time=xxxxx)
entre otras declaraciones, del tipo #fuse <nombre>
Yo estoy usando el compilador MPLab, (así me lo exigen para entregar el reporte correspondiente), la pregunta es
- ¿necesito estas declaraciones en MPLab (tipo de oscilador, frecuencia del oscilador,etc)? Si es así ¿como las declaro?

- Por otro lado, prácticamente ya he configurado el ciclo de trabajo y el periodo del PWM, pero no estoy seguro de como decirle al programa que quiero la salida por el CCP1 ó CCP2. ¿Esto lo hago simplemente con el TRISC <2,1> en cero?

- Necesito que se evalúe el cambio de estado de una entrada para decidir si se genera o no el PWM. Necesito utilizar interrupciones? o simplemente el declarar por ejemplo:

TRISB = 0x01;             //PB0 como entrada
PORTB = 0x00;            //inicio del puerto

if (PORTB == 0x01){    //evaluar cambio en puerto (PB0)
   generar PWM();        //ir a la función que genera el PWM
}
else{
   detener PWM();        //ir a la función que detiene el PWM en caso de haber estado habilitado
}

- Si tiene que ser por interrupciones, me podrían pasar un ejemplo?

Espero no asustarlos con tantas dudas...jiji
Pax et Bonum

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: PWM con PIC16F877A
« Respuesta #1 en: 04 de Noviembre de 2010, 09:01:55 »
  El MPLAB en un entorno de programación, básicamente en ASM pero se le pueden agregar "plugins" de CCS,  HiTech u otros para programar por ejemplo en C.

  Más allá que uses el entorno MPLAB, si vas a usar el compilador CCS (agregado como plugins a MPLAB) sí tenés que colocar las definiciones que se usan en CCS.

  Para saber con cual modulo CCP vas a trabajar basta con escribir el registro adecuado (CCP1CON o CCP2CON). En CCS se hace (si no me equivoco) usando "setup_ccp1" o "setup_ccp2". A su vez tenés que configurar como salida el pin correspondiente al CCP que quieras utilizar.

  Para chequear el estado de un puerto y encender o no el PWM lo podés hacer con interrupciones o por polling dependiendo de que otras cosas necesites hacer.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado jadacuor

  • PIC10
  • *
  • Mensajes: 19
Re: PWM con PIC16F877A
« Respuesta #2 en: 04 de Noviembre de 2010, 09:03:17 »
bueno si te piden que sea en mplab creo que no hay problema pues el CCS se puede vincular a mplab, ya en mplab decides cual va a ser tu compilador y ahi escoges ccs y el codigo que escribes en mplab es el de ccs, a mi modo de ver me parece mucho mejor el c de ccs....

este es un ejemplo de pwm en ccs, con la interrupcion rbo cambiamos el ciclo de trabajo,

espero te sirva
Código: [Seleccionar]
//***cambio del ciclo de trabajo de pwm a traves de la interrupcion rbo***
//*****Jairo David Cuero****

#include <16F877A.h>                ///   libreria para el manejo del pic16f877a
#fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT,NOPROTECT,NODEBUG  ///configura los fusibles
#use delay(clock=4000000)          ///   declara  la frecuencia del cristal

#use fast_io(B)

long int d;

#int_EXT
void ext_isr()
{d+=10;                                      //aunmenta el ciclo de trabajo de 10 en 10
 if(d>1020){d=10;}                           //si es mayor a 1020 vuelve a cero
 set_pwm1_duty(d);                           //cargamos el valor del ciclo de trabajo
}


void main()
{

set_tris_b(0x01);                                    //b0 como entrada
setup_ccp1(CCP_PWM);                         //modulo ccp como pwm
setup_timer_2(T2_DIV_BY_16, 255, 1);         //periodo pwm 4.098ms,  244Hz
port_b_pullups(true);                        // activar resistencias pull up en rb

enable_interrupts(INT_ext);                  ///activar interrupcion en rb0
ext_int_edge(H_TO_L);                      ///interrupcion por cambio de alto a bajo en el pin b0
enable_interrupts(GLOBAL);

while(true)
{}
}  // fin de programa principal


Desconectado QQ001

  • PIC10
  • *
  • Mensajes: 6
Re: PWM con PIC16F877A
« Respuesta #3 en: 05 de Noviembre de 2010, 00:45:31 »
Muchas gracias AngelGris.
Tendré que buscar esos Plugins pues, sí tengo que hacerlo en MPLab
« Última modificación: 05 de Noviembre de 2010, 01:07:46 por QQ001 »
Pax et Bonum

Desconectado QQ001

  • PIC10
  • *
  • Mensajes: 6
Re: PWM con PIC16F877A
« Respuesta #4 en: 05 de Noviembre de 2010, 00:47:58 »
Muchísimas gracias por el ejemplo jadacuor.

Voy a trabajar con base en este.
Les aviso si tengo mas problemas...

Paz y Bien!!
Pax et Bonum

Desconectado QQ001

  • PIC10
  • *
  • Mensajes: 6
Re: PWM con PIC16F877A
« Respuesta #5 en: 08 de Noviembre de 2010, 15:45:21 »
hola a todos,
Sigo teniendo problemas. He visto que los fuses se declaran en el menú configuration de MPLab.
Sin embargo, por ejemplo INTCON, en la simulación, no toma el valor que se asigno.
Les adjunto el código que estoy usando. Espero que me puedan decir cual es mi error.
Pax et Bonum


 

anything