TODOPIC

Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: Joshuegp en 10 de Abril de 2020, 06:35:22

Título: Estoy intentando generar una onda triangular con interrupciones.
Publicado por: Joshuegp en 10 de Abril de 2020, 06:35:22
Buenas,

Estoy intentando generar una señal triangular usando la interrupción del Timer2 a su vez, uso un DAC (R2R) para obtener la señal en proteus, pero hasta el momento no he podido lograrlo (solo logro la onda "serrucho" o algún tipo de "pwm" forzado). Por favor, podrían indicarme en qué estoy fallando. Muy agradecido.

Código: [Seleccionar]
int flag, flag1; //flag mediante software


.....
   
     
       
    while(true){

       
    if(flag ==1){   
        if(count ==256){
            flag1 =1;
           
        }else{
            ++count;
            PORTB =count;
            flag =0;
        }
    }   
     
    }   
   
void interrupt high_priority TMR2_int(void){
    if(PIR1bits.TMR2IF ==1){

     
      flag =1;
     
      if(flag1 ==1){
                if(count ==0){
                    flag =0;
         
                }else{
                    --count;
                    PORTB =count;
                    flag1 =0;
                }
            }
     
      PIR1bits.TMR2IF =0;
    }
}


Por favor, guienme.
Título: Re:Estoy intentando generar una onda triangular con interrupciones.
Publicado por: remi04 en 10 de Abril de 2020, 12:41:40
count nunca va a valer 256.

 De 255 desborda y pasa a cero. Por eso no te sale.
Título: Re:Estoy intentando generar una onda triangular con interrupciones.
Publicado por: KILLERJC en 10 de Abril de 2020, 14:04:12
Hay mas errores:

Flag siempre va a valer 1 en esta situacion:


Código: C
  1. flag =1;
  2.      
  3.       if(flag1 ==1){
  4.                 if(count ==0){
  5.                     flag =0;
  6.          
  7.                 }else{
  8.                     --count;
  9.                     PORTB =count;
  10.                     flag1 =0;
  11.                 }
  12.             }

Se lo estas asignando antes, por eso la parte del else jamas se va a ejecutar...

Y usualmente no modificas variables en el main e interrupcion al mismo tiempo.
Título: Re:Estoy intentando generar una onda triangular con interrupciones.
Publicado por: remi04 en 10 de Abril de 2020, 17:13:24
Hay mas errores:

Flag siempre va a valer 1 en esta situacion:


Código: C
  1. flag =1;
  2.      
  3.       if(flag1 ==1){
  4.                 if(count ==0){
  5.                     flag =0;
  6.          
  7.                 }else{
  8.                     --count;
  9.                     PORTB =count;
  10.                     flag1 =0;
  11.                 }
  12.             }

Se lo estas asignando antes, por eso la parte del else jamas se va a ejecutar...

Y usualmente no modificas variables en el main e interrupcion al mismo tiempo.

  La variable asignada es flag mientras que la evaluada es flag1

    En mis códigos jamás utilizo juegos de nombres y números así para que no pase eso, que hasta tu lo has leído mal  :lol:
Título: Re:Estoy intentando generar una onda triangular con interrupciones.
Publicado por: KILLERJC en 10 de Abril de 2020, 17:29:10
Si la verdad.... me parecian identicos xD un error :P
Título: Re:Estoy intentando generar una onda triangular con interrupciones.
Publicado por: Joshuegp en 10 de Abril de 2020, 19:55:43
Hay mas errores:

Flag siempre va a valer 1 en esta situacion:


Código: C
  1. flag =1;
  2.      
  3.       if(flag1 ==1){
  4.                 if(count ==0){
  5.                     flag =0;
  6.          
  7.                 }else{
  8.                     --count;
  9.                     PORTB =count;
  10.                     flag1 =0;
  11.                 }
  12.             }

Se lo estas asignando antes, por eso la parte del else jamas se va a ejecutar...

Y usualmente no modificas variables en el main e interrupcion al mismo tiempo.

Ya intenté de todo, pero sigo sin obtener la onda deseada  :(  Ya estoy apunto de tirar todo al tacho.
Título: Re:Estoy intentando generar una onda triangular con interrupciones.
Publicado por: Eduardo2 en 10 de Abril de 2020, 20:43:56

1- Eliminá el código que mostraste.

2- Creas una variable de bit , por ejemplo: up y dentro de la interrupción del timer2
Código: [Seleccionar]
    if(up){ if(++count==0xFF) up=0 ; }
    else  { if(--count==0x00) up=1 ; }
    PORTB = count ;

y listo, todo se hace dentro de la interrupción. Nada de andar incrementando en un lado y decrementando en otro.

Título: Re:Estoy intentando generar una onda triangular con interrupciones.
Publicado por: Joshuegp en 19 de Abril de 2020, 00:51:36

1- Eliminá el código que mostraste.

2- Creas una variable de bit , por ejemplo: up y dentro de la interrupción del timer2
Código: [Seleccionar]
    if(up){ if(++count==0xFF) up=0 ; }
    else  { if(--count==0x00) up=1 ; }
    PORTB = count ;

y listo, todo se hace dentro de la interrupción. Nada de andar incrementando en un lado y decrementando en otro.




Muy agradecido. Excelente.