Autor Tema: Ayuda urgente con las Interrupciones Externas  (Leído 1772 veces)

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

Desconectado Davalos

  • PIC10
  • *
  • Mensajes: 3
Ayuda urgente con las Interrupciones Externas
« en: 24 de Mayo de 2006, 14:08:07 »
 Originalmente este codigo viene para el PIC16f877 unicamente le cambie la libreria, en el simulador del VirtualBreadboard lo hace perfectamente pero cuando utilizo otro simulador que es un poco mas confiable que se llama SourceBoost, no hace lo que en realidad deberia. Si alguien conoce alguna rutina para interrupcion semejante a esta por favor contesteme que la necesito urgentemente. De antemano muchas gracias por tomarse la molestia de leer este mensaje.

Lo que quiero hacer es que cuando el pin RB0 este en 5 volts, se despierte el microprocesador y mientras el pin RB0 este en 0 Volts, este se encuentre en modo sleep. Gracias
             
list      p=16F874a       
   #include <p16F874a.inc>               
 
BANDERA      EQU   0x32
DUERME      EQU   0x00

   ORG   .0
   GOTO   INIT
   ORG   .4
   
ManejaInterrupcion
   BTFSS   PORTB,0
   GOTO   GoToSleep   
;*********************************************************************
; When we wakeup we change the interrupt to look for a falling edge
; to put us back to sleep
;*********************************************************************
WakeUp
   
   ;======Begin INTBO Configuration
   BCF INTCON, INTF   ;Clear Interrupt flag
   BSF STATUS,RP0   ;Access bank 1
   BCF OPTION_REG,INTEDG   ;Falling Edge Detect
   BCF STATUS,RP0   ;Restore bank 0
   BSF INTCON,INTE   ;Enable the INB0 Interrupt   
   BCF   BANDERA,DUERME   
   GOTO   EndInterrupt
;*********************************************************************
; When we go to sleep we change the interrup to look for a rising edge
; to wake us up
;*********************************************************************   
GoToSleep

   ;======Begin INTBO Configuration
   BCF INTCON, INTF   ;Clear Interrupt flag
   BSF STATUS,RP0   ;Access bank 1
   BSF OPTION_REG,INTEDG   ;Rising Edge Detect
   BCF STATUS,RP0   ;Restore bank 0
   BSF INTCON,INTE   ;Enable the INB0 Interrupt
   BSF   BANDERA,DUERME
EndInterrupt
   RETFIE
   
INIT

   ;======Begin PORT Configuration
   BSF STATUS, RP0   ;PORT TRIS Registers are on page 1
   ;======PORT B
   MOVLW   .255   ;PORTB Configuration Bits
   MOVWF   TRISB
   ;======PORT C
   MOVLW   .255   ;PORTC Configuration Bits
   MOVWF   TRISC
   ;======PORT D
   MOVLW   .0   ;PORTd Configuration Bits
   MOVWF   TRISD
   BCF STATUS, RP0   ;Restore Page0
   

   ;======Begin INTBO Configuration
   BCF INTCON, INTF   ;Clear Interrupt flag
   BSF STATUS,RP0   ;Access bank 1
   BSF OPTION_REG,INTEDG   ;Rising Edge Detect
   BCF STATUS,RP0   ;Restore bank 0
   BSF INTCON,INTE   ;Enable the INB0 Interrupt
   BSF   INTCON,GIE   ;Enable the Interrupts

DURMIENDO
   SLEEP
   NOP

MAIN
   MOVF   PORTC,W
   MOVWF   PORTD
   BTFSC   BANDERA,DUERME
   GOTO   DURMIENDO
   GOTO   MAIN
 
   END
           
Este codigo lo tome de un ejemplo que viene el Sw VirtualBreadboard
descargalo en www.virtualbreadboard.com
 
 

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Ayuda urgente con las Interrupciones Externas
« Respuesta #1 en: 24 de Mayo de 2006, 21:02:17 »
Dávalos, sería importante que nos comentes

1) ¿Qué es lo que quieres hacer?
2) ¿Qué es lo que no te funciona y porqué dices que el simulador funciona mal?
3) ¿Has usado el MPLAB con el MPSIM?

Saludos

PD: el pedido de ayuda urgente solo demuestra que no has leído las normas del foro. 
PD2: Como consejo si quieres que te respondan más o menos rápido a tus dudas, tienes que tratar de explicar lo mejor posible tu problema para que alguien te pueda ayudar con precisión.

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado Davalos

  • PIC10
  • *
  • Mensajes: 3
Re: Ayuda urgente con las Interrupciones Externas
« Respuesta #2 en: 29 de Mayo de 2006, 02:26:36 »
Lo que seo hacer es que el microprocesador despierte cuando se le aplique un voltaje de 5 volts a el pin 0 de la puerta B y que si esta en 0 volts ese pin, el micro este en estado de bajo consumo de energia.
Ya he hecho lo que tu me dices y no he encontrado la solucion el simulador del SourceBoost funciona mal porque cuando se ejecuta la instruccion sleep deberia de ejecutarse la siguiente instruccion y quedarse asi hasta que sea detectado un cambio de voltaje en el pin 0 de la puerta B que es la que maneja un tipo de interrupciones externas. Ya que el SurceBoost despues de realizar la instruccion sleep continua ejecutando las lineas que se encuentran despues de la instruccion nop.
Si has utilizado el VirtualBreadboard te daras cuenta de lo que hace el programa y eso es exactamente lo que quiero que el microcontrolador haga, ademas de el programa que se encuentra en la carpeta de Ejemplos del VB, yo le inclui la instruccion clrf PORTD despues de la llamada de etiqueta DURMIENDO.
Si he utilizado el MPLAB con el MPLAB SIM y lo que hace es que cuando corro el programa, el simulador se detiene en la instruccion NOP esperando a que haya un cambio en el pin 0 y le cambio los valores a ese pin y no sale de nada. No se si lo este haciendo correctamente pero utilizo el Stimulus Controller para hacer que haya un cambio en ese pin y no sale de nada.
En cuanto a lo de las reglas de foro pido una disculpa por haber incluido en mi tema la palabra urgente pero en realidad necesito informacion, si alguno de ustedes conoce algo que me sea de utilidad le estare agradecido. Ojala que la informacion sea suficiente para que alguien que tenga voluntad de ayudar lo haga. De antemano gracias a todos por leer mi peticion.

Desconectado pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
Re: Ayuda urgente con las Interrupciones Externas
« Respuesta #3 en: 29 de Mayo de 2006, 05:10:47 »
Tengo lo que buscas, pasa que tengo que limpiarlo un poco para que lo entiendas pero de principio te explico como lo hice:

-Inicio de variables, puertos y sobre todo las interrupciones por flanco ascendente de RB0.

- Pausita

- Sleep

- Programa principal


- Pasar por un bucle dentro del programa principal para checkear una bandera de "petición apagado" que venga de las interrupciones. (RB0 = 1 entonces poner Flagapagado = 1)

- Flagapagado = 1? entonces ir a 00h (A algunos no les puede gustar esta instrucción, pero a mi me funciona perfectamente)

- Interrupciones: RB0= 1? entonces Flagapagado = 1  y volver.


Entonces: Arranca el aparato apenas darle alimentación y queda en sleep, esperando actives RB0. Al activar RB0 hace lo que tenga que hacer el programa principal , mirando a veces el estado del flag apagado. Si se pulsó RB0 (=1) entonces interrumpe, pone el flag a uno y vuelve. Al pasar por el chekeo del flag y encontrarlo en 1 entonces resetea el programa, haciendo que el micro reinicie y vaya a sleep.

Si necesitas el programa avisa y lo limpio.


PD: Por lo que leo necesitas es que duerma en RB0=0 así que cambia a flanco descendente . Eso es todo. Claro que pon las pullups de puerto B activas o pon una R de 1k de RB0 a +5v
« Última modificación: 29 de Mayo de 2006, 05:20:08 por pibe »
Mi jefe mirando el prototipo que estoy creando: "Y eso va a funcionar?"


 

anything