Buenas a todos de nuevo, espero que esta vez alguien me eche una mano, se que esto del asm esta en declibe pero seguimos quedando nostalgicos que todavía programamos en ello, bueno al lío....
El título lo dice todo.... al igual que mucha gente nos hemos pasado a la familia de los 18f jeje y estoy haciendo un programa que creo sencillo aunque por el contrario no termina de funcionar, ya he hecho bastantes cosillas con el usart de la familia 16f sin ningún problema, comunicaciones entre pics, comunicación con el pc en fin, pero con este micro no funciona, ante todo dar las gracias a PalitroqueZ por el post "Mi primeros pasos con el 18f4550" del cual me he ayudado para empezar con esta familia de micros....
Bueno os explico el programa.... tan solo pretendo establecer una comunicación con el pc por medio del usart, creo que es bastante sencillo y esta bien explicado, en principio configuro los puertos... los registros del usart... deshabilito los modulos que no voy a utilizar, enciendo y despues de un segundo apago el puerto D para saber que llego a la rutina de espera de interrupción, en esta rutina aprovecho para probar a mandar datos al pc, "aquí esta el primer fallo" que yo mando al pc un 31H(49 en decimal) el cual en ascii es un "1" lo conecto al hiperterminal y me aparece todo el rato un "elevado al cuadrado"(²) osease, que es como si yo estuviese mandando un FD(253 en decimal)
incomprensible pero es asi.........en esta rutina estoy hasta que mando un dato desde el ordenador, esto hace saltar la interrupción y bueno lo único que pretendo es que lo que yo le mando desde el ordenador me lo muestre en binario por el puerto D con unos leds que tengo conectados y la verdad aqui está el otro fallo, da igual la tecla que pulses si son números muestra un (11000000) y si mando letras (00111110)
incomprensible de nuevo...... tengo que decir que el puerto con el hiperterminal le configuro a 19200, bits de datos 8, paridad ninguna, bit de parada 1 y control de flujo ninguno(vaya, como lo tengo configurado en los registros del pic, o eso creo).
A continuación os pongo el programa para que le echeis un vistazo, a lo mejor es una tontería y estoy tan obcecado que no veo el fallo pero creo que no va a ser por no haberme leido y trasteado con los registros del pic para hacerlo funcionar pero nada.... no se pq manda ese dato cuando yo estoy poniendo que mande otro y tampoco se pq recibe eso......
List p=18F4550
#include "p18F4550.inc"
;configure a 20MHz crystal to operate at 48MHz
CONFIG FOSC = HSPLL_HS, PLLDIV = 5,CPUDIV = OSC1_PLL2,USBDIV = 2,PWRT = ON,BOR = SOFT, VREGEN = ON , WDT = OFF ,WDTPS = 1,MCLRE = ON,PBADEN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF
PDel0 equ 0x30
PDel1 equ 0x31
PDel2 equ 0x32
dato equ 0x33
org 0x00
goto inicio
;************************************************************************
;INTERRUPCION
;************************************************************************
org 0x04
Inter
btfss PIR1,RCIF ;Ha sido interrupción en la recepción ??
goto esperando ;No, falsa interrupción
bcf PIR1,RCIF ;Si, restaurar el flag de interrupción
movff RCREG, WREG ;Lee el dato recibido y lo pongo en W
movwf dato ;copio el dato a la variable dato
movff dato, PORTD ;muevo el dato al puerto D
nop
retfie;************************************************************************
;INICIO DEL PROGRAMA Y CONFIGURACION DE REGISTROS
;************************************************************************
inicio
clrf TRISA ; configuar el portA como salida
clrf TRISB
movlw b'10000000'
movwf TRISC ;RC7/Rx RC6/Tx usart activado
clrf TRISD
clrf TRISE
movlw b'00100100'
movwf TXSTA ;TX en On, modo asíncrono con 8 bits y alta velocidad
movlw .64
movwf SPBRG ;19200 baudios con Fosc=20MHz
movlw b'00000000'
movwf BAUDCON
bsf PIE1,RCIE ;Habilita interrupción en la recepción
bsf IPR1,RCIP ;prioridad alta a interrupción del usart
bsf RCON,IPEN ;habilita prioridad de interrupciones
movlw b'11000000' ;Activa interrupción de periféricos
movwf INTCON ;Activa interrupciones
movlw b'10010000'
movwf RCSTA ;USART en On, recepción contínua
;*********************************************************
; deshabilitación de modulos
;*******************************************************
clrf,ADCON0 ; desactiva el CAD
movlw 0xf
movwf ADCON1 ; todas digitales
;bcf INTCON,GIE ; desactiva interrupciones
movlw 0x7
movwf CMCON ;desactiva el modulo comparador
;clrf CVRCON ; desactiva el Vref del comparador
clrf SPPCON ; desactiva el modulo (SPP)
clrf SSPCON1 ; desactiva el modulo MSSP,SSPEN
bcf UCON,USBEN ; desactiva el modulo USB
bsf INTCON2,RBPU ; desactiva las resistencias en PORTB
;*******************************************************
call DEMORA ;esto es para ver durante dos segundos lo que manda el ordenador antes de borrar el puerto
call DEMORA
clrf PORTD
nop
movlw 0xff
movwf PORTD
call DEMORA
clrf PORTD
esperando ;rutina de espera en la cual se manda un caracter cada 2 segundos
movlw 0x31 ;Envia el caracter, valor hex
movwf TXREG ;del codigo ascii
COMP_TX
btfss TXSTA,TRMT ;comprueba si acabo de Tx.
goto COMP_TX
call DEMORA
call DEMORA
goto esperando
;************************************************************************
;RETARDO DE 1 SEGUNDO
;************************************************************************
DEMORA
movlw .165 ; 1 set numero de repeticion (C)
movwf PDel0 ; 1 |
PLoop0 movlw .41 ; 1 set numero de repeticion (B)
movwf PDel1 ; 1 |
PLoop1 movlw .147 ; 1 set numero de repeticion (A)
movwf PDel2 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
clrwdt ; 1 ciclo delay
decfsz PDel2, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (C)
goto PLoop0 ; 2 no, loop
return ; 2+2 Fin.
;************************************************************************
end
Espero encarecidamente que me echeis una mano pq es importante que este programa me salga, si no no voy a poder seguir adelante con el proyecto que tengo en mente...
1SAludo y Gracias.........