TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado 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.
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.
-
count nunca va a valer 256.
De 255 desborda y pasa a cero. Por eso no te sale.
-
Hay mas errores:
Flag siempre va a valer 1 en esta situacion:
flag =1;
if(flag1 ==1){
if(count ==0){
flag =0;
}else{
--count;
PORTB =count;
flag1 =0;
}
}
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.
-
Hay mas errores:
Flag siempre va a valer 1 en esta situacion:
flag =1;
if(flag1 ==1){
if(count ==0){
flag =0;
}else{
--count;
PORTB =count;
flag1 =0;
}
}
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:
-
Si la verdad.... me parecian identicos xD un error :P
-
Hay mas errores:
Flag siempre va a valer 1 en esta situacion:
flag =1;
if(flag1 ==1){
if(count ==0){
flag =0;
}else{
--count;
PORTB =count;
flag1 =0;
}
}
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.
-
1- Eliminá el código que mostraste.
2- Creas una variable de bit , por ejemplo: up y dentro de la interrupción del timer2
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.
-
1- Eliminá el código que mostraste.
2- Creas una variable de bit , por ejemplo: up y dentro de la interrupción del timer2
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.