TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Davalos 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
-
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.
-
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.
-
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