Buenas tardes. Soy nuevo en estos asuntos y resulta que estoy haciendo un lector/escritor de RFID en un 16f628a; el transceiver que estoy utilizando es un Texas TIRIS TMS3705 y la idea es interconectar un PC por RS232 al transceiver con el pic.
Ahora bien, resulta que esta es la hora que no he podido hacer que el proyecto funcione y no encuentro el por qué, puesto que ni siquiera el oscilador me responde (lo intenté con INTOSC y con XTAL de 4 MHz, pero no reacciona con ninguno). las simulaciones en Proteus me funcionan sin ningún problema (bueno, casi) puesto que me habilita todas las opciones pero en la comunicación serial no está recibiendo nada (eso es lo de menos, igual en un step by step no creo que pueda emular eso). Como dato adicional, debo aclarar que estoy usando MPLab 8.20a con un PicStart Plus como programador. El PicStart era de un kit 6.4; pero le actualicé el Firmware y cada vez que le pido que me programe el pic, me dice que tengo los registros de memoria desactualizados.
El código que desarrollé está en assembly puesto que la temporización en C estaba fallando demasiado, y es el siguiente, más o menos:
include <p16f628a.inc>
STATUS equ 03 ;se escribe un 3 en el registro STATUS
RP0 equ 5 ;
PORTB equ 06
cont1 equ 2A
cont2 equ 2B
cont3 equ 2C
brate equ 2D
rfdata equ 30
flag equ 40
flag1 equ 41
org 0x00
goto INICIO
org 0x04
ISR
bcf INTCON,GIE
btfss PORTB,3
btfsc flag1,0
call getchar
btfss PORTB,3
call get1char
bsf INTCON,GIE
retfie
INICIO
bsf STATUS,RP0 ;bit set el bit RP0 del registro STATUS para cambiar de banco e ir al banco 1,paso a banco uno
bcf PORTB,4 ;bit clear el bit 0 del registro PORTB para colocarlo como salida,configuro el pin rb0 del controlador como salida para poder mandar unos o ceros al mundo exterior.colocar en cero el bit 0 de registro trisb,�, conf el pin nb0 como salida
bcf PORTB,3
bsf PORTB,2
bsf PORTB,1
bcf PORTB,5
bsf PIE1,RCIE
bcf STATUS,RP0 ;bit clear el bit RP0 del registro STATUS para cambiar de banco y regresar al banco 0,por lo general estamos en el banco cero, de regreso al banco por defecto, bank 0, de regreso al banco o
bcf PORTB,2
bsf PORTB,4
bcf PORTB,5
bcf PIR1,RCIF
bcf PIR1,TXIF
bsf INTCON,PEIE
bsf INTCON,GIE
REPETIR ;rutina de onda para el transceiver
bcf PORTB,3
bcf PORTB,4 ;RB0 emite un 1, para encender un led, coloca en uno el bit cero del registro cero seir del banco cero, enciende el led
call delay1 ;se llama a la subrutina delay3, durante un seg
bsf PORTB,4 ;RB0 emite un 0, para apagar un led,apagar led
movlw d'40'
movwf cont2
call delay2 ;se llama a la subrutina delay3, durante un segundo
bcf PORTB,4
movlw d'15'; baud rate 15625
movwf flag
call initserial
call delay3
bsf PORTB,4
movlw d'60'
movwf cont2
call delay2
bsf PORTB,3
movlw d'25'
call initserial
call putchar
call delay3
call delay3
goto REPETIR ;regresamos a la etiqueta REPETIR, esta estructura es un ciclo infinito mientras el controlador este prendido
;Rutinas de Comunicaci�n serial
initserial
bsf STATUS,RP0 ; selecciona Banco 1
movfw flag
movwf SPBRG ; carga en el registro de baud
movlw d'36' ; habilitar trasmisi�n, 8 bits
movwf TXSTA ; modo as�ncrono, alta veloc
bcf STATUS,RP0 ; selecciona Banco 0
movlw 0x90 ; receptor habilitado, 8 bits
movwf RCSTA ; puerto serial habilitado
return
getchar
movlw 0x2F ;carga valor de apuntador a RAM
movwf FSR ;inicializa apuntador
clrf RCREG
get
btfss PIR1, RCIF ;�dato listo?
goto get ;loop de espera hasta que el dato est� listo
movf RCREG,w ;caracter recibido en w
movwf INDF
incf FSR,F ;incrementa apuntador
btfss FSR,3 ;si ya termin� escapa a continuar
goto get ;si no repite
movlw d'0'
movwf flag1
return
get1char
btfss PIR1, RCIF ;�dato listo?
goto get1char ;loop de espera hasta que el dato est� listo
movfw RCREG ;caracter recibido en w
movwf flag
movlw d'1'
movwf flag1
return
putchar ;caracter contenido en w
movlw 0x30 ;carga valor de apuntador a RAM
movwf FSR ;inicializa apuntador
clrf TXREG
put
btfss PIR1, TXIF
goto put
movlw INDF
movwf TXREG ;env�a el contenido de w
incf FSR,F ;incrementa apuntador
btfss FSR,3 ;si ya termin� escapa a continuar
goto put ;si no repite
return
;Rutinas de Tiempo
delay3
movlw d'26' ;se mueve al work register un 10 decimal
movwf cont3 ;el work register se mueve a cont3
D3
movlw d'41'
movwf cont2
call delay2 ;se llama a la subrutina delay2
decfsz cont3,f ;decrementa cont3, guarda el resultado directamente en el archivo y si cont3 llega a 0, la siguiente l�nea de c�digo no es ejecutada
goto D3 ;regresamos a la etiqueta D3
return ;RETORNAMOS AL PROGRAMA PRINCIPAL
delay2
D2
call delay1
decfsz cont2,f
goto D2
return
delay1
movlw d'11';
movwf cont1 ;
D1:
nop ; no operation, gasta tiempo de ejecucion.
decfsz cont1,f ; si no es cero no salta pero si es cero salta, estructura de desicion condicionada
goto D1 ; ejecuta
return
end
Espero que puedan sacarme del pequeño aprieto en el que estoy metido.
Muchas Gracias.