# Comunicación PIC con Matlab mediante rs232



## babadito (Jun 21, 2010)

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: (AH EL RELOJ ES DE 10 MHZ)


```
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 10 Mhz, 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
```

Diseño en Proteus:


----------



## systemofadowm (Jun 6, 2011)

a mi me ocurrio algo parecido pero en simulacion, lo solucione configurando la frecuencia del cristal del pic, talves orto posible error este en la frecuencia en baudios, se puede configurar por matlab

PS=serial('COM1');
set(PS,'Baudrate',9600); % se configura la velocidad a 9600 Baudios
set(PS,'StopBits',1); % se configura bit de parada a uno
set(PS,'DataBits',8); % se configura que el dato es de 8 bits, debe estar entre 5 y 8
set(PS,'Parity','none'); % se configura sin paridad
set(PS,'Terminator','CR/LF');% “c” caracter con que finaliza el envío 
set(PS,'OutputBufferSize',1); % ”n” es el número de bytes a enviar
set(PS,'InputBufferSize' ,1); % ”n” es el número de bytes a recibir
set(PS,'Timeout',5); % 5 segundos de tiempo de espera

fopen(PS);


----------

