TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: macedo 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?
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:
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 :)
-
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
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:
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