Autor Tema: Comm Serial 9600 18F2550 y tablas  (Leído 1347 veces)

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

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Comm Serial 9600 18F2550 y tablas
« en: 08 de Enero de 2012, 19:51:38 »
Hola, tengo un problema, quiero conectar un dispositivo a mi pic con una comunicación serial de 9600, 8, n, y tengo que enviar comandos de inicio y control pero lo quiero hacer mediante tablas y las de f84 no sirven, les paso una secuencia que arranco pero me duplica los bits, o sea me los envía dos veces antes de pasar al siguiente y quisiera no llamar una sola tabla sino a varias o una con varias partes dentro quese pueda llamar independientemente, les paso una parte:
Este codigo me repite los bites enviados, en que me equivoco?

Código: [Seleccionar]
INICIO
    MOVLW    0X00               ; COMIENZO DE DIRECCION DE LA TABLA
    MOVWF    WREG
    rlncf    WREG,W,0
    CLRF    KEY_1
;    movff    PCL,0 ;antes de saltar hay que leer PCL e iniciar PCLATH:PCLATU
    CALL     ESCMEN
    CALL    Delay_1s
    GOTO    INICIO

;*********************************************************************************************
; ESCMEN: SUBRUTINA QUE ESCRIBE UN MENSAJE                                       *
; PASAR INICIO DE TABLA EN ACUMULADOR                                                        *
;*********************************************************************************************
ESCMEN
ESCMEN2

    CALL TABLA
    MOVWF   DIR_CHAR           
    ADDLW 00H
    BTFSC STATUS,Z
    RETURN
    INCF    KEY_1,F
    MOVWF   TXREG             ; Envío el dato en acunulador W

Espere
    BTFSS   TXSTA,TRMT        ; Transmision completa si es 1, termino y salto
    GOTO    Espere
    CALL    Delay_105us       ; Espera de 1 bit
    CALL    Delay_105us       ; Espera de 1 bit
    CALL    Delay_105us       ; Espera de 1 bit

    GOTO    ESCMEN2

TABLA
; movff PCL,0 ;antes de saltar hay que leer PCL e iniciar PCLATH:PCLATU
; addwf PCL,F ; Sumamos PCL y W, el resultado a PCL-> PCL=PCL+6
 movf     KEY_1,W
 addwf    PCL,F


 retlw 0x2C  ; con lo que se salta a la posición 
 retlw 0x44  ; indicada por W
 retlw 0x33
 retlw 0xC9   ; PCL=PCL+6 Este (0x02) es el valor devuelto en WREG.
 retlw 0xA2
 retlw 0xB8
 retlw 0x00


Y me gustaria que las tablas tengan este estilo asi poder llamar a una solamente y seleccionar la parte que quiero usar:

Código: [Seleccionar]
TABLA         MOVWF PCL

MEN_1         RETLW 'I'
            RETLW 'N'
            RETLW 'T'
            RETLW 'R'
            RETLW 'O'
            RETLW 'D'
            RETLW 'U'
            RETLW 'Z'
            RETLW 'C'
            RETLW 'A'
            RETLW 00H

MEN_2         RETLW 'P'
            RETLW 'U'
            RETLW 'E'
            RETLW 'D'
              RETLW 'E'
            RETLW ' '
            RETLW 'P'
            RETLW 'A'
            RETLW 'S'
            RETLW 'A'
            RETLW 'R'
            RETLW '!'
            RETLW 00H

MEN_3         RETLW ' '
            RETLW 'I'
            RETLW 'N'
            RETLW 'C'
            RETLW 'O'
            RETLW 'R'
            RETLW 'R'
            RETLW 'E'
            RETLW 'C'
            RETLW 'T'
            RETLW 'A'
            RETLW 00H

MEN_4         RETLW 'C'
            RETLW 'A'
            RETLW 'M'
              RETLW 'B'
            RETLW 'I'
            RETLW 'O'
            RETLW ' '
            RETLW 'D'
            RETLW 'E'
            RETLW 00H

MEN_5         RETLW 'C'
            RETLW 'L'
            RETLW 'A'
            RETLW 'V'
                RETLW   'E'
            RETLW 00H

Llamando en este caso al men_1, men_2, men_3, etc.
Espero que hallan entendido y me puedan ayudar.
Saludos  :)


Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Comm Serial 9600 18F2550 y tablas
« Respuesta #1 en: 12 de Enero de 2012, 22:34:33 »
Código: [Seleccionar]
Hola pude resolver lo de las tablas, o algo, tengo varias dudas, como por ejemplo cuanto CALL y GOTO puedo hacer hasta que se termine una parte de la rutina que los nombra? ya que en la mía verifico cadenas de bit enviados y se derivan a otras parte para devolver datos según lo recibido. Otra pregunta, yo formo las tablas y en un archivo aparte y lo llamo tablas.inc, la pregunta es en que parte del programa debe ir el # include tabla.inc, la pregunta se debe a que cuando llamo a una en especial se envia por el seria la tabla que llame mas parte de otra!
les pongo la tabla:
[codeCOMANDO_1
     RLNCF   TABLA_START,W,ACCESS
     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                          ; Comando que enviamos luego de recibir la contestación
     RLNCF   TABLA_START,W,ACCESS  ; del cilindro tenemos: 3C 30 31 59 30 33 45 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   0x30                  ; otra posible: 3C 30 31 53 34 35 3E
     RETLW   0x31                 
     RETLW   0x59
     RETLW   0x30
     RETLW   0x33
     RETLW   0x45
     RETLW   0x3E
     RETLW   0x00                 ; Fin

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

COMANDO_4                          ; Comando final para iniciar el cilindro 0.
     RLNCF   TABLA_START,W,ACCESS
     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   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                          ; Comando final para iniciar el cilindro 00.
     RLNCF   TABLA_START,W,ACCESS
     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   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



Y me faltan agregar muchas mas!
Ahora con la que tengo problema es con el comando_3
Les pongo como llamo a esa tabla
Código: [Seleccionar]
SEND_COMANDO_3
    CLRF    TABLA_START       ; Borro el puntero de las Tablas
ESCMEN3
    CALL COMANDO_3         ; 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, no salto
    RETLW   0                 ; 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    ESCMEN3            ; Vuelvo a buscar otro caracter hasta finalizar.

Lo mas extraño es que todas las rutinas son iguales!

Acabo de ver algo mientras hacia este mensaje, y es que las tablas, como les mencione envian el codigo + la parte de otro, es que se superponen y no se porque, una cosa que hice es agregar varios NOP para correrlas de lugar y funciono, se los paso:
Código: [Seleccionar]
COMANDO_1
     RLNCF   TABLA_START,W,ACCESS
     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                          ; Comando que enviamos luego de recibir la contestación
     RLNCF   TABLA_START,W,ACCESS  ; del cilindro tenemos: 3C 30 31 59 30 33 45 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   0x30                  ; otra posible: 3C 30 31 53 34 35 3E
     RETLW   0x31                 
     RETLW   0x59
     RETLW   0x30
     RETLW   0x33
     RETLW   0x45
     RETLW   0x3E
     RETLW   0x00                 ; Fin

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

     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP

COMANDO_4    ; Comando final para iniciar el cilindro 0.
     RLNCF   TABLA_START,W,ACCESS
     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   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    ; Comando final para iniciar el cilindro 00.
     RLNCF   TABLA_START,W,ACCESS
     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   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


El comando_4 era ahora el que se pisaba con parte del final del comando_1, cosa de locos!

Espero que puedan ayudarme.
Saludos