Autor Tema: pic contador con interrupcion  (Leído 3385 veces)

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

Desconectado kotito

  • PIC10
  • *
  • Mensajes: 29
pic contador con interrupcion
« en: 25 de Julio de 2018, 12:44:56 »
Hola!

Necesitaría un poco de ayudar para solucionar un código que tengo hecho para el pic18f2550. Lo que quiero hacer no es más que un contador que cuando se pulse un boton, sume uno al contador por interrupcion externa de la patilla RB0.

Al intentarlo, no me sale señales de salida por las patillas del puerto b (RB4,RB5,RB6,RB7) que son las que están destinados a darle números al display, mientras que el puerto A se encarga de encender cada display

Código: [Seleccionar]
#include <18f2550.h>            //pic a utilizar         
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP      //ordenes para el programador
#use delay (clock=4000000)         //Fosc=4Mhz
#use standard_io(a)
#use standard_io(b)
#use fixed_io(a_outputs=PIN_A0,PIN_A1,PIN_A2,PIN_A3)
#use fixed_io(b_outputs=PIN_B4,PIN_B5,PIN_B6,PIN_B7)

///VARIABLES GLOBALES
int a=0,b=0,c=0,d=0; //variable para almacenar los numeros que deben tener cada display
int tabBCD[10]={0b0000,0b0001,0b0010,0b0011,0b0100,0b0101,0b0110,0b0111,0b1000,0b1001};//BCD 0-9 en binario
int tabTrans[4]={0b0000,0b0001,0b0010,0b0011}; //BCD para encender los displays
 

///LLAMADA FUNCION INTERRUPCION
#INT_EXT
EXT_isr()
{
   a++;               //incremento contador indice tabBCD
   if(a>2){               //¿se ha superado el limite de 9?
      a=0;            //SI -> restaura valor indice(para mostrar digito 0)
  b++;
}else if(b>2){ //y pregunta por los demas display
b=0;
c++;
}else if(c>2){
c=0;
d++;
}else if(d>2){
d=0;
}
}
     

//--CONFIGURACIÓN--\\
void main(void)
{
   enable_interrupts(int_ext);      //activar interrupcion externa
   ext_int_edge(L_TO_H);         //configuracion:interrupcion cuando señal esta en alta
   enable_interrupts(GLOBAL);      //todas las interrupciones desactivadas

   
   set_tris_b(0x0F);                     //portb como salida los ultimos 4 bits, 00001111
   set_tris_a(0x00);                     //porta como salida


//--PROGRAMA PRINCIPAL--\\

 
   do{                        //bucle...
      output_a(tabTrans[0]);   
      output_b(tabBCD[a]);      //...1º 7seg
      delay_ms(10);
      output_a(tabTrans[1]);     
      output_b(tabBCD[b]);      //...2º 7seg
      delay_ms(10);
      output_a(tabTrans[2]);     
      output_b(tabBCD[c]);      //...3º 7seg
      delay_ms(10);
      output_a(tabTrans[3]);         //activado...
      output_b(tabBCD[d]);      //...4º 7seg
      delay_ms(10);           
      }while(TRUE);            //bucle infinito esperando interrupcion
}



Agradezco todo posible ayuda =S

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:pic contador con interrupcion
« Respuesta #1 en: 25 de Julio de 2018, 13:29:20 »
Por un lado nunca llama a la interrupción -->  Tenés que habilitar en este orden.

Código: [Seleccionar]
//--CONFIGURACIÓN--\\
void main(void)
{
   set_tris_b(0x0F);                      //portb como salida los ultimos 4 bits, 00001111
   set_tris_a(0x00);                      //porta como salida

   enable_interrupts(int_ext);       //activar interrupcion externa
   ext_int_edge(L_TO_H);             //configuracion:interrupcion cuando señal esta en alta
   enable_interrupts(GLOBAL);      //todas las interrupciones desactivadas


Está mal la tabla TabBCD , porque al número lo estás sacando por B4...B7

Debió ser 
Código: [Seleccionar]
int tabBCD[10]={0x0,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90};
tabTrans es absolutamente redundante (devuelve lo mismo)

Escribí directamente:
Código: [Seleccionar]
   do{                        //bucle...
      output_a(0);
      output_b(tabBCD[a]);      //...1º 7seg
      delay_ms(10);
      output_a(1);
      output_b(tabBCD[b]);      //...2º 7seg
      delay_ms(10);
      output_a(2);
      output_b(tabBCD[c]);      //...3º 7seg
      delay_ms(10);
      output_a(3);         //activado...
      output_b(tabBCD[d]);      //...4º 7seg
      delay_ms(10);
      }while(TRUE);            //bucle infinito esperando interrupcion


Desconectado kotito

  • PIC10
  • *
  • Mensajes: 29
Re:pic contador con interrupcion
« Respuesta #2 en: 25 de Julio de 2018, 17:40:49 »
Eduardo! muchisimas gracias por tu ayuda, de las 3 sugerencias, el programa me va =) y te lo agradezco.

Aunque dejame decirte:
- la interrupcion si es llamada, se hace añadiendo estas lineas
Código: [Seleccionar]
   enable_interrupts(int_ext);      //activar interrupcion externa
   ext_int_edge(L_TO_H);         //configuracion:interrupcion cuando señal esta en alta
   enable_interrupts(GLOBAL);      //todas las interrupciones desactivadas

lo que me ha solucionado el problema es cambiar la linea de esto:
int tabBCD[10]={0b0000,0b0001,0b0010,0b0011,0b0100,0b0101,0b0110,0b0111,0b1000,0b1001};//BCD 0-9 en binario
a esto otro:
int tabBCD[10]={0x0,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90};//BCD 0-9 en hex
lo que no entiendo es porqé funciona en hexadecimal y no en binario

-y con respecto al do while. no hacia falta ningun cambio



una ultima duda mas, si lo saben:
¿Qué hacen estas líneas?
Código: [Seleccionar]
#use standard_io(a)
#use standard_io(b)
#use fixed_io(a_outputs=PIN_A0,PIN_A1,PIN_A2,PIN_A3)
#use fixed_io(b_outputs=PIN_B4,PIN_B5,PIN_B6,PIN_B7)
« Última modificación: 25 de Julio de 2018, 17:45:39 por kotito »

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:pic contador con interrupcion
« Respuesta #3 en: 25 de Julio de 2018, 18:23:24 »
que me ha solucionado el problema es cambiar la linea de esto:
int tabBCD[10]={0b0000,0b0001,0b0010,0b0011,0b0100,0b0101,0b0110,0b0111,0b1000,0b1001};//BCD 0-9 en binario
a esto otro:
int tabBCD[10]={0x0,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90};//BCD 0-9 en hex
lo que no entiendo es porqé funciona en hexadecimal y no en binario
Porque lo que escribiste en binario solo modifica B0...B3

Si te gusta en binario , para que funcione tenés que escribir: 

int tabBCD[10]={0b0000,0b00010000,0b00100000,0b00110000,0b01000000,0b01010000,0b01100000,0b01110000,0b10000000,0b10010000}

Citar
-y con respecto al do while. no hacia falta ningun cambio

Te dije que esa tabla era redundante. Devuelve el mismo número con que es llamada.

Citar
una ultima duda mas, si lo saben:
¿Qué hacen estas líneas?
Código: [Seleccionar]
#use standard_io(a)
#use standard_io(b)
#use fixed_io(a_outputs=PIN_A0,PIN_A1,PIN_A2,PIN_A3)
#use fixed_io(b_outputs=PIN_B4,PIN_B5,PIN_B6,PIN_B7)

Eso está bien detallado en el help de CCS.  Just RTFM  ;-)

Citar
#USE STANDARD_IO(port) - This compiler will use this directive be default and it will automatically inserts code for the direction register whenever an I/O function like output_high() or input() is used.

#USE FAST_IO(port) - This directive will configure the I/O port to use the fast method of performing I/O. The user will be responsible for setting the port direction register using the set_tris_x() function.

#USE FIXED_IO (port_outputs=;in,pin?) - This directive set particular pins to be used an input or output, and the compiler will perform this setup every time this pin is used.

Desconectado kotito

  • PIC10
  • *
  • Mensajes: 29
Re:pic contador con interrupcion
« Respuesta #4 en: 25 de Julio de 2018, 18:46:26 »
-aaah vale. Pensé que con ponerlo en 4bits era suficiente y daba por hecho de que saldria por las patillas rb4-rb7

-con respecto al help lo tengo en pdf, pero por mas que releeo el de standard_io, no me soluciona nada. Hago pruebas de pnerlo y quitarlo en mi codigo y no hay mucho cambio


 

anything