TODOPIC
Microcontroladores PIC => dsPIC => Mensaje iniciado por: leotardo en 18 de Mayo de 2007, 11:39:09
-
favor de ayudita.
necesito controlar el PWM, que ahora llaman "Output compare".
no encuentro manera, ni cambiando los relojes de referencia, ni cambiando el OCxR por el OCxRS, ni na,
in en hard ni en simulaciones, ni mueve puerto ni salta interrupcion.
--------------------
#include "p30f4011.h"
_FWDT(WDT_OFF); /* Turn off the Watch-Dog Timer. */
void __attribute__((__interrupt__,auto_psv)) _ISR _T3Interrupt(void);
void __attribute__((__interrupt__,auto_psv)) _ISR _OC3Interrupt(void);
void __attribute__((__interrupt__,auto_psv)) _ISR _OC4Interrupt(void);
void cebapuertos(void);
int kk;
int main(void){
cebapuertos();
while(1){
if(kk!=PORTD){
kk=PORTD; //trampa para el break poin
}
}
}
void cebapuertos(void){
//pwm3
TRISDbits.TRISD2=0; //pin out
TRISD=0x0000; //pin out, todos out por si meto pata
OC3CONbits.OCSIDL=0;
OC3CONbits.OCTSEL=1; //t3 selec
OC3CONbits.OCM=0b101; //pulsos continuos
OC3R= 0x0040; //arranque
OC3RS=0x0080; //parada
IFS1bits.OC3IF=0;
IEC1bits.OC3IE=1; //interrupcion del oc
//pwm4
OC4CONbits.OCSIDL=0;
OC4CONbits.OCTSEL=0; //t3 selec
OC4CONbits.OCM=0b101; //pulsos continuos
OC4R= 0x0040; //arranque
OC4RS=0x0080; //parada
IFS1bits.OC4IF=0;
IEC1bits.OC4IE=1; //interrupcion del oc
//clock es t3
PR3=0x0100;
TMR3=0x0000;
T3CON=0;
T3CONbits.TON=1;
IFS0bits.T3IF=0;
IPC1bits.T3IP=4;
IEC0bits.T3IE=1; //T3,interrupcion de 100us, prioridad 4
//tambien clock 2, pero sin interrupcion
PR2=0x0100;
TMR2=0x0000;
T2CON=0;
T2CONbits.TON=1;
IFS0bits.T2IF=0;
IEC0bits.T2IE=0; //T3,interrupcion de 100us, prioridad 4
}
void __attribute__((__interrupt__)) _T3Interrupt( void ){
//por aqui pasa cada 100Us, = 10Khz, prioridad 4
IFS0bits.T3IF=0;
}
void __attribute__((__interrupt__,auto_psv)) _ISR _OC3Interrupt(void){
IFS1bits.OC3IF=0;
}
void __attribute__((__interrupt__,auto_psv)) _ISR _OC4Interrupt(void){
IFS1bits.OC4IF=0;
}
-
Si quieres echa un vistazo a mi proyecto de Motores musicales (http://www.micropic.es/index.php?option=com_content&task=view&id=3&Itemid=57), donde controlo la melodía utilizando el PWM de un 30F4011.
(http://www.micropic.es/images/imagenes/motor%20zumbon.jpg) (http://www.micropic.es/index.php?option=com_content&task=view&id=3&Itemid=57)
-
Si, la cosa promete, pero hace referencia a un include: "pwm.h", sospecho que alli esta la clave del asunto.
¿podrias ponerlo por aqui. ?
-
ya esta.
la simulacion falla, pero el osciloscopio dice que funciona.
aqui os dejo un ejemplo.
-------------------------------------
//ejemplo de PWM en el dsPIC30F4011 ds PIC30F4011
//LA SIMULACION EN EL MPLAB IDE v7.01 ¡¡¡¡¡ F A L L A
#include "p30f4011.h"
_FOSC(CSW_FSCM_OFF & ECIO); //sin cuentos de seguridad, clock externo x 4 pll
_FWDT(WDT_OFF); /* Turn off the Watch-Dog Timer. */
void __attribute__((__interrupt__,auto_psv)) _ISR _T3Interrupt(void);
void __attribute__((__interrupt__,auto_psv)) _ISR _OC3Interrupt(void);
int kk;
int main(void){
//puertos
TRISDbits.TRISD2=0; //pin out
TRISF=0x0000; //pin out, usados por interrupcion para ver como va la cosa
//pwm3
OC3CONbits.OCSIDL=0;
OC3CONbits.OCTSEL=1; //t3 selec
OC3CONbits.OCM=0b101; //pulsos continuos
OC3R= 0x0200; //arranque
OC3RS=0x0400; //parada
IFS1bits.OC3IF=0;
IEC1bits.OC3IE=1; //interrupcion del oc3
//clock es t3
PR3=0x0800; //ciclo del reloj
TMR3=0x0000;
T3CON=0; //todo a 0, (preescaler y demas,,,
T3CONbits.TON=1; //encendido
IFS0bits.T3IF=0;
IPC1bits.T3IP=4; //prioridad 4
IEC0bits.T3IE=1; //T3,interrupcion,
while(1){
PORTFbits.RF0=0;
PORTFbits.RF1=0;
if(kk!=PORTD){
kk=PORTD; //esto para poner un break point
}
}
}
void __attribute__((__interrupt__)) _T3Interrupt( void ){
PORTFbits.RF0=1; //chivato de paso por aqui
IFS0bits.T3IF=0; //a 0 en main, para darle mas tiempo al osciloscopio
}
void __attribute__((__interrupt__,auto_psv)) _ISR _OC3Interrupt(void){
PORTFbits.RF1=1; //chivato de paso por aqui
IFS1bits.OC3IF=0; //a 0 en main, para darle mas tiempo al osciloscopio
}
-
No hay que fiarse de los simuladores; el mundo real siempre es diferente y, en tu caso, mejor. Me alegro.