Hola que tal, les cuento que estoy haciendo un proyecto y ya hacen 2 semanas que vengo trabado en la parte de la comunicación Usart del Pic 18f452 con Matlab mediante usart. Para la comunicación utilizo un MAX 232 y un cable Adaptador Usb A Serie Rs-232. Aquí les pongo el código que tengo hasta ahora y la simulación en Proteus (ah para simular los puertos uso el Virtual Serial Port Driver). Lo que sucede es que por ejemplo envio '10101010' y recibo 240-240...-240 en Matlab, y si pongo '10010011' tambien recibo el mismo numero o no recibo nada, en fin, anda mal. La rutina que utilizo en Matlab para recibir los datos también se las adjunto.
En Matlab:
s=serial('COM2')
open(s)
read(s)
Y ES AQUÍ DONDE ME DEVUELVE 240-240-240 .. o si pongo read(s,'int8') me devuelve -16,-16,-16...
Aquí está el programa en assembler:
list p=18F452
#include <p18f452.inc>
;Code Protection Deshabilitado
CONFIG CP0=OFF
;Oscillator switch deshabilitado. Oscilador tipo HS. PLL desactivado
CONFIG OSCS=OFF, OSC=HS
;Brown-OutReset enabled, Voltage de Brown Out es 2.5V
CONFIG BOR=OFF, BORV=25
;Watch Dog Timer Habilitado, Watch Dog Timer PostScaler 1:128
CONFIG WDT=OFF, WDTPS=128
;Low Voltage Programming Deshabilitado
CONFIG LVP=OFF
;CCP2 pin Mux enabled
CONFIG CCP2MUX=ON
;Stack over/underflow Reset Habilitado.
CONFIG STVR=ON
;*******************REGISTROS UTILIZADOS PARA EL RETARDO***********************************************************
PDel0 equ 0x0C ; Seleccionamos posicion en la memoria RAM (GPR) para guardar
; registro utilizado para demora.-
PDel1 equ 0x0D ; Registro utilizado en demora.-
PDel2 equ 0x0E
;*********************************************************************************************************************
TEMPVAR equ 0x00 ;En Banco 0.
org 0x0000
_BOOT:
goto _INICIO
org 0x00A0
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ AQUÍ COMIENZA EL PROGRAMA PRINCIPAL++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
_INICIO:
movlw b'10111111' ;TRISC<6> como salida de USART (en los 18F es así)
;y TRISC<7> en 1, para ser configurados como pines USART
movwf TRISC
;defino I/O del puerto B
movlw b'00000000' ; todos los pines del Puerto B como salidas
movwf TRISB
;---------------------------------------------------------------------------------
; Configuración USART Transmisor
;---------------------------------------------------------------------------------
movlw .64 ;clock 10000, 9600 bps y brgh high - pll apagado
movwf SPBRG
movlw b'00100100' ;brgh=high, es el bit 2 , TXEN=on , SYNC = 0
movwf TXSTA
movlw b'10000010' ;Habilita la USART en modo USART
movwf RCSTA
movlw b'00000010' ;Habilita el pin RC6=Tx t RC7=Rx
movlw TRISC
ciclo:
bsf PORTB,RB4 ;pongo RB4 en uno, prendo el led
bcf PORTB,RB2
call DEMORA ;aplico un retardo
bcf PORTB,RB4 ;pongo RB4 en cero, apago el led
;-----------------Transmite una palabra al buffer de la USART-----------
movlw b'10101010'
movwf TXREG
call DEMORA ; es un retardo de 1 segundo aproximadamente
goto ciclo ;VUELVO A CICLO (CICLO INFINITO)
;---------------------------------------------------------------------------------
; Configuración USART Receptor (ESTE ESTÁ FUERA DEL CICLO PORQUE TODAVIA NO LO USO, QUERIA PRIMERO PROBAR EL ENVIO DE DATOS DEL PIC A MATLAB Y ;RECIEN DESPUES LA RECEPCIÓN)
;---------------------------------------------------------------------------------
; movlw b'00000000'
; movwf RCSTA
; bsf RCSTA,SPEN ;SPEN = 1 habilita el puerto serie, con recepcion continua
;
; call _USARTCLEAR
; bsf RCSTA,CREN ;Habilita Usart. Recepción Continua
;
;
;_USARTLOOP:
; btfss PIR1,RCIF ;Espera próximo caracter
; goto _USARTLOOP
;
; btfsc RCREG,OERR
; call _USARTCLEAR ;Error de Sobreescritura
; btfsc RCREG,FERR
; call _USARTCLEAR ;Error de Trama
;
; movff RCREG,TEMPVAR
; btfsc PIR1,TXIF ;Con esto garantizo que si el buffer está ocupado
; ;no será sobreescrito. Se recibe el caracter pero no se responde.
; movwf TXREG
; goto _USARTLOOP
;
;
;_USARTCLEAR
; bcf RCSTA,CREN
; movf RCREG,w
; movf RCREG,w
; movf RCREG,w ;Vacío buffers de usart
; bsf RCSTA,CREN
; return
;
;***********************Retardo*******************
DEMORA movlw .14 ; 1 set numero de repeticion (C)
movwf PDel0 ; 1 |
PLoop0 movlw .72 ; 1 set numero de repeticion (B)
movwf PDel1 ; 1 |
PLoop1 movlw .247 ; 1 set numero de repeticion (A)
movwf PDel2 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
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
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
;----------------------------------------
end
Aquí está el diseño en Proteus:
Espero puedan ayudarme, muchisimas gracias!!