TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: kurdo22 en 27 de Septiembre de 2004, 12:50:00
-
He realizado este programa para transmitir por el puerto serie y cuando lo ejecuto tengo el problema de que una vez acabado el programa este no finaliza, sino que vuelve a comenzar. He probado a ejecutarlo sin el Watchdog y nada. ¿Que puede estar mal? En teoria una vez llegado al END no deberia seguir, pero el programa vuelve a comenzar una y otra vez
Un saludo
;***************comunicacion serie**************
;
;
;
;***********************************************
;DATOS
LIST P=18F8720
INCLUDE <P18F8720.INC>
TXDATO equ B"00000001"
;CODIGO
ORG 0x00 ;inicio en el vector de reset
goto INICIO ;va a la primera instruccion de programa
INICIO
bsf TRISG,2 ;habilitamos RX2 como entrada
bcf TRISG,1 ;habilitamos TX2 como salida
movlw D"129" ;9600 baudios
movwf SPBRG2
movlw D"00000100" ;8 bits datos, com. asincrona,
;alta velocidad (menor error)
movwf TXSTA2
bsf RCSTA2,SPEN ;habilitamos puerto serie (USART)
bsf INTCON,GIE/GIEH ;habilitamos interrupcion
bsf INTCON, PEIE/GIEL ;habilitamos interrupcion
bsf PIE3,TX2IE ;hablitamos flag TX2IF
bsf TXSTA2,TXEN ;habilitamos transmision
;************************************
;Transmito un dato
;************************************
BUCLE1
btfss PIR3,TX2IF ;esperamos registro TXTEG2 vacio (flag TX2IF)
goto BUCLE1 ;no vacio, esperamos
DATOS
movlw B"00000001"
incf TXDATO
addwf TXDATO,W
movwf TXREG2
BUCLE2
btfss TXSTA2,TRMT ;esperamos registro TSR vacio (flag TRMT)
goto BUCLE2 ;no vacio, esperamos
;goto BUCLE 1 -------------> (bucle infinito para enviar)
END
-
Bueno, no se cual puede ser el problema, pero yo haria esto:
LABEL1 NOP
GOTO LABEL1
Eso en vez del end...
salu2
-
Como tienes configurado el perro guardian?
Si lo tienes activado, una vez pasado el tiempo que le tengas asignado hará un reset del sistema y todo se volvera a ejecutar.
-
Escrito originalmente por manex_1987
LABEL1 NOP
GOTO LABEL1
Ahorrando un byte:
LABEL1 GOTO LABEL1
-
Si el programa lo has ensamblado tal como está, es decir, con las últimas instrucciones así:
BUCLE2 btfss TXSTA2,TRMT ;esperamos registro TSR vacio (flag TRMT)
goto BUCLE2 ;no vacio, esperamos
;goto BUCLE 1 -------------> (bucle infinito para enviar)
END
y no le has quitado el punto y coma a la instrucción del
"goto BUCLE1" el programa efectivamente se reinicia constantemente ya que se pierde cuando el bit TRMT es "uno" porque no le has indicado que pasa en esas circunstancias.
Cuentanos que tal te ha ido.
-
Buenas de nuevo. He probado a meterle alguna instruccion y alguna etiqueta antes del end y nada. El perro guardian lo tengo desactivado por lo que no deberia dar problemas. En la simulacion cuando llega al END se para, pero cuando pruebo el pic fisicamente el programa no termina en el END, sino que vuelve a reiniciarse.
En cuanto a
LABEL1
nop
GOTO LABEL1
esto es un bucle infinito, por lo que no me sirve, porque yo quiero que cuando llegue al END se pare. Ademas no puedo sustituir eso por END, si lo hago no me compilay da error, te exige que el END.
Muchas gracias a todos, si se les ocurre alguna otra cosa les estaria muy agradecidos. Por si sirve de ayuda el pic es un 18F8720
-
Tambien para que no se me pierda el programa al querer finalizar hice una etiqueta llamada FIN a la cual voy (goto FIN) cuando quiero acabar el programa:
FIN
nop
nop
END
dentro de la etiqueta hago una especie de stop, pero ni con esto se para el programa, vuelve a ejecutarse e insisto en que el watchdog esta desactivado
-
Bueno, si te pide END , es facil
-------
FIN
nop
nop
goto FIN
end
-------
El END está ahi, ahora, si se recurre a él o no...
Por otra parte, se me ocurre que tal vez con un SLEEP podrias solucionarlo todo, mientras no tengas interrupciones ni nada por el estilo activadas... prueba a ver...
salu2
-
Veo que tienes un error de concepto importante: "END" NO es una instrucción, sino una directiva que indica al ensamblador que termine el proceso de ensamblado. Una cosa es la ejecución del programa en la cual la directiva "END" no hace nada y otra el ensamblado del programa en la cual "END" indica el final del ensamblado.
Te recuerdo que el ensamblado es el proceso por el cual el programa diseñado en código ensamblador es traducido a código máquina (que es lo único que entiende el microcontrolador) y genera el fichero *.hex que es el que se graba en el micro.
El programa que tu has diseñado NO se va a parar porque encuentre el END, sino porque tú se lo indique en alguna parte mediante alguna INSTRUCCIÓN (no directiva), que es como te dije en mi mensaje anterior yo no veo.
Me da la impresión que tu programa sencillamente ejecuta la última instrucción que tu has puesto y como esa instrucción no le produce ningún salto, sigue ejecutando el resto de las instrucciones grabada en la memoria de programa "vacía", hasta que llega al final y vuelve otra vez al principio, por eso parece que se reinicia, cuando lo que realmente está haciendo es recorrer toda la memoria de programa y volver a iniciarse.
Hay dos formas sencillas de pararlo, suponiendo que no tiene activa las interrupciones ni el Watchdog:
- Primera forma, mediante la instrucción: “goto $”, que produce un salto a la misma posición de la memoria de programa donde se encuentre actualmente.
- Segunda forma, mediante la instrucción: “sleep” que manda el micro a bajo consumo.
Saludos y suerte.
-
si si si
lo mejor es poner un loop infinito al final como lo han indicado varios.
no has dicho como/con que estas compilando, pero asumo q con mpasm...
si miras el .lst veras que luego de terminar sigue ejecutando instrucciones en la memoria, si lo has borrado seguro ser algo asi como un 0x3FF (depende del micro) que es una instruccion ADD...
cuando llega al final de la memoria, simplemente comienza de nuevo con tu programa.
si compilas con algo en C veras q te agrega al final algo asi como un SLEEP, cosa q solo vers si miras el .LST
suerte.