Autor Tema: Timer0_PIC18F4550_No_se_que_pasa  (Leído 20302 veces)

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

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Timer0_PIC18F4550_No_se_que_pasa
« Respuesta #45 en: 02 de Enero de 2014, 18:22:47 »
  Creo que esta mal tu definición del botón.. para leer un puerto deberías utilizar PORTAbits.RA0, o sea utilizar el registro PORT en lugar del registro LAT
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado alvaro2043

  • PIC10
  • *
  • Mensajes: 41
Re: Timer0_PIC18F4550_No_se_que_pasa
« Respuesta #46 en: 02 de Enero de 2014, 18:29:42 »
como dice el chavo eso..eso..eso.. jajajaj si ese era el problema jajajaj Gracias AngelGris... Cosas mínimas que lo estancan a uno..

Desconectado alvaro2043

  • PIC10
  • *
  • Mensajes: 41
Re: Timer0_PIC18F4550_No_se_que_pasa
« Respuesta #47 en: 02 de Enero de 2014, 23:14:03 »
Bueno ya logre algo que para uno es super sencillo que era variar el ciclo de trabajo con el pulsador. Despues de 1 mes jejejje. Unos comentarios mas arriba BrunoF me compartió un código para realizar el desafase de 2 señales a partir de una de referencia, es un código que me ayudo a entender muchas cosas ya que ese es el objetivo final pero lo tengo pensado hacer con el Dspic que mande a pedir, el cual se demora un poquito. Así que he tomado el código para poder realizar solo el desfase entre 2 señales 180 grados respecto a la otra con la misa frecuencia pero no me sale :(. Como he dicho esto lo quiero hacer para controlar un Puente H con módulos IGBT. Anexo el código que no me quiere salir y La imagen a lo que quiero llegar. Nota debo de generar un tiempo muerto para que los IGBT de la misma rama no esten activado al mismo tiempo, segun la hoja de datos del IGBT el tiene un tiempo de apagado de 350ns entonces mas o menos el tiempo muerto lo haría de 370ns..

Código: [Seleccionar]
#include <p18f4550.h>
#include <delays.h>

/*-----Definicion de estados--------*/

#define ciclo_10    1 //Ciclo del 10%
#define ciclo_20    2 //Ciclo del 20%
#define ciclo_30    3 //Ciclo del 30%
#define ciclo_40    4 //Ciclo del 40%
#define ciclo_50    5 //Ciclo del 50%

/*-----Definicion de pines-----------*/

#define PWM1    LATBbits.LATB0
#define PWM2    LATBbits.LATB2
#define button1 PORTAbits.RA0
/*-------------------------------------*/

unsigned char contador1,contador2,PwmValue,PwmValue2,estado;

/*----Prototipos de funciones----------*/

void phase_shift(void);
/*-------Interrupción de Alta_Prioridad---------*/
void Interrupt_ISR_TMR0(void);
#pragma code High_vector_Interrupt = 0x08

void High_vector(void){
     _asm goto Interrupt_ISR_TMR0 _endasm
}
#pragma code

#pragma interrupt Interrupt_ISR_TMR0
void  Interrupt_ISR_TMR0 (void)
{
    INTCONbits.TMR0IF=0;    /*Borramos bandera*/
    TMR0L=243;
    if(++contador1>10) contador1=1;
    if(++contador2>10) contador2=1;

    if(PwmValue>=contador1) PWM1=1; else PWM1=0;
    if(PwmValue2>=contador2) PWM2=1; else PWM2=0;

}

void main(){

    estado=ciclo_10;

    TRISB=0x00;
    LATB=0x00;

    TRISAbits.RA0=1; //Como entradas
    //LATAbits.LATA0=0;

/*---------Configuracion Oscilador--------*/

    OSCCONbits.SCS1=0;    //Oscilador primario
    OSCCONbits.SCS0=0;

    ADCON1=0x0F;   //Todos los pines como digitales

    T0CONbits.TMR0ON=0; //Timero Off
    T0CONbits.T08BIT=1; //Configuracion a 8bits
    T0CONbits.T0CS=0;   //Internal Instruccion
    T0CONbits.T0SE=0;
    T0CONbits.PSA=0;   //Prescaler On

    T0CONbits.T0PS2=0; //Prescaler 1:2
    T0CONbits.T0PS1=0;
    T0CONbits.T0PS0=0;

    RCONbits.IPEN=1;        //Habilitamos la prioridad
    INTCONbits.TMR0IF=0;    //Interrupcion por desbordamiento
    INTCONbits.GIE_GIEH=1;
    INTCONbits.GIEH=1;      //Activamos alta_Prioridad
    INTCONbits.TMR0IE=1;

    INTCON2bits.TMR0IP=1;  //TMR0 Alta prioridad.

    T0CONbits.TMR0ON=1;    //On Timer0

    while(1){
        switch(estado){
        case ciclo_10 :
            PwmValue=1;
            PwmValue2=1;
            while(button1);
            Delay1KTCYx(10);
            while(!button1);
            Delay1KTCYx(10);
            estado=ciclo_20;
            break;
        case ciclo_20 :
            PwmValue=2;
            PwmValue2=2;
            while(button1);
            Delay1KTCYx(10);
            while(!button1);
            Delay1KTCYx(10);
            estado=ciclo_30;
            break;
        case ciclo_30 :
            PwmValue=3;
            PwmValue2=3;
            while(button1);
            Delay1KTCYx(10);
            while(!button1);
            Delay1KTCYx(10);
            estado=ciclo_40;
            break;
        case ciclo_40 :
            PwmValue=4;
            PwmValue2=4;
            while(button1);
            Delay1KTCYx(10);
            while(!button1);
            Delay1KTCYx(10);
            estado=ciclo_50;
        case ciclo_50:
            PwmValue=5;
            PwmValue2=5;
            while(button1);
            Delay1KTCYx(10);
            while(!button1);
            Delay1KTCYx(10);
            estado=ciclo_10;
            break;
         
            }
            phase_shift();
    }
 
}


void phase_shift(void){

    unsigned char tmp;
    tmp=(contador1+6)%11;
            if(!tmp) tmp++;
    contador2=tmp;


}




Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Timer0_PIC18F4550_No_se_que_pasa
« Respuesta #48 en: 03 de Enero de 2014, 01:38:17 »
Hola,

move la linea:

phase_shift();

dentro del main pero justo antes del while().

No olvides inicializar al inicio del main() a contador1 y contador2 al valor 1.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.


 

anything