TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: QQ001 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
-
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.
-
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
//***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
-
Muchas gracias AngelGris.
Tendré que buscar esos Plugins pues, sí tengo que hacerlo en MPLab
-
Muchísimas gracias por el ejemplo jadacuor.
Voy a trabajar con base en este.
Les aviso si tengo mas problemas...
Paz y Bien!!
-
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.