Autor Tema: PROBLEMA CON CODIGO ASSEMBLER EN CCSC !!!!HELP!!!!  (Leído 1839 veces)

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

Desconectado XXCIRCUITOXX

  • PIC10
  • *
  • Mensajes: 8
PROBLEMA CON CODIGO ASSEMBLER EN CCSC !!!!HELP!!!!
« en: 14 de Abril de 2011, 12:23:08 »
Hola amigos ayudenme necesito tengo un programa en assembler que encontre en la red y quiero agregarle algunas cosas mas en C  vi que en el conpilador tiene las opciones de #asm y #endasm y puse dentro de estas lineas mi codigo lo compile pero me da errores  el que no encuentro la solucion, por que cada ves que compilo me señala error en las etiquetas que llama en codigo assembler  aki les dejo el programa ojala me puedan ayudar .si no presento esto  no paso de semestre y ya intente todo declare las variables corregi unas partes del programa  o es que simplemente no puedo trabajar un programa de assembler en  AYUDA!!!!!!  les estare muy agradecido. :)


::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::.
#INCLUDE <16F84A.H>
#FUSES XT,NOWDT,NOPUT   
#USE DELAY(CLOCK=4000000)   
 //  __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
#USE STANDARD_IO(A)
#USE STANDARD_IO(B)
//;***** VARIABLE DEFINITIONS
INT w_temp;//          EQU       0x0C;        //; variable utilizada para guardar el contexto
INT status_temp;//      EQU       0x0D        //; variable utilizada para guardar el contexto
INT irerror;//         EQU      0x0E          //; variable utilizada cuando recibe posibles errors
INT irtimer;//         EQU      0x0F          //; variable utilizada para guardar el tiempo bitlenght
INT ircounter;//      EQU      0x10      ///; variable utilizada como contador de bits
INT ircmd  ; //      EQU      0x11      //; variable que mantenga el comando recibido
INT iradr   ;  //    EQU      0x12      //; variable que mantenga la dirección recibido
INT irtemp  ;  //     EQU      0x13     // ; variable utilizada para calcular ircommand de salida
INT irtemp2  ; //      EQU      0x18
INT delay1  ;  //     EQU      0x14     // ; variable de tiempo de comparacion de entrada
INT delay2 ;   //     EQU      0x15     // ; variable de tiempo de entrada
INT CounterA  ; //   EQU      0x16      //; variable de contador de tiempoA
INT codecount;  //    EQU      0x19
INT CounterB;   //   EQU      0x17     // ; variable de contador de tiempoB
INT led;        //    EQU      0x01    //  ; variable que asigna la salida del LED
INT ir;         //   EQU      0x04     // ; variable que asigna la entrada de la Señal IR
#BYTE STATUS =03
#BYTE TMR0 =01
#BYTE STATUS =0
#BYTE INTCONT =0X0B
//#BYTE STATUS =03


//;**********************************************************************
      VOID MAIN (VOID)
      {
      DO{
     #ASM
      movwf   w_temp          //     ; save off current W register contents
      movf   STATUS,w        //   ; mueve el registro status hacia el registro W
      movwf   status_temp     //     ; save off contents of STATUS register
      movf    status_temp,w   //    ; recupera copia de registro de status
      movwf   STATUS          //     ; restablece el contenido pre-isr registro status 
      swapf   w_temp,f//
      swapf   w_temp,w  //          ; restablece el contenido de pre-isr al registro W
      retfie          //            ; retornamos de la interrupcion
      //#ENDASM
init

//     #ASM
      CLRF    PORTA   //         ;Inicializamos el Puerto A y sus configuraciones
      BCF    STATUS, RP1//
      BSF    STATUS, RP0  //     ;Seleccionamos el Banco 1
      MOVLW    b"11110000"  //       ;Valor usado en la inicializacion
                           //;direccion de datos
      MOVWF    TRISA        //     ;Set RA<1> como salida
      MOVLW    b"00000000"    //     ;Valor usado en la inicializacion
                          // ;direccion de datos
      MOVWF    TRISB        //     ;Set Rb<7:0> como salidas                           
      BCF      STATUS, RP0    //     ;Seleccionamos el banco 0
      _return_                  // ;retornamos a la subrutina
      #ENDASM

read_sony
      BSF      irerror,0     //    ;Set el errorbit (después se borrará cuando se recibe un código correcto)
        BCF      INTCON,GIE    //     ;Deshabilita interrupciones temporalmente
         CLRWDT                //  ;Limpiamos el tiempo watchdog
         BSF      STATUS,RP0     //    ;Seleccionamos banco1
         MOVLW   b"10000101"       //  ;Establece el temporizador y prescaler
      MOVWF   OPTION_REG   
       BCF     STATUS,RP0      //   ;Seleccionamos el banco0
       BTFSC   PORTA,ir       //  ;Si se trata de un corto sobre el señal ir dejar de leer el código de error.
        GOTO    end_sony
        CLRF    TMR0          //  ;Borrar temporizador para medir la longitud startbit
sony_st1       
      BTFSS   PORTA,ir        // ;Medir el startbit
      GOTO    sony_st1
      MOVF    TMR0,0          //  ;mueve el valor de bitlength a irtimer
       MOVWF   irtimer
       MOVLW   d"32"          //  ;Mide la longitude del startbit menos de 2 ms a continua,si no es error
      SUBWF   irtimer,0
      BTFSS   STATUS,C
      GOTO    end_sony         
       MOVLW   d"213"         //   ;Si la longitud del startbit fue es 2,6ms entonces la lectura final con código de error.
      ADDWF   irtimer,0       //  ;Porque cuando no es válido el startbit el código ir ya no es protocolo sony
       BTFSC   STATUS,C       //  ;Así startbit debe estar entre 2 ms y 2,6 ms.
      GOTO    end_sony           
      MOVLW   d"7"          //  ;Establecer ir para de recibir 7 bits de comando.
       MOVWF   ircounter
rd_sony_cmd   
      CLRF    TMR0          //  ;Medida la primera parte de la bitlength: Si no es entre 300 y 900µs
sony_prt1_c   
      BTFSC   PORTA,ir      //   ;A continuación, la salida inmediata de la rutina con un error.
        GOTO    sony_prt1_c
      MOVF    TMR0,0
      MOVWF   irtimer
        MOVLW   d"5"
       SUBWF   irtimer,0
        BTFSS   STATUS,C
        GOTO    end_sony
      MOVLW   d"241"
       ADDWF     irtimer,0
       BTFSC   STATUS,C
       GOTO    end_sony
      CLRF    TMR0           
       CLRWDT               //   ;limpiamos el watchdog
sony_prt2_c   
      BTFSS   PORTA,ir      //   ;Part2 medida del comando bits y probar si la duración es de entre 300 y 1600µs
       GOTO    sony_prt2_c    //     ;Si entre estos intervalos de prueba, si bitpart segundo es más corto o más largo que 900µs
      MOVF    TMR0,0
       MOVWF     irtimer
      MOVLW   d"5"
       SUBWF   irtimer,0
        BTFSS   STATUS,C
       GOTO    end_sony
       MOVLW   d"230"
      ADDWF     irtimer,0
      BTFSC   STATUS,C
       GOTO      end_sony
      MOVLW   d"241"
         ADDWF   irtimer,0
      BTFSC   STATUS,C
      GOTO      sony_its_1
sony_its_0     
      BCF     STATUS,C      //   ;si inferior a 900 µs recibido el bit es un cero
        RRF       ircmd,1
      GOTO    nxt_sony_cmd
sony_its_1     
      BSF     STATUS,C
        RRF     ircmd,1
nxt_sony_cmd   
      DECFSZ  ircounter,1   //      ;comprobar si todos los bits de comando son procesados en caso de no,recibir el próximo
      GOTO      rd_sony_cmd   //      ;si es más de la longitud de 900µs recibido es un uno
        BCF     STATUS,C
       RRF     ircmd,1      //      ;Girar ircmd una posición para convertirse en comando correcto
       MOVLW     d"5"       //     ;ircounter establecido para recibir 5 bits de dirección
       MOVWF   ircounter
rd_sony_adr     
      CLRF      TMR0
sony_prt1_a     
      BTFSC   PORTA,ir      //   ;conjunto ir contar medida primer bit de longitud inferior a 300µs o más de 900µs entonces recibir 5 bits de dirección
         GOTO    sony_prt1_a   //      ;luego sale inmediatamente si es error
      MOVF    TMR0,0
      MOVWF   irtimer
      MOVLW   d"5"
      SUBWF   irtimer,0
      BTFSS   STATUS,C
      GOTO    end_sony
      MOVLW   d"241"
      ADDWF   irtimer,0
         BTFSC   STATUS,C
         GOTO    end_sony
        CLRF    TMR0
       CLRWDT                 // ;limpiamos el tiempo del watchdog
sony_prt2_a     
      BTFSS   PORTA,ir     
      GOTO    sony_prt2_a     //    ;segunda medida de longitud poco más corto que si 300µs o superior 1600µs
      MOVF    TMR0,0          //  ;luego sale si es error
      MOVWF   irtimer        //    ;Si entre estos intervalos de prueba si el bit es un uno o un cero (más corto o más largo que 900µs)
      MOVLW   d"5"
       SUBWF   irtimer,0
       BTFSS   STATUS,C
      GOTO    end_sony
       MOVLW   d"230"
        ADDWF   irtimer,0
       BTFSC   STATUS,C
         GOTO    end_sony
       MOVLW   d"241"
       ADDWF   irtimer,0
      BTFSC   STATUS,C
      GOTO    sony_its_1_a
sony_its_0_a     
      BCF     STATUS,C       //  ;si bitpart segundo fue más corto que 900µs es un cero
      RRF     iradr,1
       GOTO    nxt_sony_adr
sony_its_1_a     
      BSF     STATUS,C       //  ;si bitpart segundo fue más larga que la 900µs es uno
          RRF       iradr,1
nxt_sony_adr     
      DECFSZ  ircounter,1    //     ;Comprueba si todos los bits son procesados en caso de no, recibir el próximo
       GOTO    rd_sony_adr
      BCF     STATUS,C       //  ;Girar tres veces el iradr a convertirse en la dirección correcta
      RRF     iradr,1
       BCF     STATUS,C
      RRF     iradr,1
       BCF     STATUS,C
      RRF     iradr,1
        CLRF    irerror      //      ;Porque cada bitlength se midió correcto entre los límites no se han producido errores
      bcf      PORTA,led
     
end_sony       
      BCF    INTCON,T0IF     //    ;Borrar timer0 interrumpir un pabellón para evitar interrupciones
       BSF     STATUS,RP0
      MOVLW   b"00000101"
      MOVWF   OPTION_REG
       BCF     STATUS,RP0
       RETURN
ir_to_outp     
       movf    ircmd,w //; guardamos el codigo recibido en irtemp
       movwf   PORTB
       return
       movwf   irtemp
       subwf   irtemp2,w// ; comparamos con el codigo anterior
       btfss   STATUS,Z
       goto    mostrar_codigo
codigo_repetido
       incf    codecount,f
       movf    codecount,w
       btfss   STATUS,Z
       return
mostrar_codigo
       movlw   0x00
       movwf   codecount
       movf    irtemp,w
       movwf   irtemp2
       call   TABLA
       movwf   PORTB
       return           //       ;retorna al codigo principal     
       
delayrout1              //       ;tiempo de comparacion de señal IR
      movlw   d"255"
      movwf   delay2
looping2     
      movlw   d"255"
      movwf   delay1
looping1     
      nop
      nop
      decfsz   delay1,1
      goto   looping1
      decfsz   delay2,1
      goto    looping2
      return     
//;*************************************
//;*********       MAIN     **************
//;*************************************
main                      //  ;Codigo Principal
      call   init           // ;Inicializacion de variables
      clrf   PORTB          //  ;Limpiamos PuertoB
      clrf   PORTA           // ;Limpiamos PuertoA
BuclePrincipal
      call   read_sony       //  ;Funcion que recibe la señal IR
      btfsc   irerror,0       //  ;Busqueda de Errores
      goto    BuclePrincipal   //   ;Se queda esperando nueva entrada
      call   ir_to_outp       //  ;Funcion que verifica los botones y la salida
      call   delayrout1       //  ;Tiempo de comparacion de señal IR
      goto     BuclePrincipal   //   ;Se queda esperando nueva entrada
                           
      //END                         ;Finaliza el programa

//;**************************************
TABLA
   ADDWF   PCL,1
   RETLW   B"00000000"  // ; código para el 0
   RETLW   B"00000001"  // ; código para el 1
   RETLW   B"00000010"  // ; código para el 2
   RETLW   B"00000100"   //; código para el 3
   RETLW   B"00001000"  // ; código para el 4
   RETLW   B"00010000"  // ; código para el 5
   RETLW   B"00100000"  // ; código para el 6
   RETLW   B"01000000"  // ; código para el 7
   RETLW   B"10000000"  // ; código para el 8
      #ENDASM
      }WHILE(1);
      }

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: PROBLEMA CON CODIGO ASSEMBLER EN CCSC !!!!HELP!!!!
« Respuesta #1 en: 14 de Abril de 2011, 12:32:21 »
Me parece que lo más sencillo es terminarlo en ASM, creo que ya lo tienes hecho,  :shock: o migrarlo a C  :mrgreen:
No contesto mensajes privados, las consultas en el foro

Desconectado XXCIRCUITOXX

  • PIC10
  • *
  • Mensajes: 8
Re: PROBLEMA CON CODIGO ASSEMBLER EN CCSC !!!!HELP!!!!
« Respuesta #2 en: 14 de Abril de 2011, 12:43:53 »
bueno el problema es que aprendi C y assembler no lo entiendo mucho :shock: y en C me seria mas facil la programacion del programa parte que podria aprovechar codigo en ASM y trabjarlo en C :)

Desconectado XXCIRCUITOXX

  • PIC10
  • *
  • Mensajes: 8
Re: PROBLEMA CON CODIGO ASSEMBLER EN CCSC !!!!HELP!!!!
« Respuesta #3 en: 20 de Abril de 2011, 11:00:10 »
 :-/ hola suki tenias razon  creo que mudarlo era mas facil,
pero ahora tengo un problema  en cuanto utilizo el TMR0 puedo calcular el valor para el TRM0 por que necesito 1778 y el otro es de 880 ms para poder  demodular la señal del control remoto mi problema es el calculo del tiempo en el timer y como lo configuro el timer  estare muy agradecido :mrgreen:

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: PROBLEMA CON CODIGO ASSEMBLER EN CCSC !!!!HELP!!!!
« Respuesta #4 en: 20 de Abril de 2011, 12:27:30 »
  Hola,

          Tené en cuenta que con un cristal de 4 MHz el ciclo de instrucción es de 1uS por lo tanto para hacer una cuenta tan grande como la que necesitas vas a tener que emplear alguna variable que se vaya incrementando hasta cierto valor. Luego tendrás que evaluar el valor de la variable y sabrás el tiempo que pasó.

  Por ejemplo, poniendo el prescaler del timer0 a 128, dicho timer generará una interrupción cada 128uS * 256 --> 32.768mS. En la interrupción vas incrementando una variable y según su valor determinarás el tiempo. Cuando dicha variable llegue a 27 habrás contado 27 * 32.768mS --> 884.736mS. Cuando dicha variable llegue a 54 habrás contado 54 * 32.768mS --> 1769mS

  Tendrás que buscar el valor de prescaler que mejor se adapte a tus necesidades, cuanto más chico sea, más precisión tendrás.
  En la ayuda del CCS debería indicar como se configura el timer.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas