Autor Tema: Donde van las Tablas  (Leído 2427 veces)

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

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Donde van las Tablas
« en: 21 de Enero de 2012, 21:53:37 »
Hola, nuevamente, tengo otro problema, con mi pic 18F2550 puedo correr mi programa pero solo la mitad, haber si lo puedo explicar: se trata de una comunicación serie donde primeramente inicializo el dispositivo y luego otra parte del programa recoge los valores que envía, pero no puedo hacer que las dos parte funcionen a la vez, si funcionan separados.
Les paso el codigo con el cuerpo principal, haber si encuentran algo mal:
Código: [Seleccionar]
;*********************** DECLARACION DE PROCESADOR & CONFIGURACION *****************************

          TITLE      "Transmición SAS con un PIC 18F2550"
          LIST       P=18F2550, f=inhx32, r=dec  ;(INHX32= Formato de salida .hex, r=sistema decimal)
          #include   "P18F2550.INC"              ; Incluye datos de PIC 18F2550

          __idlocs    _IDLOC1, 0x01              ;IDLOC register 0 will be
                                                 ;programmed to 1.
          __idlocs    _IDLOC0, 0x02              ;IDLOC register 1 will be
                                                 ;programmed to 2.
          __idlocs    _IDLOC3, 0x03              ;IDLOC register 2 will be
                                                 ;programmed to 3.
          __idlocs    _IDLOC2, 0x04              ;IDLOC register 3 will be
                                                 ;programmed to 4. 
          __idlocs    _IDLOC5, 0x05              ;IDLOC register 4 will be
                                                 ;programmed to 5.                                   
          __idlocs    _IDLOC4, 0x06              ;IDLOC register 5 will be
                                                 ;programmed to 6.
          __idlocs    _IDLOC7, 0x07              ;IDLOC register 6 will be
                                                 ;programmed to 7.
          __idlocs    _IDLOC6, 0x08              ;IDLOC register 7 will be
                                                 ;programmed to 8.

; __CONFIG_CONFIG1L = _PLLDIV_1_1L & _CPUDIV_OSC3_PLL4_1L & _USBDIV_2_1L
; __CONFIG_CONFIG1H = _FOSC_XTPLL_XT_1H & _FCMEN_OFF_1H & _IESO_OFF_1H
; __CONFIG_CONFIG2L = _PWRT_OFF_2L & _BOR_ON_2L & _BORV_1_2L & _VREGEN_ON_2L
; __CONFIG_CONFIG2H = _WDT_OFF_2H & _WDTPS_32768_2H
; __CONFIG_CONFIG3H = _MCLRE_ON_3H & _LPT1OSC_OFF_3H & _PBADEN_OFF_3H & _CCP2MX_ON_3H
; __CONFIG_CONFIG4L = _STVREN_ON_4L & _LVP_OFF_4L & _XINST_OFF_4L & _DEBUG_OFF_4L ;& _ICPRT_OFF_4L
; __CONFIG_CONFIG5L = _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L
; __CONFIG_CONFIG5H = _CPB_OFF_5H & _CPD_OFF_5H
; __CONFIG_CONFIG6L = _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L
; __CONFIG_CONFIG6H = _WRTB_OFF_6H & _WRTC_OFF_6H & _WRTD_OFF_6H
; __CONFIG_CONFIG7L = _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
; __CONFIG_CONFIG7H = _EBTRB_OFF_7H

config PLLDIV = 1         ; No Divide  (4 MHz oscillator input)
config CPUDIV = OSC1_PLL2 ; [OSC1/OSC2 Src: /1][96 MHz PLL Src: /2]
config USBDIV = 2         ; USB clock source comes from the 96 MHz PLL divided by 2
config FOSC = HS          ; HS oscillator, HS used by USB
config FCMEN = OFF        ; Fail-Safe Clock Monitor disabled
config IESO = OFF         ; Oscillator Switchover mode disabled
config PWRT = ON          ; PWRT enabled
config BOR = OFF          ; Brown-out Reset enabled in hardware only (SBOREN is disabled)
config BORV = 1           ; Max setting, 0 1 2 3
config VREGEN = OFF       ; USB voltage regulator disabled
config WDT = OFF          ; HW Disabled - SW Controlled
config WDTPS = 1          ; 1:1, el valor que se coloque es el que divide, potencia al cuadrado tipo binario 2,4,8,16 etc.
config MCLRE = ON         ; MCLR pin enabled; RE3 input pin disabled
config LPT1OSC = OFF      ; Timer1 configured for higher power operation
config PBADEN = OFF       ; PORTB<4:0> pins are configured as digital I/O on Reset
config CCP2MX = ON        ; CCP2 input/output is multiplexed with RC1
config STVREN = ON        ; Stack full/underflow will cause Reset
config LVP = OFF          ; Single-Supply Low Voltage Programin in ICSP disabled
; config ICPRT = OFF        ; PIC18F4550
config XINST = OFF        ; Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
config DEBUG = OFF        ; Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
config CP0 = OFF          ; Block 0 (000800-001FFFh) not code-protected
config CP1 = OFF          ; Block 1 (002000-003FFFh) not code-protected
config CP2 = OFF          ; Block 2 (004000-005FFFh) not code-protected
config CP3 = OFF          ; Block 3 (006000-007FFFh) not code-protected
config CPB = OFF          ; Boot block (000000-0007FFh) not code-protected
config CPD = OFF          ; Data EEPROM not code-protected
config WRT0 = OFF         ; Block 0 (000800-001FFFh) not write-protected
config WRT1 = OFF         ; Block 1 (002000-003FFFh) not write-protected
config WRT2 = OFF         ; Block 2 (004000-005FFFh) not write-protected
config WRT3 = OFF         ; Block 3 (006000-007FFFh) not write-protected
config WRTB = OFF         ; Boot block (000000-0007FFh) not write-protected
config WRTC = OFF         ; Configuration registers (300000-3000FFh) not write-protected
config WRTD = OFF         ; Data EEPROM not write-protected
config EBTR0 = OFF        ; Block 0 (000800-001FFFh) not protected from table reads executed in other blocks
config EBTR1 = OFF        ; Block 1 (002000-003FFFh) not protected from table reads executed in other blocks
config EBTR2 = OFF        ; Block 2 (004000-005FFFh) not protected from table reads executed in other blocks
config EBTR3 = OFF        ; Block 3 (006000-007FFFh) not protected from table reads executed in other blocks
config EBTRB = OFF        ; Boot block (000000-0007FFh) not protected from table reads executed in other blocks

;******************************************************************************
;Datos de la EEPROM ;Los Datos a ser programados en la  EEPROM son definidos aqui
ORG     0xF00000
        DE      "Test Dato" 0, 1, 2, 3, 4, 5, 6, 7
;******************************************************************************
;******************************************************************************
; Vector de Reset.; Este codigo comenzara a ejecutarse cuando suceda un reset
ORG     0x0000
  goto PRINCIPAL ;Se va al inicio del codigo principal

;--------------------------VECTORES--------------------------------------------
;*********************************************************************************
; Vector de interrupcion de alta prioridad
; Este codigo comenzara a ejecutarse cuando una interrupcion de alta
; prioridad ocurra o cuando cualquier interrupcion ocurra si es que
; las prioridades de las interrupciones no estan habilitadas.

        ORG     0x0008
        BRA     HighInt

;Va a la rutina de interrupcion de alta prioridad

;*********************************************************************************
; Vector de interrupcion de baja prioridad y rutina; Este codigo comenzara a ejecutrase
; cuando una interrupcion de baja prioridad ocurra. Este codigo puede ser eliminado
; si las interrupciones de baja prioridad no son usadas
ORG     0x0018
        movff   STATUS,STATUS_TEMP ;Salva el registro STATUS
movff WREG,WREG_TEMP ;Salva el registro de trabajo
movff BSR,BSR_TEMP ;Salva el registro BSR

; *** El codigo de la interrupcion de baja prioridad va aqui ***

  movff BSR_TEMP,BSR ;recupera el registro BSR
movff WREG_TEMP,WREG ;recupera el registro de trabajo
movff STATUS_TEMP,STATUS ;recupera el registro STATUS
retfie

   ORG      0x0040                  ;Para no ocupar la zona de vectores.
                                        ; E iNTERRUPCIONES

;*********************************************************************************
; Rutina de interrupcion de alta prioridad.
; El codigo para la rutina de interrupcion de alta prioridad es colocado aqui para
; evitar conflictos con el vector de interrupciones de baja prioridad
HighInt:

 ; *** El codigo para las interrupciones de alta prioridad va aqui ***

  retfie FAST
 
;*********************************************************************************************
;********************************* INTERRUPCIONES ********************************************
;*********************************************************************************************
Config_InterrupPriority
         BCF    INTCON,GIEH             ; Deshabilitamos Interrupción Globales
;        CLRF   INTCON                  ; Otra forma
;        BCF    RCON,IPEN              ; Deshabilitamos prioridades de interrupción
;        bsf    INTCON,GIEH            ; Habilitamos interrupción de alta prioridad
;        bsf    INTCON,GIEL            ; Habilitamos interrupción de baja prioridad
;        bcf    INTCON2,RBIP            ; Baja prioridad para interrupcion de recepción
;        bsf    IPR1,TMR2IP            ; Alta prioridad para interrupción timrer_1

;***********************************************************************************************
;*************************************** Variables *********************************************
;***********************************************************************************************
      ORG   0X128
        #include "Variables\Variables-Master Cilindro.inc"

 ;----------------------------------------------------------------------------------------------;
;  ZONA DE CÓNFIGURACION INICIAL DEL MICROCONTROLADOR                                           ;
;-----------------------------------------------------------------------------------------------;
;       org   0x256
;        #include "Variables\Comandos3.inc"
Init_Setup                     ; ACCESS=0
clrwdt         ; Recomendacion de microchip antes de reasignar el
clrf    STATUS,ACCESS ; prescaler, y ademas limpio el registro de estados
clrf LATA,ACCESS     ; Borrado de posibles Latchs del puerto A
clrf LATB,ACCESS     ; Borrado de posibles Latchs del puerto B
clrf LATC,ACCESS     ; Borrado de posibles Latchs del puerto C
clrf    PORTA,ACCESS        ; Limpia Puerto A
    clrf    PORTB,ACCESS ; Limpia Puerto B
clrf    PORTC,ACCESS ; Limpia Puerto C
    clrf    INTCON,ACCESS       ; Limpia Registro de Control de Interrupciones
clrf INTCON2,ACCESS ; y Asociados
clrf INTCON3,ACCESS
clrf RCON,ACCESS
clrf PIE1,ACCESS
clrf PIE2,ACCESS
clrf    IPR1,ACCESS
clrf T2CON,ACCESS ; Detiene Timer2, Prescaler = 1:1 / Postscaler = 1:1
clrf TMR2,ACCESS ; Limpia Timer2 register
clrf    PCLATH,ACCESS       ; Aseguramos que trabajamos en la primera pagina

;*********************************************************************************************
;*                                    MAIN                                                  *
;*********************************************************************************************
PRINCIPAL
;******************************* INICIALIZO PORTS *********************************************
Config_PortA
;   clrf    PORTA               ; Se inicializa borrando los Latches
;   clrf    LATA                ; Otras metodo para borar los Latches
movlw 0x0F     ; Configura los pines del Puerto A y Puerto B,
movwf ADCON1,ACCESS ; como digitales carga este valor en el REG ADCON1
movlw 0x07         ; Desactiva el modulo comparador
  movwf CMCON,ACCESS ;
movlw b'00000000'     ; Config del Puerto A [ RA0 RA1 RA2 RA3 RA4 RA5]
movwf TRISA,ACCESS ;               [  S   S   S   S   S   S ]

;   CLRF    PORTB               ; Se inicializa borrando los Latches
movlw b'11110000'     ; Config del Puerto B [ RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0]
movwf TRISB,ACCESS ;               [  E   E   E   E   S   S   S   S ]

;   CLRF    PORTC               ; Se inicializa borrando los Latches
movlw b'10000110'     ; Config del Puerto C [ RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0]
movwf TRISC,ACCESS ;               [  E   S   S   S   S   E   E   S ]

clrf SSPCON1,ACCESS ; Deshabilito el modulo MSSP I2C, BANKED=1 ACCESS=0
  bcf UCON,USBEN,ACCESS ; Desactiva el modulo USB

;*********************************************************************************************
; BAUD RATE para la comunicación TX-RX y otras definiciones para la USART, Xtal= 18,432 Mhz
; Baud Rate = 9600, Sin Paridad, 8 bIT, 1 Bit parada.
;*********************************************************************************************
TX_232
    movlw   d'119'            ; d'119'=9600 bps. Si se desea tocar el valor para aproximar.
    movwf   SPBRG             ; Baud Rate Generador, Fijarse en tablas, ¡cargar en este!

    MOVLW   b'00100100'       ; Habilita la transmisión Async
    MOVWF   TXSTA             ; CSRC=0 Clock Source
                              ; TX9= 0 9-bit transmición Enable.
                              ; TXEN=1 Transmit Enable
                              ; SYNC=0 USART Modo; Sincronico=1, Asincronico=0
                              ; Bit3=0 NC no usado
                              ; BRGH=1 High Baud Rate                    ????????
                              ; TRMT=0 Transmit Shift register 0=FULL
                              ; TX9D=0 9-bit NO LO USAMOS.

    bcf     PIE1,TXIE         ; Deshabilito interrupcion de transmision de la USART.
    BCF     PIE1,RCIE         ; Deshabilito interrupcion de recepcion de la USART.

RX_232
    movlw   b'10010000'       ; Habilita de recepción Async
    movwf   RCSTA             ; SPEN=1 Serial Port Enable         
                              ; RX9= 0 9-bit Receive Enable
                              ; SREN=0 Single Receive
                              ; CREN=1 Continuos Receive Enable Bit
                              ; (Asinc. Enab.=1, Disab.=0)
                              ; ADDEN=0 Adress Detect Enable
                              ; FERR=0 Framing Error
                              ; OERR=0 Overrun Error
                              ; RX9D=0 9-bit receive podria ser paridad.


BAUD_RATE
MOVLW B'00000000'       ; Control del Baud Rate
MOVWF BAUDCON             ; ABDOVF=0 Auto Baud Adquisición Rollover
                              ; RCIDL=0 
                              ; RXDTP=0  Polaridad invertida de datos recibidos
                              ; TXCKP=0  Polaridad invertida de datos y clok transmitidos
                              ; BRG16=0  16-Bit Baud Rate Generador
                              ; UNIMPLEMENT
                              ; WUE=0    Wake-Up bit
                              ; ABDEN=0  Auto-Baud Detección Enable

clrf    PORTA,ACCESS      ; Limpia Puerto A
    clrf    PORTB,ACCESS   ; Limpia Puerto B
clrf    PORTC,ACCESS   ; Limpia Puerto C

;*********************************************************************************************
;******************************* INICIO DEL PROGRAMA *****************************************
;*********************************************************************************************
INICIO
    CALL    Delay_1s
    CLRF    FLAGreg
    CALL    RESET_USART

INICIALIZACION               
    CALL    LLAMADA_00            ; Para indicar que vamos a empezar a transmitir
    CALL    SEND_COMANDO_1        ; Comando de Inicio del Cilindro.
    CALL    Delay_1s         
    CALL    SEND_COMANDO_2        ; Envio comando de Inicio.
    CALL    CILINDRO_START        ; Verifico que tipo de datos recibimos

COMIENZO
    CALL    START_JUEGO
    CALL    FIN_JUEGO
    CALL     Delay_5s
    GOTO     COMIENZO


;*********************************************************************************************
;****************************** REVISION DE LOS DATOS OBTENIDOS *****************************
;*********************************************************************************************

        #include "Variables\TX-RX5.inc"
        #include "Variables\Comienzo_Juego3.inc"
        #include "Variables\Comandos de Inicio.inc"
        #include "Variables\Comandos3.inc"
        #include "Variables\Delay Routines.inc"
        #include "Variables\Errores.inc"

END


El problema es Comandos3.inc

Código: [Seleccionar]
;*********************************************************************************************
;********************************* COMANDOS **************************************************
;*********************************************************************************************
COMANDO_1
     MOVFF   PCL,W        ; antes de saltar hay que leer PCL e iniciar PCLATH:PCLATU
     ADDWF   PCL,F        ; Sumamos PCL y W, el resultado a PCL-> PCL=PCL+W
     RETLW   0x81
     RETLW   0x5A
     RETLW   0x30
     RETLW   0x30
     RETLW   0x82
     RETLW   0x41
     RETLW   0x41;***********
     RETLW   0x1B
     RETLW   0x30
     RETLW   0x74
     RETLW   0x9C
     RETLW   0x41
     RETLW   0xD2
     RETLW   0xCF
     RETLW   0xCC
     RETLW   0xCC
     RETLW   0xC9
     RETLW   0x4E
     RETLW   0x47
     RETLW   0xA0
     RETLW   0x4D
     RETLW   0xCF
     RETLW   0x4E
     RETLW   0xC5
     RETLW   0x59
     RETLW   0xA0
     RETLW   0xA0
     RETLW   0xA0
     RETLW   0xA0
     RETLW   0xC5
     RETLW   0xCC
     RETLW   0xC5
     RETLW   0xC3
     RETLW   0xD4
     RETLW   0xD2
     RETLW   0xCF   
     RETLW   0xA0
     RETLW   0xC3
     RETLW   0x48
     RETLW   0x41
     RETLW   0x4E
     RETLW   0xC3
     RETLW   0xC5
     RETLW   0xA0
     RETLW   0x53
     RETLW   0xD2
     RETLW   0xCC
     RETLW   0xA0
     RETLW   0xA0
     RETLW   0xA0
     RETLW   0xA0
     RETLW   0x41
     RETLW   0xD2
     RETLW   0x47
     RETLW   0xC5
     RETLW   0x4E
     RETLW   0xD4
     RETLW   0xC9
     RETLW   0x4E
     RETLW   0x41
     RETLW   0xA0
     RETLW   0xA0
     RETLW   0xA0
     RETLW   0xA0
     RETLW   0xA0
     RETLW   0xA0
     RETLW   0xA0
     RETLW   0xA0
     RETLW   0xA0
     RETLW   0xA0
     RETLW   0xA0
     RETLW   0x84
     RETLW   0x00        ; Fin

COMANDO_2
     MOVFF   PCL,W      ; Comando que enviamos para comenzar el inicio del cilindro 
     ADDWF   PCL,F      ; respuesta: 3C 3C 31 30 53 30 46 46 42 36 3E
     RETLW   0x3C       ; antes de saltar hay que leer PCL e iniciar PCLATH:PCLATU         
     RETLW   0x30       ; Sumamos PCL y W, el resultado a PCL-> PCL=PCL+W           
     RETLW   0x31       
     RETLW   0x59
     RETLW   0x30
     RETLW   0x33       ; otra posible: 3C 30 31 53 34 35 3E
     RETLW   0x45
     RETLW   0x3E
     RETLW   0x00         ; Fin

COMANDO_3
     MOVFF   PCL,W      ; Comando con el cual mantenemos la comunicación con
     ADDWF   PCL,F      ; el cilindro en el testeo hasta que este termine   
     RETLW   0x3C       ; de inicialize: 3C 30 31 59 31 44 42 3E             
     RETLW   0x30       ; respuesta: 3C 3C 31 30 59 30 30 46 46 44 35 3E   
     RETLW   0x31                 
     RETLW   0x59
     RETLW   0x31
     RETLW   0x44
     RETLW   0x42
     RETLW   0x3E
     RETLW   0x00                  ; Fin

COMANDO_4
     MOVFF   PCL,W     ; Comando final para iniciar el cilindro 0.     
     ADDWF   PCL,F     ; antes de saltar hay que leer PCL e iniciar PCLATH:PCLATU 
     RETLW   0x81      ; Sumamos PCL y W, el resultado a PCL-> PCL=PCL+W
     RETLW   0x5A
     RETLW   0x30
     RETLW   0x30 
     RETLW   0x82   
     RETLW   0x41
     RETLW   0x41
     RETLW   0x1B
     RETLW   0x30
     RETLW   0xB1
     RETLW   0x9C
     RETLW   0xB1
     RETLW   0x33
     RETLW   0xB4
     RETLW   0xA0
     RETLW   0x9C
     RETLW   0xB1
     RETLW   0xB1
     RETLW   0x39
     RETLW   0xA0
     RETLW   0x9C
     RETLW   0xB1
     RETLW   0x35
     RETLW   0xA0
     RETLW   0x9C
     RETLW   0xB1
     RETLW   0xB7
     RETLW   0xA0
     RETLW   0x9C
     RETLW   0xB2
     RETLW   0x30
     RETLW   0x30
     RETLW   0xA0
     RETLW   0x84
     RETLW   0x00                   ; Fin

COMANDO_5
     MOVFF   PCL,W       ; Comando final para iniciar el cilindro 00. 
     ADDWF   PCL,F       ; antes de saltar hay que leer PCL e iniciar PCLATH:PCLATU   
     RETLW   0x81        ; Sumamos PCL y W, el resultado a PCL-> PCL=PCL+W
     RETLW   0x5A
     RETLW   0x30
     RETLW   0x30
     RETLW   0x82
     RETLW   0x41
     RETLW   0x41
     RETLW   0x1B
     RETLW   0x30
     RETLW   0xB1
     RETLW   0x9C   
     RETLW   0x36
     RETLW   0xB2
     RETLW   0x36
     RETLW   0xA0
     RETLW   0x9C
     RETLW   0x36
     RETLW   0xB8
     RETLW   0xA0
     RETLW   0x9C
     RETLW   0xB1
     RETLW   0x39
     RETLW   0xA0
     RETLW   0x9C
     RETLW   0x36
     RETLW   0xB2
     RETLW   0xB2
     RETLW   0xA0
     RETLW   0x9C
     RETLW   0x36
     RETLW   0xB2
     RETLW   0xB8
     RETLW   0xA0
     RETLW   0x84
     RETLW   0x00                   ; Fin


COMANDO_6               ; Comando para interaccion en juego : 3C 3C 30 31 44 41 34 3E
     MOVFF   PCL,W      ; antes de saltar hay que leer PCL e iniciar PCLATH:PCLATU
     ADDWF   PCL,F      ; Sumamos PCL y W, el resultado a PCL-> PCL=PCL+W
     RETLW   0x3C       ; Respuesta a este comando : 3C 3C 31 30 44 46 46 46 46 32 35 3E
     RETLW   0x3C
     RETLW   0x30
     RETLW   0x31
     RETLW   0x44
     RETLW   0x41
     RETLW   0x34
     RETLW   0x3E
     RETLW   0x00

                         ; 81 5A 30 30 82 41 41 1B 30 B1 9C B1 B1 B8 A0 9C B1 B7 A0 9C 36
COMANDO_7                ; B2 B8 A0 9C B1 B1 B2 A0 9C 36 33 35 A0 84
     MOVFF   PCL,W       ; antes de saltar hay que leer PCL e iniciar PCLATH:PCLATU
     ADDWF   PCL,F       ; Sumamos PCL y W, el resultado a PCL-> PCL=PCL+W
     RETLW   0x81
     RETLW   0x5A
     RETLW   0x30
     RETLW   0x30
     RETLW   0x82
     RETLW   0x41
     RETLW   0x41
     RETLW   0x1B
     RETLW   0x30
     RETLW   0xB1
     RETLW   0x9C   
     RETLW   0xB1
     RETLW   0xB1
     RETLW   0xB8
     RETLW   0xA0
     RETLW   0x00

COMANDO_7_1               ; B2 B8 A0 9C B1 B1 B2 A0 9C 36 33 35 A0 84
     MOVFF   PCL,W       ; antes de saltar hay que leer PCL e iniciar PCLATH:PCLATU
     ADDWF   PCL,F       ; Sumamos PCL y W, el resultado a PCL-> PCL=PCL+W
     RETLW   0x9C
     RETLW   0xB1
     RETLW   0xB7
     RETLW   0xA0
     RETLW   0x9C
     RETLW   0x36
     RETLW   0xB2
     RETLW   0xB8
     RETLW   0xA0
     RETLW   0x9C
     RETLW   0xB1
     RETLW   0xB1
     RETLW   0xB2
     RETLW   0xA0
     RETLW   0x9C
     RETLW   0x36
     RETLW   0x33
     RETLW   0x35
     RETLW   0xA0
     RETLW   0x84
     RETLW   0X00            ; Fin

COMANDO_8                ; Comando para que empieze el juego
     MOVFF   PCL,W       ; antes de saltar hay que leer PCL e iniciar PCLATH:PCLATU
     ADDWF   PCL,F       ; Sumamos PCL y W, el resultado a PCL-> PCL=PCL+W
     RETLW   0x3C
     RETLW   0x3C        ; Respuesta a este comando : 3C 3C 31 30 49 38 44 3E
     RETLW   0x30
     RETLW   0x31
     RETLW   0x49
     RETLW   0x37
     RETLW   0x42
     RETLW   0x3E
     RETLW   0x00


COMANDO_9                ; Comando para detener el cilindro: 3C 3C 30 31 50 36 42 3E
     MOVFF   PCL,W       ; antes de saltar hay que leer PCL e iniciar PCLATH:PCLATU
     ADDWF   PCL,F       ; Sumamos PCL y W, el resultado a PCL-> PCL=PCL+W
     RETLW   0x3C
     RETLW   0x3C        ; Respuesta a este comando : 3C 3C 31 30 50 39 44 3E
     RETLW   0x30
     RETLW   0x31
     RETLW   0x50
     RETLW   0x36
     RETLW   0x42
     RETLW   0x3E
     RETLW   0x00


Como veran tiene tablas muy largas que son los comando que se envían a través del puerto serie al dispositivo y lo hace TX-RX5.inc,
les muestro una secuencia de envio:

Código: [Seleccionar]
SEND_COMANDO_1
    CLRF    TABLA_START       ; Borro el puntero de las Tablas
ESCMEN1
    RLNCF   TABLA_START,W,0   ; Roto un bit a la izquierda y lo guardo en W
    CALL COMANDO_1         ; Llamo a la Tabla a enviar y regreso con el caracter en W
    MOVWF   TX
    ADDLW 00H               ; Sumo para verificar
    BTFSC STATUS,Z          ; y si da 0, Z=1, salto
    RETLW   00H               ; si no llegue al final y retorno
    CALL    ENVIA_TX          ; Llamo a subrutina de envio por 232.
    INCF    TABLA_START,F     ; Incremento el puntero para el proximo caracter
    GOTO    ESCMEN1           ; Vuelvo a buscar otro caracter hasta finalizar.

Bueno volvamos a Comandos3.inc, este include es el problema, donde lo coloque el programa se comporta diferente, en donde esta ahora la primera parte del programa:
Código: [Seleccionar]
INICIALIZACION               
    CALL    LLAMADA_00            ; Para indicar que vamos a empezar a transmitir
    CALL    SEND_COMANDO_1        ; Comando de Inicio del Cilindro.
    CALL    Delay_1s         
    CALL    SEND_COMANDO_2        ; Envio comando de Inicio.
    CALL    CILINDRO_START        ; Verifico que tipo de datos recibimos

Pero la segunda, que es la mas larga y que mantiene el dispositivo funcionando, no:
Código: [Seleccionar]
COMIENZO
    CALL    START_JUEGO
    CALL    FIN_JUEGO
    CALL     Delay_5s
    GOTO     COMIENZO

Yo puedo colocar Comandos3.inc mas al principio como:
Código: [Seleccionar]
;*********************************************************************************************
;********************************* INTERRUPCIONES ********************************************
;*********************************************************************************************
Config_InterrupPriority
         BCF    INTCON,GIEH             ; Deshabilitamos Interrupción Globales
;        CLRF   INTCON                  ; Otra forma
;        BCF    RCON,IPEN              ; Deshabilitamos prioridades de interrupción
;        bsf    INTCON,GIEH            ; Habilitamos interrupción de alta prioridad
;        bsf    INTCON,GIEL            ; Habilitamos interrupción de baja prioridad
;        bcf    INTCON2,RBIP            ; Baja prioridad para interrupcion de recepción
;        bsf    IPR1,TMR2IP            ; Alta prioridad para interrupción timrer_1

;***********************************************************************************************
;*************************************** Variables *********************************************
;***********************************************************************************************
      ORG   0X128
        #include "Variables\Variables-Master Cilindro.inc"
        #include "Variables\Comandos3.inc"
 ;----------------------------------------------------------------------------------------------;
;  ZONA DE CÓNFIGURACION INICIAL DEL MICROCONTROLADOR                                           ;
;-----------------------------------------------------------------------------------------------;
;       org   0x256
;        #include "Variables\Comandos3.inc"
Init_Setup                     ; ACCESS=0
clrwdt         ; Recomendacion de microchip antes de reasignar el
clrf    STATUS,ACCESS ; prescaler, y ademas limpio el registro de estados

Pero el inicio no andaría o los dos no andarían el error que hace es que las tablas de comandos se superponen, o sea se envia la mitad de una con la mitad de otra totalmente distinta y no consecutiva o solo transmitiría la mitad.

Espero que me hayan podido entender ya que no se que hacer o lo que estoy haciendo mal.
Les agradeceria todo a ayuda posible.
Gracias
 

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Donde van las Tablas
« Respuesta #1 en: 22 de Enero de 2012, 00:04:08 »
hola macedo.

Deberias utilizar los comandos de lectura y escritura de tabla! De lo contrario tendrás problema para recorrer la memoria usando solo PCL.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
Re: Donde van las Tablas
« Respuesta #2 en: 22 de Enero de 2012, 00:06:14 »
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Donde van las Tablas
« Respuesta #3 en: 23 de Enero de 2012, 11:30:52 »
Hola, estuve probando esos ejemplos y no me dieron resultados, pero tengo este que era de un LCD y me anda bien:
Código: [Seleccionar]
SEND_COMANDO_1
movlw UPPER COMANDO_1
movwf MsnAddressUpper
movlw HIGH COMANDO_1
movwf MsnAddressHigh
movlw LOW COMANDO_1
movwf MsnAddressLow

CARGO_COMANDO
movff MsnAddressUpper,TBLPTRU
movff MsnAddressHigh,TBLPTRH
movff MsnAddressLow,TBLPTRL

CARGO_CARACTER
TBLRD*+
movff TABLAT,TEMP3            ; Cargo el dato
movf TEMP3,F
bz     COMANDO_FIN
; movf TEMP3,W
    MOVFF   TEMP3,TX
call ENVIA_TX         ; Visualiza el dato ASCII leído.
bra     CARGO_CARACTER          ; dentro del mensaje.

COMANDO_FIN
RETLW   0X00                    ; Vuelve al programa principal.


El problema es que me envia un dato demas que es la "," que esta entre los datos:

Código: [Seleccionar]
COMANDO_1
         dt 0x81,0x54,0x30,0x30,0x82,0x41,0x41,0x1b,0x30,0x74,0x9c,0x41,0xD2,0XCF,0X4E,0XC5,0X59,0XA0,0XA0,0XA0,0XA0,0XC5,0x00

Les pregunto como puedo saltar un caracter al leer la tabla ya que mis intentos me estan haciendo enviar cualquier dato al TX de mi circuito.
Gracias

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Donde van las Tablas
« Respuesta #4 en: 23 de Enero de 2012, 12:13:19 »
Solucionado:
Código: [Seleccionar]
SEND_COMANDO_1
movlw UPPER COMANDO_1
movwf MsnAddressUpper
movlw HIGH COMANDO_1
movwf MsnAddressHigh
movlw LOW COMANDO_1
movwf MsnAddressLow

CARGO_COMANDO
movff MsnAddressUpper,TBLPTRU
movff MsnAddressHigh,TBLPTRH
movff MsnAddressLow,TBLPTRL

CARGO_CARACTER
TBLRD*+                         ; Leo la tabla
movff TABLAT,TEMP3            ; Cargo el dato
movf TEMP3,F                 ; Cargo W para comparar
bz     COMANDO_FIN             ; Si llego al fin salto
    MOVFF   TEMP3,TX                ; Cargo el registro de envio,
call ENVIA_TX         ; y lo envio
TBLRD*+                         ; Leo la tabla nuevamente para saltearme un dato
movff TABLAT,TEMP3            ; Cargo el dato
    CLRF    TEMP3                   ; y lo borro
bra     CARGO_CARACTER          ; Vuelvo a empezar

COMANDO_FIN
RETLW   0X00                    ; Vuelve al programa principal.

Ahora bien, les pregunto tiene un limite de carga esta en la memoria ya que solo me lleyo unos 78bits del comando, que tiene un total, con las ","  de 143bits? Creo que es muy largo!
Saludos y gracias


Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Donde van las Tablas
« Respuesta #5 en: 23 de Enero de 2012, 12:43:00 »
Las comillas separadoras no se escriben en la FLASH. Lo que puede estar pasando es que las instrucciones en los 18F ocupan 2 bytes cada una por lo que las tablas que estás haciendo tienen un byte por medio vacío o con algún valor predeterminado.

Por eso es que los ejemplos para 16F que te recomendó Todopic deben ser modificados para leer correctamente en uC 18F.

No entendí lo que quisiste preguntar con respecto a la carga de memoria. Podés utilizar toda la memoria ROM con tablas si eso es lo que estás preguntando. No hay límite más que la memoria disponible.

Podrías fijarte en el Disassembly Listing para ver mejor cómo el compilador acomoda las tablas y el código restante.

Saludos.
« Última modificación: 23 de Enero de 2012, 12:46:54 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Donde van las Tablas
« Respuesta #6 en: 23 de Enero de 2012, 12:52:33 »
Hola voy a ver lo que me dijistes pero te muestro a lo que me referia:
Código: [Seleccionar]
COMANDO_1
         DT 0x81,0x5A,0x30,0x30,0x82,0x41,0x41,0x1B,0x30,0x74,0x9c,0x41,0xD2,0XCF,0XCC,0XCC,0XC9,0X4E,0X47,0XA0,0X4D,0XCF,0x4E,0xC5,0X59,0XA0,0XA0,0XA0,0XA0,0XC5,0XCC,0xC5,0xC3,0xD4,0XD2,0xCF,0xA0,0XC3,0X48,0X41,0X4E,0XC3,0XC5,0XA0,0X53,0XD2,0XCC,0XA0,0XA0,0XA0,0XA0,0X41,0XD2,0X47,0XC5,0X4E,0XD4,0XC9,0X4E,0X41,0XA0,0XA0,0XA0,0XA0,0XA0,0XA0,0XA0,0XA0,0XA0,0XA0,0XA0,0X84,0X00

Es un comando entero de transmición, es largo no!
Saludos

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Donde van las Tablas
« Respuesta #7 en: 25 de Enero de 2012, 15:21:41 »
Hola lo resolvi haciendo la tabla asi:

Código: [Seleccionar]
     RETLW   0x31                 
     RETLW   0x59
     RETLW   0x31
     RETLW   0x44
     RETLW   0x42
     RETLW   0x3E
     RETLW   0x00                  ; Fin


Yo creo que el MPLAB tiene un limite de linea ya que me paso algo similar con otra instrucciones que eran muy largas.
Pero de esta manera y con este codigo van bien:

Código: [Seleccionar]
CARGO_COMANDO
movff MsnAddressUpper,TBLPTRU
movff MsnAddressHigh,TBLPTRH
movff MsnAddressLow,TBLPTRL

CARGO_CARACTER
TBLRD*+                         ; Leo la tabla
movff TABLAT,TEMP3            ; Cargo el dato
movf         TEMP3,F                 ; Cargo W para comparar
bz         COMANDO_FIN             ; Si llego al fin salto
        MOVFF      TEMP3,TX                ; Cargo el registro de envio,
call         ENVIA_TX         ; y lo envio
TBLRD*+                         ; Leo la tabla nuevamente para saltearme un dato
movff TABLAT,TEMP3            ; Cargo el dato
         CLRF        TEMP3                   ; y lo borro
bra         CARGO_CARACTER          ; Vuelvo a empezar

COMANDO_FIN
RETLW   0X00                    ; Vuelve al programa principal.

Gracias a todos y saludos