Autor Tema: ECHEN UN VISTAZO A ESTE PROGRAMA  (Leído 2207 veces)

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

Desconectado kurdo22

  • PIC10
  • *
  • Mensajes: 48
ECHEN UN VISTAZO A ESTE PROGRAMA
« 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

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
RE: ECHEN UN VISTAZO A ESTE PROGRAMA
« Respuesta #1 en: 27 de Septiembre de 2004, 13:32:00 »
Bueno, no se cual puede ser el problema, pero yo haria esto:

LABEL1  NOP
             GOTO   LABEL1

Eso en vez del end...

salu2

Desconectado MarquesSalsero

  • PIC18
  • ****
  • Mensajes: 467
RE: ECHEN UN VISTAZO A ESTE PROGRAMA
« Respuesta #2 en: 27 de Septiembre de 2004, 14:04:00 »
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.
Hay 10 tipos de personas las que entienden binario y las que no

Desconectado josemyzm

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 309
RE: ECHEN UN VISTAZO A ESTE PROGRAMA
« Respuesta #3 en: 27 de Septiembre de 2004, 15:40:00 »
Escrito originalmente por manex_1987


LABEL1  NOP
             GOTO   LABEL1



Ahorrando un byte:

LABEL1  GOTO  LABEL1
Saludos desde Logroño (España)

Desconectado adrian2a1

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 75
RE: ECHEN UN VISTAZO A ESTE PROGRAMA
« Respuesta #4 en: 27 de Septiembre de 2004, 16:12:00 »
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.

Desconectado kurdo22

  • PIC10
  • *
  • Mensajes: 48
RE: ECHEN UN VISTAZO A ESTE PROGRAMA
« Respuesta #5 en: 02 de Octubre de 2004, 12:52:00 »

    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

Desconectado kurdo22

  • PIC10
  • *
  • Mensajes: 48
RE: ECHEN UN VISTAZO A ESTE PROGRAMA
« Respuesta #6 en: 02 de Octubre de 2004, 12:57:00 »

   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

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
RE: ECHEN UN VISTAZO A ESTE PROGRAMA
« Respuesta #7 en: 02 de Octubre de 2004, 13:10:00 »
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

Desconectado adrian2a1

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 75
RE: ECHEN UN VISTAZO A ESTE PROGRAMA
« Respuesta #8 en: 03 de Octubre de 2004, 00:59:00 »
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.

Desconectado wqtrp

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 170
RE: ECHEN UN VISTAZO A ESTE PROGRAMA
« Respuesta #9 en: 03 de Octubre de 2004, 06:01:00 »
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.