Autor Tema: LCD e interrupciones  (Leído 517 veces)

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

Desconectado juanjo_electronica

  • PIC10
  • *
  • Mensajes: 2
LCD e interrupciones
« en: 02 de Enero de 2024, 07:44:39 »
Hola a todos, estoy realizando un contador, con PIC16F877A, y las interrupciones por cambio de estado en los pines RB6 (Cuenta ascendente) y RB7(cuenta descendente). El caso es que no consigo que me muestre el valor actualizado del contador en el LCD. Se me queda en 0 todo el rato. Depurando el código veo que entra en la rutina de interrupción y sale de esta sin problema, no se a que puede deberse. La libreria del LCD que estoy utilizando es LCDD.C para la placa de desarrollo UNIDS-6.Está casi todo comentado porque he probado simplemente a imprimir un mensaje en la interrupción pero tampoco me lo muestra.

Código: [Seleccionar]
#include <16f877a.h>
#fuses HS, NOWDT
#use delay(clock=8000000)
#include <LCD_digi2_unids6.c>
#USE FAST_IO(B)
long contador;
long pulsaciones;
#int_rb
void interrupt_irs(void){

//delay_ms(50);
printf(lcd_putc, "INTERRUPCIÓN");
//delay_ms(500);
/*
if(input(PIN_B6)==0){
  contador=contador+1;
pulsaciones=pulsaciones+1;
}
if(input(PIN_B7)==0){
contador=contador-1;
pulsaciones=pulsaciones+1;
}
if(contador==100) contador=0;
if(contador==-1) contador=99;
if(pulsaciones==1000) pulsaciones=0;
*/
}
void main(){
lcd_init();
delay_ms(100);
contador=0;
pulsaciones=0;
port_b_pullups(true);
lcd_gotoxy(1,1);
printf(lcd_putc, "Cuenta = %lu", contador);
delay_ms(250);
lcd_gotoxy(1,2);
printf(lcd_putc, "Pulsaciones = %lu", pulsaciones);
delay_ms(250);
set_tris_B(0xFF);
clear_interrupt(int_rb);
enable_interrupts(int_rb);
enable_interrupts(global);
while(true){
sleep();
/*delay_cycles(1);
lcd_putc("\f");
delay_ms(500);
lcd_gotoxy(1,1);
delay_ms(500);
printf(lcd_putc, "Cuenta = %lu", contador);
delay_ms(500);
lcd_gotoxy(1,2);
delay_ms(500);
printf(lcd_putc, "Pulsaciones = %lu", pulsaciones);
delay_ms(500);*/
}
}

Gracias de antemano y un saludo.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:LCD e interrupciones
« Respuesta #1 en: 02 de Enero de 2024, 09:44:12 »
¿Lo has intentado sin la instrucción sleep en el lazo principal?
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:LCD e interrupciones
« Respuesta #2 en: 02 de Enero de 2024, 13:52:45 »
Hola a todos, estoy realizando un contador, con PIC16F877A, y las interrupciones por cambio de estado en los pines RB6 (Cuenta ascendente) y RB7(cuenta descendente). El caso es que no consigo que me muestre el valor actualizado del contador en el LCD. Se me queda en 0 todo el rato.
En la interrupción por cambio de estado se deben leer los 4 pines del portb para limpiar el estado.
Lo normal es leer el puerto al principio y analizar esos valores.
Citar
   int8 portb = input_b() ;
   if(portb&(1<<6)==0){
       contador=contador+1;
      pulsaciones=pulsaciones+1;
   }
   if(portb&(1<<7)==0){
      contador=contador-1;
      pulsaciones=pulsaciones+1;
   }
   if(contador==100) contador=0;
   if(contador==-1) contador=99;
   if(pulsaciones==1000) pulsaciones=0;

También tenés que hacer una lectura al inicio porque se te podría disparar una interrupción al habilitarla.

Además estás dejando RB4,RB5 libres y configurados como entrada --> Regalados para el ruido.

Desconectado miguelsaldo

  • PIC10
  • *
  • Mensajes: 4
Re:LCD e interrupciones
« Respuesta #3 en: 04 de Febrero de 2024, 07:25:05 »
¡Qué buena ayuda! :-/


 

anything