necesito ayuda con pic 16F628

:eek:
Hola estaba creando un programa en assembler para el pic mencionado y necesito que al recibir una letra via serial del PC, compare que letra es y segun eso salte a la subrutina respectiva.
Tengo un programa hecho en c que realiza las comparaciones y es el siguiente:
IF serial="L" THEN estado
IF serial="O" THEN fijo2
IF serial="g" THEN inten1
IF serial="h" THEN inten2
IF serial="i" THEN inten3
IF serial="j" THEN inten4
IF serial="k" THEN inten5
IF serial="l" THEN menos
IF serial="R" THEN rele1
IF serial="C" THEN rele2
IF serial="T" THEN tempe
IF serial="S" THEN salida

con esto de acuerdo a la letra recibida salta a la subrutina, pero necesito hacer lo mismo en assembler.
Tengo unas lineas de codigo que supuestamente hacen lo mismo y son las siguientes
Compara call RX_RS232
xorlw 'L' ;De aquí en adelante compra los caracteres recibidos para
btfsc 3,2 ;realizar el salto a la subrutina respetiva
goto estado
xorlw 'O'
btfsc 3,2
goto fijo2
xorlw 'g'
btfsc 3,2
goto inten1
xorlw 'h'
btfsc 3,2
goto inten2
xorlw 'i'
btfsc 3,2
goto inten3
xorlw 'j'
btfsc 3,2
goto inten4
xorlw 'k'
btfsc 3,2
goto inten5
xorlw 'l'
btfsc 3,2
goto menos
xorlw 'R'
btfsc 3,2
goto rele1
xorlw 'C'
btfsc 3,2
goto rele2
xorlw 'T'
btfsc 3,2
goto tempe
goto Compara ;Regresa a esperar un dato valido

pero no estoy seguro en la parte de btfsc 3,2 asi que les pido ayuda
Gracias
Esteban
 
Bueno, no tengo en la cabeza los mnemónicos pero la instrucción

btfsc 3,2

es poco claro, podés usar los archivos .inc que te permiten escribir algo más intuitivo como

btfsc STATUS,Z

También por una cuestión de claridad sugiero poner esas líneas en las que hacés la comparación en una rutina aparte (una función) que la llames con

call InterpretarComando

por ejemplo. Fuera de eso, el problema no pasa por ahí. Cuando hacés la comparación supongo que el comando está en el registro W.
Cuando hacés

xorlw 'O'

estás haciendo la xor de W con el caracter 'O' y lo estás guardando en W, es decir:

W = W xor 'O'

y ahí ya perdiste el caracter original que recibiste por RS-232

Lo que tendrías que hacer es guardar el caracter recibido en una variable y no alterar su contenido.

Por ejemplo, antes de hacer las comparaciones escribir algo como:


movwf Comando;

Esto podría ir dentro de la rutina RX_RS232 o fuera, a tu gusto

y después sí, vendría algo como

(W = Comando)
movf Comando, W; o movf Comando, 0 ;

(W = W xor caracter)
xorlw 'ElCaracterquecorresponda'
btfsc status,Z;
goto DondeSea
movf Comando, W; hay que recargar el caracter recibido por RS232 en W porqe alteramos el contenido de W al hacer la xor.

Bueno, el problema en resumen es que la xor te altera el contenido de W en el cual tenías el comando recibido.

Nota importante: no tuve en cuenta el cambio de bancos de memoria (ni me acuerdo como se hacía, creo que había un mnemónico selbank pero no lo sé) igual creo que no hace falta ya que se usa W, STATUS y el registro Comando, por ahí si hace falta seleccionar el banco del registro Comando inmediatamente después de call RX_RS232
 
Gracias Ardigan, la verdad cambie estos comandos porque no estaba seguro de q hacian lo q necesito.
Encontre que dentro de los archivos .inc y de ciertos programas que revise utilizan los comandos IF y ENDIF, así q decidi cambiar esta parte del programa y la misma quedo asi:

Compara call RX_RS232
IF dato == 'L' ;De aquí en adelante compara los caracteres recibidos
goto estado ;para realizar el salto a la subrutina respetiva
ENDIF
IF dato == 'O'
goto fijo2
ENDIF
IF dato == 'g'
goto inten1
ENDIF
IF dato == 'h'
goto inten2
ENDIF
IF dato == 'i'
goto inten3
ENDIF
IF dato == 'j'
goto inten4
ENDIF
IF dato == 'k'
goto inten5
ENDIF
IF dato == 'l'
goto menos
ENDIF
IF dato == 'R'
goto rele1
ENDIF
IF dato == 'C'
goto rele2
ENDIF
IF dato == 'T'
goto tempe
ENDIF
goto Compara ;Regresa a esperar un dato valido

Además dentro de la subrutina RX_RS232 guardo el dato del acumuluador W a la variable dato que se encuentra en la localidad 0x28h. Aun no he podido comprobar si el pic me va a hacer la comparación pero espero que si, que pioensas tu de acuerdo a lo que te cuento?
Espero tu pronta ayuda y muchas gracias por todo.
Esteban
 
Mmmmmno, los if... endif... etc que hay dentro de los archivos .inc son directivas de compilación, no son instrucciones de programa.
El inc que deberías usar en tu programa es el p16f628.inc que esl que corresponde a tu pic con la sentencia:

#include "p16f628.inc" bien al inicio de tu programa, 1ra línea de todas.

Dentro del include vienen definidas básicamente etiquetas para todos los registros de propósito específico del pic, y los bits de control de los mismos.

Volviendo a los if's, son directivas de compilación. Las directivas de compilación sirven para que se compilen o no en el programa ciertos segmentos de código o se incluyan/excluyan ciertas etiquetas. Las etiquetas son las que se definen con #define.
En el archivo de ayuda del mplab ide (help->topics->mpasm assembler->directives->conditional assembly directives) tenés toda la información necesaria.
 
Resulta que pretendo hacer un porgrama que me encienda unos led de acuerdo a una tabla de verdad, pero mmmm no sé que pasa solo me saca la primer línea y despues ya no hace nada.
MOVLW 0x07
MOVWF CMCON
BSF STATUS,5
CLRF PORTB
MOVLW 0x2F
MOVWF PORTA
BCF STATUS,5
LEER
MOVF PORTA,w
CALL TABLA
MOVWF PORTB
GOTO LEER
TABLA
ADDWF PCL,1
RETLW B'11111100'
RETLW B'01100000'
RETLW B'11011010'
RETLW B'11110010'
RETLW B'01100110'
RETLW B'10011011'
RETLW B'10111110'
RETLW B'11100000'
RETLW B'11111110'
RETLW B'11110110'

Se supone que debe leer lo que hay en el puerto A y en base a eso realizar una suma con el contador del programa y así ir a la línea y sacar lo que hay ahi, pero sòlo lo hace cuando esta todo en 0,
Cuàl puede ser mi error o cómo pordría darle solución?
 
solo me saca la primer línea y despues ya no hace nada

A ver.. cuando querés correr el programa solo ejecuta el movlw 0x07 y nada más?, pudiste compilar el programa?.
Por el uso de CMCON adivino que usas un pic con comparador, podrías decir que pic es?.
Lo que publicaste es un segmento del programa o todo el programa?, porque podría ser que no hayas configurado los puertos como entrada/salida con los registros TRIS.

solo me saca la primer línea

Aaahhh, la primer línea de la tabla.... a eso te referís creo.

Fijate en que dirección arranca la rutina tabla (a qué dirección corresponde esa etiqueta), porque puede ser que si la dirección termina en 0xFE por ejemplo, te va a andar bien para la primera y segunda entradas de la tabla, pero después al hacer la suma al PCL hay desbordamiento y te volvería a sacar el 1er valor de la tabla. Antes de la etiqueta tabla podrías poner

ORG nn00h; nn lo elegís según te convenga

para asegurarte que no va a haber desbordamiento (por lo menos no mientras la tabla tenga hasta 256 valores).

Es eso?

[/quote]
 
Gracias Ardogan, justamente ayer en la noche probé el programa compilado y me di cuenta que toda la programación que se encuentra dentro de las sentencias IF y ENDÇIF desaparece en el archivo .hex y vel programa se quedo en un lazo infinito en q solo llama a la subrutina para recibir datos. Hoy probare con las líneas de comando que me indicaste anteriormente guardando el dato del acumulador w en una variable diferente para que no se altere. Yo te cuento como me fue.
Muchas gracias
Esteban
 
Atrás
Arriba