Autor Tema: Interrupciones RB/INT  (Leído 1258 veces)

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

Desconectado D1to

  • PIC10
  • *
  • Mensajes: 39
Interrupciones RB/INT
« en: 16 de Enero de 2017, 01:40:21 »
Hola estoy trabajando en un pequeño proyecto de ciclo, el cual requiere de interrupciones, pero tengo problemas al trabajar con estas, tanto q me he visto obligado ha hacer pruebas creando un nuevo proyecto básico apagando un led encendido, pero aun así no funciona no se a q se deba, por favor  estaría muy agradecido  si pudiera contar con la ayuda de alguien. adicionalmente obtengo otro error al usar una resistencia y un botón  como entrada, adjunto foto. tengo que configurar algo cuando creo el proyecto o me falta definir algo?
lo hice basándome en este vídeo y en el funciona por que en el mio no? por cierto mi pic es 16F877A y uso MicroC Pro
void interrupt (){
 INTCON.GIE = 0 ;
 portb.f7 = 0 ;
 portb.f5 = 1 ;
 delay_ms(3000);
 INTCON.GIE = 1 ;
 INTCON.INTF = 0;
}
void main() {
INTCON.GIE = 1 ;
INTCON.INTE = 1 ;
option_reg = 0x40 ;

portb = 0b00000001 ;
trisb= 0 ;

      while(1){
        portb.f7 = 1 ;
      }
}

* circuito proteus.png
(43.64 kB, 2538x649 - visto 380 veces)

* error de pulsador.png
(76.32 kB, 2538x649 - visto 351 veces)
« Última modificación: 16 de Enero de 2017, 01:45:09 por D1to »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Interrupciones RB/INT
« Respuesta #1 en: 16 de Enero de 2017, 01:59:46 »
Empezemos por algunas cosas para que te queden claras.

- En C al entrar a una interrupcion, en la flia PIC16, el GIE se pone a 0 solo, de esa forma mientras esta en la interrupcion deshabilita cualquier otra.
- Al salir de la interrupcion habilita el GIE por si solo, no es necesario hacerlo.
- NUNCA pero NUNCA pongas rutinas que demoren demasiado en las interrupciones, tal como los delays y algunas funciones como LCD, envios de toda una string completa, etc. La idea de una interrupcion es atender y salir rapidamente, si necesitas que tarde demasiado lo pones en while(1) del main.
- El TRISx ( trisA, trisB, etc ) es el registro que se encarga de la direccion de los puertos, si tiene un 1 es entrada, si tiene un 0 es salida. Tu TRISB le asignas un 0, lo cual desde RB0 a RB7 serian todas salidas y no es lo correcto.
- El registro PORTx es el valor del registro, si tenes una entrada definida en TRISx podes leer el valor del mismo, si tenes una salida, escribiendo a ese registro cambias la salida, o lo podes hacer bit a bit como haces el portb.b7

Observando todos esos errores y para que entiendas un poco mas la interrupcion, aca tendrias un codigo, si observas mientras no toques nada el codigo ejecutaria lo del while del main, apenas presionas el boton ejecuta lo de interrupt y al salir continua lo del while del main desde donde habia dejado al entrar en la interrupcion.
Tambien agregue un borrado del flag ANTES de activar la interrupcion.

Código: C
  1. void interrupt(void)
  2. {
  3.         portb.f5 ^= 1 ;
  4.         INTCON.INTF = 0;
  5. }
  6.  
  7. void main(void)
  8. {
  9.         option_reg = 0x40 ;
  10.  
  11.         portb = 0b00000001;
  12.         trisb = 0b00000001;
  13.  
  14.         INTCON.INTF = 0;
  15.         INTCON.INTE = 1 ;
  16.         INTCON.GIE = 1 ;
  17.  
  18.         while(1)
  19.         {
  20.                 portb.f7 ^= 1;
  21.                 delay_ms(500);
  22.         }
  23. }

Respecto al diagrama, a pesar que el Proteus lo permita, a los leds les falta unas resistencias. Y me refiero al ultimo diagrama que pasaste.

El error de pulsador te lo da, porque como decia tenias puesto a RB0 como salida, al poner TRISB a 0 por completo ( en el reset o power-up estan como entradas todas y analogicas si es que poseen ), entonces tenes 5V en ese pin, si observas tu segundo diagrama, mientras no presionas el boton tenes 5V o un 1, por eso el rojo. Esto no es problema si esta asi, el problema viene si pones un 0 en la salida de RB0, ya que al presionar el boton esta ves estarias produciendo un cortocircuito, es decir un camino directo de los 5V (de un lado del boton) y GND (gracias al pin RB0 como salida).

Espero que esto te solucione todas tus dudas. Y a pesar que lo diga, y puede que no le prestes atencion, trata de entender el programa, el por que de los cambios que hice y no simplemente copiarlo y pegarlo.

Desconectado D1to

  • PIC10
  • *
  • Mensajes: 39
Re:Interrupciones RB/INT
« Respuesta #2 en: 16 de Enero de 2017, 09:01:38 »
 :D :D :D Muchas gracias, tenias razón, no me di cuenta que configure mal el puerto, lo hice al revés, lo modifiqué y funcionó, ahora ya puedo trabajar en mi programa principal.   :-/  :-/  :-/


 

anything