Autor Tema: Interrupcion por teclado para 16F877A  (Leído 3750 veces)

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

Desconectado VOLTIO

  • PIC16
  • ***
  • Mensajes: 154
Interrupcion por teclado para 16F877A
« en: 08 de Marzo de 2016, 16:01:30 »
Estimados amigos, gracias a este foro y dos personas en especial ( KILLERJC  y  Pinolillo16) pude entender y hacer funcionar un LCD con este micro.
Ahora quiero hacer que mientras el programa esta trabajando normalmente, cuando oprimo un boton deje de trabajar y entre en un menu nuevo para hacer otra cosa por ejemplo en mi caso un entrar a un menu para programar algo .
Espero se entienda lo que quiero hacer , subo diagrama y basandonos en el programa que puse como ejemplo.
Gracias
* UNO NUEVO.zip
(52.38 kB - descargado 168 veces)

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re:Interrupcion por teclado para 16F877A
« Respuesta #1 en: 08 de Marzo de 2016, 16:43:48 »
Hola, yo estructuro mis programas de esta forma
Es una especie de multitarea, el programa está pasando constantemente por todas las rutinas que requiero, si ocurre un evento entra a la rutina y luego vuelve a al programa general,
si por condición de una tecla debe presentar un mensaje en el LCD en esta se guarda un código en una variable para que cuando llegue a la rutina del LCD lo presente, tengo por tiempo
real eventos que se realizan cada 0,5 ó 1 segundo, etc.

Código: C
  1. ////////////////////////Rutina general
  2. while(true)            
  3.         {
  4.                 restart_wdt();
  5.                
  6. ///////////////////////////////////////        
  7.                 bit_clear(col1);
  8.                 delay_us(100);
  9.  
  10.                 tecla_egreso();
  11.                 tecla_lb();
  12.                 tecla_confi();
  13.                 tecla_enter();
  14. /////////
  15.                 bit_set(col1);
  16.                 bit_clear(col2);
  17.                 delay_us(100);
  18.  
  19.                 tecla_libre();
  20.                 tecla_memorias();
  21.                 tecla_cero();
  22.                 tecla_salir();
  23. /////////
  24.                 bit_set(col2);
  25.                 bit_clear(col3);
  26.                 delay_us(100);
  27.  
  28.                 tecla_encendido();
  29.                 tecla_tiempo();
  30.                 tecla_p_ini();
  31.                 tecla_decre();
  32. /////////
  33.                 bit_set(col3);
  34.                 bit_clear(col4);
  35.                 delay_us(100);
  36.  
  37.                 no_existe_tecla();
  38.                 tecla_mover();
  39.                 tecla_modificar();
  40.                 tecla_incre();
  41.                
  42.                 bit_set(col4);
  43. ///////////////////////////////////////
  44.                 delay_us(100);
  45.                
  46.                 leer_peso_total();             
  47.                
  48.                 /////////////////////////////////////////
  49.                 if(res_con_menu != con_menu)
  50.                 {
  51.                         res_con_menu = con_menu;
  52.                         tiempo_menu = 0;
  53.                         switch(con_menu)
  54.                                 {
  55.                                         case 0: pantalla_ini(); break; 
  56.                                         case 1: menu_cero(); break;
  57.                                         case 2: menu_p_inicial(); break;
  58.                                         case 3: menu_m_peso(); break;
  59.                                         case 4: menu_configurar(); break;
  60.                                         case 8: menu_ver_memorias(); break;    
  61.                                         case 9: pantalla_alarmas(); break;                                                                                                                     
  62.                                 }
  63.                 }
  64.                 /////////////////////////////////////////              
  65.                 if(ban_05seg)
  66.                 {
  67.                         ban_05seg = 0;
  68.                
  69.                         conversion();
  70.                         conver_temperatura();
  71.                         fijar_cero();
  72.                         fijar_ini();
  73.                         fijar_modificar();             
  74.                        
  75.                 /////////////////////////////////////////
  76.  
  77.                 if(ban_1seg)
  78.                 {
  79.                         ban_1seg = 0;
  80.                         decrementar_tempo();
  81.                         salir_menu();
  82.                         comparar_hora();
  83.                         if(con_menu == 0)
  84.                         {
  85.                                 apagar_backligth();
  86.                                 ver_temperatura();
  87.                                 ver_hora(0xce);
  88.                                 if(!bit_test(ban_tempo)) {ver_fecha(0xa0);}                            
  89.                         }      
  90.                 }
  91.         }
  92. }

Saludos

Desconectado VOLTIO

  • PIC16
  • ***
  • Mensajes: 154
Re:Interrupcion por teclado para 16F877A
« Respuesta #2 en: 08 de Marzo de 2016, 17:08:00 »
Hola Diego pero tiene que ser en asm , sino estoy al horno ,jajajajaaj
gracias

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re:Interrupcion por teclado para 16F877A
« Respuesta #3 en: 08 de Marzo de 2016, 17:44:00 »
Pero el principio es el mismo, yo lo hacía antes en ASM, obviamente es más dispendioso, pero lo importante es el concepto de "multitarea"

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Interrupcion por teclado para 16F877A
« Respuesta #4 en: 08 de Marzo de 2016, 20:10:59 »
Creo que antes de meternos con el programa que tenes VOLTIO, deberias crear un programa muy simple, es decir solo la interrupcion + loop principal ( tambien simple ), para entender el funcionamiento. Despues procedes a tratar de incorporarlo a tu programa.

En tu loop principal, encender y apagar un led, con una velocidad de 500ms encendido y 500ms apagado.
Tu interrupcion tiene que detener/poner en marcha lo del loop principal.

Trata de hacer eso.
« Última modificación: 09 de Marzo de 2016, 00:38:36 por KILLERJC »

Desconectado VOLTIO

  • PIC16
  • ***
  • Mensajes: 154
Re:Interrupcion por teclado para 16F877A
« Respuesta #5 en: 09 de Marzo de 2016, 13:40:32 »
Yo hice esto en mi programa , es bastante sencillo cuando arranca muestra un msj , cuando se oprime la tecla SW1 muestra en pantalla el msj ENTRANDO AL MENU, para luego seguir

; Subrutina "ServicioInterrupcion" -----------------------------------------------------
;
;
; Subrutina de servicio a la interrupción. Una vez apretado Menu muestra en pantalla ENTRADA A MENU
;
ServicioInterrupcion
call Retardo_20ms          ; Espera a que se estabilice el nivel de tensión.
btfss SW1                ; Comprueba si es un rebote.
goto FinInterrupcion      ; Era un rebote y por tanto sale.
CALL   MENSAJE_MENU      ; voy a ver el msj MENU
FinInterrupcion
bcf INTCON,INTF            ; Limpia flag de reconocimiento (INTF).
retfie                   ; Retorna y rehabilita las interrupciones (GIE=1).
* Ejmplo LCD 4 bit 877.asm
(11.27 kB - descargado 165 veces)

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Interrupcion por teclado para 16F877A
« Respuesta #6 en: 09 de Marzo de 2016, 18:06:26 »
Lo repito por que estas muy lejos de lo que es una interrupcion, y de comprender aunque sea lo basico:

Creo que antes de meternos con el programa que tenes VOLTIO, deberias crear un programa muy simple, es decir solo la interrupcion + loop principal ( tambien simple ), para entender el funcionamiento. Despues procedes a tratar de incorporarlo a tu programa.

En tu loop principal, encender y apagar un led, con una velocidad de 500ms encendido y 500ms apagado.
Tu interrupcion tiene que detener/poner en marcha lo del loop principal.

Trata de hacer eso.

Desconectado VOLTIO

  • PIC16
  • ***
  • Mensajes: 154
Re:Interrupcion por teclado para 16F877A
« Respuesta #7 en: 10 de Marzo de 2016, 13:42:36 »
Crees que me podran ayudar con ejemplos sobre proteus para entenderlo ?? tal como hicimos con lo anterior ?'


gracias

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Interrupcion por teclado para 16F877A
« Respuesta #8 en: 10 de Marzo de 2016, 14:16:40 »
Pero esta ves no te voy a dar el codigo. Lo vas a tener que hacer vos.


Código: ASM
  1. ; Vectores de interrupcion
  2.  
  3. Setup:
  4.  
  5.         ;Configuracion de los modulos
  6.  
  7. Main:
  8.         ;Encendido y apagado del led
  9.  
  10.         GOTO    Main
  11.  
  12.  
  13. Interrupcion:
  14.         ;Guardo contexto ( STATUS, W , PCLATH )
  15.         ;Pregunto si el flag esta activo y actuo en consecuencia
  16.  
  17.         ;Devuelvo el contexto ( STATUS, W , PCLATH )
  18.         RETFIE

Desconectado VOLTIO

  • PIC16
  • ***
  • Mensajes: 154
Re:Interrupcion por teclado para 16F877A
« Respuesta #9 en: 10 de Marzo de 2016, 16:18:24 »
Mientras vos me subias la sugerencia yo empece con unas hojas que baje de la web a hacer algo, anda pero no me apaga el led , lo estoy entendiendo bastante mejor pero no se porque no se apaga el led cuando oprimo MENU .

ahi va lo que hice
* LCD INTERRUPCIONES 16F877A.zip
(72.29 kB - descargado 167 veces)

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Interrupcion por teclado para 16F877A
« Respuesta #10 en: 10 de Marzo de 2016, 17:43:35 »
Por si no quedo claro, te lo voy a repetir VOLTIO, al menos yo no voy a aplicarlo en el codigo que ya tenes realizado.
Si queres una ayuda de como entender lo que es una interrupcion entonces deberias crear y comenzar con un ejemplo muy sencillo.

Y es eso lo que te estoy pidiendo que realices. No por capricho mio, sino por que es la unica forma de realmente aprender y ver que lo que falla sea de eso y no por alguna "interaccion" con el programa que tenias antes.

Desconectado VOLTIO

  • PIC16
  • ***
  • Mensajes: 154
Re:Interrupcion por teclado para 16F877A
« Respuesta #11 en: 10 de Marzo de 2016, 18:16:00 »
lo deje lo mas sencillo posible, entonces le saco el lcd tambien ?? solo dejo el led y el pulsador ?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Interrupcion por teclado para 16F877A
« Respuesta #12 en: 10 de Marzo de 2016, 18:19:08 »
Comenza un ejemplo nuevo, un programa totalmente nuevo para solo la interrupcion. Luego cuando entiendas realmente lo que hace la interrupcion vas al programa con el LCD y lo agregas.

Desconectado VOLTIO

  • PIC16
  • ***
  • Mensajes: 154
Re:Interrupcion por teclado para 16F877A
« Respuesta #13 en: 10 de Marzo de 2016, 22:20:50 »
Como decia el CHAVO DEL 8  "bueno pero no te enojes" jajajaja aca hice hasta donde me da mi coco , pero no apago el led con el boton que esa es la meta con la interrupcion.
Pero noto en proteus que al oprimir el boton se ponen algunas lineas en amarillo no se que es

Desconectado VOLTIO

  • PIC16
  • ***
  • Mensajes: 154
Re:Interrupcion por teclado para 16F877A
« Respuesta #14 en: 11 de Marzo de 2016, 15:49:43 »
este es el diagrama

* diagrama.pdf
(12.36 kB - descargado 171 veces)