Hola a todos. Os comento:
Estoy haciendo mi primer proyectillo con un 16f873, es la primera vez que toco esto de los PIC, antes he usado el motorola 68000 para la facultad y eso.
Bueno al tema. He simulado todo el progrma con el MPLab, aunnque no he utilizado ningun include de definiciones ni nada de lenguaje de alto nivel, pues me resulta más sencillo trabajar con el Datasheet, mis definiciones y un editor de texto. Bien, como os decía he simulado y todo me funciona como deseo.
Mi problema se halla al intentar proramar el PIC,( uso un TE20 y el ICProg), que en la verificacion de la programacion me da un fallo en la direccion 0000h. He mirado, remirado, leido y releido tropecientos manualistos del ICprog, y todas las cosas al respecto. Nada de nada!!
La verdad es que ahora estoy hecho un lio del copon!, he perdido el concepto Memoria de datos y de programa. Si en el simulador todo funciona, ha de funcionar luego, no?. Si fuera por un error en los bancos de memoria.... como seleciono dnd escribir k cosas??? Ahora os puedo asegurar que estoy más perdido que al principio del asunto.
Acabo de programarlo tb directamente en la placa como aparece en
http://www.pacalaconcurso.com/, y nanai de la china. Persiste el error.
Sin embargo si he observado que si abro el ICprog solo (con todos los valores a F) y programao eso, sí se programa OK. Sin embargo al programarle mi codigo y hacer una posterior lectura, aparece un cosigo que nada tiene que ver con el mio.
Aki os expongo mi codigo:
;Mediante este programa pretendo mandar una serie de mensajes
; al hyperterminal de windows mediante el puerto serie, tras una
; posterior conversion mediante un max232. Solo son de envio,
; no pretendo tener en cuenta la respuesta del mismo.
;
;Solo hay 8 posibles mensajes, indicados por el bit activo
; que se le pasa a la subrutina CMD mediante W_REG
;
;
; Por favor, echadle un vistazo a ver si me podéis decir si
;algo esta mal. He quitado muchas cosas para que no ocupe mucho
;y se haga tedioso, pues son datos sin importancia.
;
; Agradecería tambien si alguien me pudiera aclarar lo de
;como situar unos datos en mem de programa y mem de datos, o
;es k lo hace automático en ensamblador?? Es que ya estoy muy
;liado.
; Gracias de antemano a todos. Un Saludo
;
LIST P=16F873
;
;DECLARACION DE REGISTROS
;
PCL EQU 02h ;Indirecciomiento
PORT_A EQU 05h ;Puerto A
PORT_B EQU 06h ;Puerto B
PORT_C EQU 07h ;Puerto C
STATUS EQU 03h ;Registro de Estado
TRISA EQU 85h ;Configuracion puerto A
TRISB EQU 86h ;Configuracion puerto B
TRISC EQU 87h ;Configuracion puerto C
INTCON EQU 0Bh ;Registro interrupciones
OPTION_R EQU 81h
PIE1 EQU 8Ch ;Interrupciones
PIR1 EQU 0Ch ;Flags varios
TXSTA EQU 98h ;Registro Status Transmision
RCSTA EQU 18h ;Registro Status Recepcion
SPBRG EQU 99h ;Baud Generator
TX EQU 19h ;Registro de Transmision
;-------------------------------------------------------------------------------------------
;VARIABLES DE PROGRAMA
;
PTR EQU 20h ;Para recorrer tablas de Comandos
COMANDO EQU 21h ;Variable Aux. para saber que comnado tomar
EOC EQU 22h ;End Of Command?
CMD_AUX EQU 23h ;Varble aux comando introducido
W EQU 0
F EQU 1
;--------------------------------------------------------------------------------------------
;
;MEMORIA DE PROGRAMA [RAM] [Llamemoslo X]
;
;Vectores
ORG 00h
GOTO MAIN
ORG 04h
GOTO RTI
MAIN:
;Deshabilitamos todos los flags e interrupciones
BCF STATUS,6 ;Banco 0
BCF STATUS,5
CLRF INTCON
CLRF PIR1
BSF STATUS,5 ;Banco 1
CLRF PIE1
;Configuramos puertos
BSF STATUS,5 ;Banco 1
MOVLW B"00000000"
MOVWF TRISA ;Salida
MOVLW B"00000001"
MOVWF TRISB ;Salida / Interrupcion Externa
MOVLW B"11000000"
MOVWF TRISC ;Puerto serie
;Configuramos UART
CALL UARTINIT
;Habilitamos interrupciones
BSF STATUS,5 ;Banco 1
BSF OPTION_R,6 ;INT por flanco de subida
BCF STATUS,5 ;Banco 0
BSF INTCON,7 ;GIE
BSF INTCON,4 ;INT Externa
LOOP ;SLEEP
NOP
NOP
NOP
MOVLW B"00000001"
CALL CMD
GOTO LOOP
;-------------------------------------------------------------;
;RUTINA DE TRATAMIENTO DE INTERRUPCION
;
RTI
BTFSC INTCON,1 ;Interrupcion Externa?
GOTO RTI_S ;Si -->RTI_S
;No -->fIN
RETFIE
;---------------------------------------------------;*SUBPROGRAMAS*
;---------------------------------------------------
UARTINIT:
;Inicializacion de la UART
BSF STATUS,5 ;Banco 1
MOVLW 19h ;25 en decimal
MOVWF SPBRG ;Para 4MHz
BSF TXSTA,2 ;HI-SPBRG
BSF TXSTA,5 ;TX activo
BCF STATUS,5 ;Banco 0
BSF RCSTA,7 ;Puerto serie ON
BSF STATUS,5 ;Banco 1
BCF PIE1,4 ;Interrupcion TX OFF
RETURN
;------------------------------------------------
RTI_S:
MOVLW B"00000001" ;BIT 0 --> CMD0
CALL CLAXON
CALL LUCES
CALL CMD
BCF INTCON,1 ;Limpiamos Flag interrupcion externa
RETURN
;-------------------------------------------------------------------------------------------
CMD: ;Envia el comando cargado en el Acumulador [0 CMD0, 1 CMD1, 2 CMD2....]
CLRF PTR ;Inicializamos puntero despl.
MOVWF CMD_AUX ;Guardamos el Comando pasado
NX_CHR MOVF PTR,W ;Puntero despl. a W
BTFSC CMD_AUX,0
CALL CMD0
GOTO X1
X1 BTFSC CMD_AUX,1
CALL CMD1
GOTO X2
X2 BTFSC CMD_AUX,2
CALL CMD2
GOTO X3
X3 BTFSC CMD_AUX,3
CALL CMD3
GOTO X4
X4 BTFSC CMD_AUX,4
CALL CMD4
GOTO X5
X5 BTFSC CMD_AUX,5
CALL CMD5
GOTO X6
X6 BTFSC CMD_AUX,6
CALL CMD6
GOTO X7
X7 BTFSC CMD_AUX,7
CALL CMD7
ADDLW 0 ;Si W=0 --> Z=1
BTFSC STATUS,2 ;Z=0 ?
RETURN ;Si -->Ultimo chr del comando
CALL SEND_CHR ;No -->Quedan chrs por tx en el comando
INCF PTR,F ;Incrementamos PTR despl.
GOTO NX_CHR
;-------------------------------------------------------
SEND_CHR: RETURN
;Envia caracter cargado en W
SEND_LOOP NOP
BSF STATUS,5 ;Banco 1
BTFSC TXSTA,1 ;TSR lleno?
GOTO SEND_LOOP ;Si ->Se esta trasmitiendo otro-> Esperar
BCF STATUS,5 ;Banco 0
MOVWF TX ;No ->Carga el caracter para Tx
RETURN
;---------------------------;
; TABLAS
,---------------------------;
TABLA0 ADDWF PCL,F
RETLW 45h
RETLW 40h
...................
...................
RETLW 13h ;<CR>
RETLW 00h
TABLA1 ADDWF PCL,F
RETLW ........
RETLW 00h
TABLA2 ADDWF PCL,F
RETLW......
......
.......
END