Autor Tema: problema con subrrutinas  (Leído 1704 veces)

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

Desconectado kurdo22

  • PIC10
  • *
  • Mensajes: 48
problema con subrrutinas
« en: 07 de Octubre de 2004, 18:46:00 »


    Muy buenas, tengo un problema con las subrrutinas. He hecho un programa sin subrrutinas y funciona, pero cuando lo he querido hacer con ellas no funciona. Necesito las subrrutinas para no tener que repetir lineas de codigo inutilmente, y acudir a ellas cuando las necesite. Este es un programa de prueba pero si no lo consigo con algo sencillo no puedo pasar a algo mas complicado. Os adjuto el codigo y aver si podeis echarme una mano.

    Lo he simulado en MPLAB y no me da ningun problema, es mas hace paso a paso lo que quiero. ¿Puede ser por algun bit de configuracion?

    Tambien he probado a poner las subrrutinas al final (antes del END porsupuesto) y nada

     Este programa sin subrrutinas, es decir, escribiendo en vez de call las lineas de codigo correspondiente funciona perfectamente, lo he probado, pero cuando metes los call no hace nada.

SALUDOS

;****************comunicacion serie
;
;                          RECEPCION/TRANSMISION
;
; Descripcion: espero a recibir un dato, lo guardo, lo incremento y lo
;              reenvio con una temporizacion de 2 segundos.
;
;****************************************************

;DATOS

     LIST P=18F8720
     INCLUDE <P18F8720.INC>

TXDATO    equ   0x17
RXDATO    equ   0x16
CONT_100  equ   0x15
      
      
;CODIGO

   ORG 0x00                    ;inicio en el vector de reset
   
   goto INICIO                 ;va a la primera instruccion de programa

;****************************************************
;    RUTINA TEMPORIZACION
;****************************************************
         
TEMPORIZACION

        movlw D"200"                 ;2 segundos
        movwf CONT_100
           
        bcf T0CON,T0CS               ;timer0 como temporizador
        bcf T0CON,T08BIT             ;temporizador de 16 bits
        bcf T0CON,T0SE               ;flanco de subida
        bsf T0CON,PSA                ;desavilitamos preescalado

BUCLE_TEMP_1        
       
        clrf INTCON                  ;limpio flag e interrupciones
       
        movlw H"00"                  ;precarga parte alta   "IMPORTANTE EL ORDEN DE H Y L" (FF)
        movwf TMR0H
       
        movlw H"AF"                  ;precarga parte baja
        movwf TMR0L
       
        bsf T0CON,TMR0ON             ;habilitamos temporizacion
       
BUCLE_TEMP_2

        btfss INTCON,TMR0IF          ;esperamos desvordamiento de 10ms (flag TMR0IF=1)
        goto BUCLE_TEMP_2      
                 
        decfsz CONT_100,1
        goto BUCLE_TEMP_1
        clrf INTCON                  ;limpio flag e interrupciones
        bcf T0CON,TMR0ON
        return
       
;****************************************************
;Recibo un dato
;****************************************************

RECIBO
                   
        btfss PIR3,RC2IF            ;testeamos si el buffer de RX lleno(flag RC2IF=1)
        goto  RECIBO                ;vacio = no hay dato
       
        movf RCREG2,W
        movwf RXDATO
        bcf RCSTA2,CREN             ;limpiamos posibles errores
        bsf RCSTA2,CREN             ;deshabilitando y habilitando CREN

        return  
       
;****************************************************   
;Transmito un  dato
;****************************************************
           
ENVIO

        movf TXDATO,W    
        movwf TXREG2
       
BUCLE
        btfss TXSTA2,TRMT          ;esperamos registro TSR vacio (flag TRMT=1)
        goto BUCLE                 ;no vacio, esperamos
       
        return
       
INICIO    
 
                  bsf TRISG,2                 ;habilitamos RX2 como entrada
     bcf TRISG,1                 ;habilitamos TX2 como salida
   
     movlw D"129"                ;9600 baudios
     movwf SPBRG2
   
     movlw B"00000100"           ;8 bits datos, com. asincrona, alta velocidad (menor error)
     movwf TXSTA2
   
     bsf RCSTA2,SPEN             ;habilitamos puerto serie (USART)
     bsf TXSTA2,TXEN             ;habilitamos transmision
     bsf RCSTA2,CREN             ;habilitamos recepcion
 
                  call RECIBO
       
;-------  OPERAMOS CON EL DATO ---------
   
        movf RXDATO,W
        movwf TXDATO      
        incf TXDATO                 ;incremento el dato recibido
       
        call TEMPORIZACION
        call ENVIO    
       
FIN    
        nop
        nop
        goto FIN
       
        END

Desconectado FirmSoft

  • PIC16
  • ***
  • Mensajes: 118
RE: problema con subrrutinas
« Respuesta #1 en: 07 de Octubre de 2004, 23:08:00 »
   Hola, por lo visto tu codigo esta bien, es raro el problem que tienes.. no tengo mucho tiempo para dedicarle a tu code, pero un consejo, mira y verifica que en cada accion que realizas estes en el banco correcto. Es una pabada lo que digo, pero es lo unico que se me ocurre... estuve viendo y no sobrepasa el nivel de la pila con las llamadas que haces, asi que nuse que puede ser ... si consigo algo de tiempo, te dare una manita mas grande. Saludos

Desconectado kurdo22

  • PIC10
  • *
  • Mensajes: 48
RE: problema con subrrutinas
« Respuesta #2 en: 08 de Octubre de 2004, 08:32:00 »
 
    Del banco de registro creo que esta descartado, ya que, la serie del 18FXXX y mas concretamente el que yo uso 18f8720 no es necesario acudir a los bancos ya que el lo hace automaticamente. Gracias de todas formas.

    ¿Alguna opinion mas?

Desconectado kurdo22

  • PIC10
  • *
  • Mensajes: 48
RE: problema con subrrutinas
« Respuesta #3 en: 09 de Octubre de 2004, 13:36:00 »

   Ya se donde esta el problema, el problema esta en la temporizacion. Si la quito funciona el programa. Ahora el problema es saber porque cuando pongo la temporizcion sin el call, es decir a capon tal cual funciona, pero si la meto como una subrrutina no.

   ¿Alguien puede decirme algo?

   


 

anything