Autor Tema: consulta  (Leído 7264 veces)

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

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:consulta
« Respuesta #30 en: 21 de Agosto de 2020, 04:02:06 »
bit_set(); lo que hace es poner a uno el bit indicado.

  Si lo que quieres es preguntar por el estado del bit tienes que usar:

bit_test();

Código: C
  1. while(bit_test(port_b,1));

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:consulta
« Respuesta #31 en: 21 de Agosto de 2020, 07:01:38 »
Disculpa por no tener mas tiempo. Ademas de lo que dijo remi04.


Si esto es para probar la interrupción, entonces OK. Pero JAMAS pongas un loop infinito/casi-infinito/ o dependiente de una entrada, en una interrupción.
TAMPOCO delays, escrituras a LCD, etc. Y mucho menos en una for...

Esencialmente todo lo que ocupe MUCHO tiempo, de procesarse. Ya que si algún día tenes dos interrupciones, y esta es una de ellas, la otra va a funcionar únicamente cuando salga de esta. Lo cual para una comunicacion es mucho tiempo y seguramente tengas overflow en tu modulo.

Mejor al detectar, activar un flag, y luego en el programa principal leerlo y actuar.

Obviamente se puede hacer asi como lo haces si:
- No existe otra interrupción
- O si hay dos interrupciones, la otra que tenga mas prioridad (en los PICs que lo permitan)

Desconectado kidpic

  • PIC16
  • ***
  • Mensajes: 231
Re:consulta
« Respuesta #32 en: 21 de Agosto de 2020, 20:00:42 »
Gracias por las sugerencias y atento a ellas implementé esta función la que anda perfectamente.
Como verás también estoy escribiendo y leyendo de la eeprom.
El tema de la consulta es que al terminar de cargarla al pic se ejecuta la interrupción sin que se haya llamado externamente por ningún pin del puerto B lo que hace que me aparezca un 1 en las variables de conteo. Debe haber una configuración errónea para que esto suceda.

Pasa lo mismo cuando la alimento con una fuente externa. Se ejecutan las interrupciones primero y después entra al main .

Aquí dejo las configuraciones y las funciones. Salvo ese detalle todo lo demás se realiza como dice el programa.


Me es de importancia pues esa primera acción me actualiza los conteos y yo necesito que los guarde ante una eventual corte de energía.

Aquí las funciones de interrupción que se ejecutan por primera vez sin que las llamen cuando se energiza el sistema

#int_ext
PortB_Interrupt() //Nombre de la interrupción.
{
 ext_int_edge(1,H_TO_L); //Detecta el cambio de estado de RB0 en el flanco negativo.
 for(n=1; n<=5; n++){ //El LED conectado en el puerto D1 titila 5 veces.
 output_high(PIN_D1);
 delay_ms(500);
 output_low(PIN_D1);
 delay_ms(500);
 }
}

 

 
 #int_EXT2 High // el high le da prioridad a laint. se
                //activa al pulsar rb2
void ext2_isr()

{
   tmax++;
   delay_ms(200);
   if (tmax >40)
         tmax=0;
     write_eeprom(0,tmax);
 
}

#int_EXT1          //de menor prioridad se activa con rb1
void EXT1_isr(){
   
   Tmin++;
   delay_ms(200);
   if (tmin >20)
         tmin=0;
     write_eeprom(3,tmin);
   
}

El main de la función

void main(void) //Función principal main.
{
 lcd_init();  // Initialize LCD module
   
 bit_set(tris_b,2); //el bit 2 del PtoB como entrada
 bit_set(tris_b,1); //el bit 1 del PtoB como entrada
 bit_clear(tris_d,1);// bit 1 del PtoD como salida
 bit_clear(tris_d,2);// bit 2 del PtoD como salida
 enable_interrupts(GLOBAL); //Habilitación de todas(GLOBAL) las interrupciones.
 enable_interrupts(int_EXT2);//Habilita int. por RB2con prioridad
 enable_interrupts(int_EXT1); //Habilita la interrupción externa RB1.
 enable_interrupts(int_EXT);


 

 while(TRUE){ //El LED del PIN D2 titila indefinidamente.
 output_high(PIN_D2);
 delay_ms(500);
 output_low(PIN_D2);
 delay_ms(500);

temp0=read_eeprom(0);
temp1=read_eeprom(3);
 
lcd_gotoxy(1,1);  //
printf(lcd_putc,"%u",temp0);//me indica que realmente se grabo en memoria
lcd_gotoxy(1,2);  //
printf(lcd_putc,"%u",temp1);//me indica que realmente se grabo en memoria
lcd_gotoxy(1,3);
printf(lcd_putc,"Tmax=%u", tmax);
lcd_gotoxy(1,4);  //
printf(lcd_putc,"Tmin=%u", tmin);
 } //Fin del bucle infinito.
}

Se esta armando lindo este programita. Gracias por su tiempo.

Si quieres trascender..., enseña humildemente  lo que sabes.

Desconectado kidpic

  • PIC16
  • ***
  • Mensajes: 231
Re:consulta
« Respuesta #33 en: 23 de Agosto de 2020, 00:12:39 »
Se soluciono, no empleando las interrupciones. Aún no se porqué? se dispara cuando doy energía al sistema. No debería.
Dejo el programa que sí funciona correrctamente salvo ese detalle. Solo falta la cabecera de declaraciones. Si algún interesado lo quiere se los paso. Pedirlo por aquí. ( Son los includes comunes y declaraciond de int.)
Gracias por el aporte muchachos!!! Hasta otra duda :)!!! 
Si quieres trascender..., enseña humildemente  lo que sabes.


 

anything