TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: picNIC en 22 de Junio de 2007, 00:51:09
-
Hola… hace varias semanas que estoy leyendo este excelente foro, por eso, primero y principal debo felicitar a todo por el lugar que han generaron…
Mi pedido de ayuda se refiere a que estoy programando un pic16f877A y ya llene los 96 bytes del registro general del bank 0, así que necesito usar el de los demás banco. Pero cuando los trato de usar cualquier registro de cualquiera de los restantes bancos en modo directo, siempre se modifica la misma el registro correspondiente a la dirección ubicada en el banco 0.
En que me estoy equivocando tan feo que no lo logro ver…….?????
…
…
…
A1_A CALL ESCRIT
CALL BANK0
BCF PORTD,2
BSF PORTD,2
DECFSZ CONTLE,F
GOTO A1_A
MOVLW H'FF'
MOVWF CONTLE
…
…
…
con solo modificar esta parte, pasando el registro contle al bank1 o 2 o 3 surge el error… :? :? :?
…
…
…
A1_A CALL ESCRIT
CALL BANK0
BCF PORTD,2
BSF PORTD,2
BSF STATUS,RP0
BCF STATUS,RP1
DECFSZ CONTLE,F
GOTO A1_A
MOVLW H'FF'
MOVWF CONTLE
BCF STATUS,RP0
BCF STATUS,RP1
…
…
…
-
hola, mm que extraño pues deberia funcionar como lo has puesto, acabo de probar tu codigo y si funciona, podrias pegar todo tu codigo, derepente la falla esta por otro lado. :-/
-
Gracias por responder... el código hasta ahora lleva 1300 líneas un poco mucho para poner... no??
Lo raro que funciona bien hasta que modifico eso...
con el sim funciona bien pero cuando lo pruebo en el circuito empieza los errores, el registro CONTLE lo uso solo ahí, pero interactúa con el registro del bank0 de la misma posición….
Pensando que el error se podía dar al revés, o sea que por algún error cuando uso el registro del bank0 lo guarde en otro banco, le agregue a un salto de banco antes de usarlo.
Pero sigue haciendo lo mismo… :shock: :shock:
-
Hola. Ante que nada me disculpo si lo que voy a decir es una tontería y poco profecional (de echo creo que lo es).
Cuando a mi me pasa lo mismo que funciona en el sim pero al ejecutarlo en la vida real (por llamarlo así) no funciona, coloco varias interrupciones en lugares estratégicos para saber hasta donde llega el CP o PC, normalmente, le hago encender led en forma binaria y anotando en un papel que interrupción corresponde a cada balor binario y tengo que confirmar por medio de una tecla para que el CP pueda seguir avanzando. Debo aclarar que esto lo hago cuando no se que hacer y no puedo encontrar la solución en la simulación, y no siempre se puede hacer debido al circuito o hardware.
Lo que te recomiendo es que cheques el ruido, porque a mi me paso que era una gran casualidad. Este último suena tonto con lo que acabas de decir: cuando lo modificas y deja de funcionar. En fin
Como consejo más profecional debes chequear que el registro CONTLE no este creando un conflicto con otras intrucciones, ya que no debe ser casualidad este fallo (obvio)
Esta respuesta son sobre dudas ya que estoy tratando un problema a ciegas.
Saludos :-/ :-/
-
Gracias leon pic por tu tiempo y tu idea :)
voy a probar modificando el programa y poner interrupciones con semaforos a ver si lo logro encontrar...
Ya me estan saliendo canas verdes con este programa.... que hasta parece que tengo una peluca... :D :D
Salu2
-
POR FIN LO ARREGLE!!!!… 24hs para salucionario... :-/ :-/ :-/ :-/
El tema era así…
Como estoy trabajando con el 16F877A tiene cuatro bancos de memoria, y si se trabaja con interrupciones no sirve el solo hecho de guardar primero el registro W y el STAUTS…
….
….
INTERRUPCION MOVWF REG_W
SWAPF STATUS,W
MOVWF REG_status
BCF STATUS,RP0 ;VOY AL BANCO 0
BCF STATUS,RP1
::::::::::
::::::::::
SALIDA SWAPF REG_status,W
MOVWF STATUS
SWAPF REG_W,F
SWAPF REG_W,W
RETFIE
… no sirve porque no se sabe de qué banco se viene.
Sabiendo esto de antemano había hecho lo siguiente,,,,,
INTERRUPCION MOVWF REG_W
SWAPF STATUS,W
MOVWF REG_status
MOVF STATUS,W
MOVWF REG_status2
BCF STATUS,RP0 ;VOY AL BANCO 0
BCF STATUS,RP1
::::::::::
::::::::::
SALIDA MOVF REG_status2,F
MOVWF STATUS
SWAPF REG_status,W
MOVWF STATUS
SWAPF REG_W,F
SWAPF REG_W,W
RETFIE
Si bien funcionaba esta mal porque la copia del registro status no se en donde la estoy guardando y si se va a una interrupción desde un banco que no sea 0 se van a cambiar los registros en la interrupción.
Entonces porque mi programa funcionaba si se accedía a la interrupción por medio de tmr1
Y tenía continuos saltos a los de mas bancos y dejaba de funcionar bien cuando le agregaba parte mencionada antes ….?????????
AUTORESPUESTA: por el simple hecho de que la parte agregada esta en la parte principal del programa y hay mas posibilidades de que se produzca un llamado de interrupción en ese momento que se encuentra en el banco 0….
INTERRUPCION MOVWF REG_W
SWAPF STATUS,W
MOVWF REG_status
MOVF STATUS,W
BCF STATUS,RP0 ;VOY AL BANCO 0
BCF STATUS,RP1
MOVWF REG_status2
::::::::::
::::::::::
SALIDA MOVF REG_status2,F
MOVWF STATUS ;voy al banco donde guarde los registro.......
SWAPF REG_status,W
MOVWF STATUS
SWAPF REG_W,F
SWAPF REG_W,W
RETFIE
Para finalizar los registros REG_W, REG_status y REG_status2, deben tener la misma dirreccion para los 4 bancossss o sea dejar espacios en blanco reservados.... :-/ :-/ :-/