TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: akira_ve en 28 de Agosto de 2007, 01:45:26
-
Amigo necesito un programa en asm para enviar datos a una PC, serialmente, pues es lo que mehe leido falta de un proyecto, he leido manuales, he encontrado programas en internet que usan el modulo USART del pic no logro hacerlo funcionar.
Uso el MPLAB Ver 5.7 y el el PIC SIMULATOR 5.02 un programa que probe es este.....y no me funciono, muy apesar que lo encontre en muchas paginas, esta hecho para 16F628 pero igual no me funciono es adaptable al 16F877..........que hago mal para que no funcine???, de ante mano gracias
;*******************************************************************
; INTERFAZ SERIE RS232 - ECO Y DISPLAY EN LEDS
; CONVERTIDOR SERIE RS232 - PARALELO 8 BITS
;*******************************************************************
LIST P=16F628, R=DEC ; Usar el PIC16F628 y sistema decimal
#include "P16F628.INC" ; Incluye datos de PIC16F628A
__CONFIG _CP_OFF & _WDT_OFF & _LVP_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF
;*******************************************************************
; CONFIGURACION
;*******************************************************************
; El PIC es configurado para usar todas las entradas y salidas
; posibles = 16. Por eso no se usa el oscilador con cristal externo,
; lo que deja libres las patas 15 y 16 para usar como bits de puerto.
; Se define el clock interno a 4 MHz. No se usa el master reset
; (pata 4), que queda convertida en el puerto A, bit 5 (entrada).
;*******************************************************************
; VARIABLES
;*******************************************************************
contador EQU 0x28 ; variable
dato_serie EQU 0x29 ; dato serie desde la PC
;*******************************************************************
ORG 0x000 ; El programa empieza en 0x000
;*******************************************************************
; Inhibe comparadores
;*******************************************************************
movlw 7
movwf CMCON ; CMCON=7 inhibir los comparadores
;*******************************************************************
; Inicializar Ports
;*******************************************************************
movlw b'00000000' ; valor inicial portA
movwf PORTA
movlw b'00000000' ; valor inicial portB
movwf PORTB
bsf STATUS, RP0 ; Pág 1 RAM
movlw b'00000000'
movwf TRISA ; salidas (para mostrar el dato en LEDS)
; de estas salidas, no usaremos
; PORTA 4, que tiene salida open drain, y
; PORTA 5, que sólo puede ser entrada
movlw b'11001011' ; RB0 entrada
; RB1 (RX) = entrada
; RB2 (TX) = salida
; RB3 = entrada
; RB2 = salida del bit 4 del dato a LEDS
; RB5 = salida del bit 5 del dato a LEDS
; RB6 y RB7 = entradas
movwf TRISB
;*******************************************************************
; BAUD RATE para la comunicación RS232
; y otras definiciones para USART
;*******************************************************************
; Baud Rate = 9600, Sin Paridad, 1 Bit parada
;
movlw 0x19 ; 0x19=9600 bps (0x0C=19200 bps)
movwf SPBRG
movlw b'00100100' ;
movwf TXSTA ; habilita la transmisión Async
bcf STATUS, RP0 ; RAM PAGE 0
movlw b'10010000' ; habilita de recepción Async
movwf RCSTA
;*******************************************************************
; TIEMPO DE ESTABILIZACION
;*******************************************************************
clrf contador
estab decfsz contador,F
goto estab
movf RCREG, W
movf RCREG, W
movf RCREG, W ; vacía el buffer de recepción
call Bienvenida ; envía mensaje de bienvenida
;*******************************************************************
; LAZO PRINCIPAL
;*******************************************************************
loop
clrw
btfss PIR1, RCIF ; (5) se fija si hay dato RS232
goto loop ; no, no llegó
call recibeRS232 ; sí, hay
movwf dato_serie ; guarda dato (para uso de cualquier rutina)
call enviaRS232 ; envía el eco a la PC
call muestra ; muestra el caracter recibido en LEDS
goto loop
;***********************************************************************************
; RECIBE CARACTER SERIE - RS232 - DESDE LA PC
;***********************************************************************************
recibeRS232
movf RCREG, W ; guarda dato recibido en acumulador
return
;***********************************************************************************
; ENVIA CARACTER SERIE - RS232 - A LA PC Y ESPERA A QUE HAYA SALIDO
;***********************************************************************************
enviaRS232
movwf TXREG ; envío el dato en acunulador w
bsf STATUS, RP0 ; Pág 1 RAM
Espere btfss TXSTA, TRMT ; transmision completa si es alto
goto Espere
bcf STATUS, RP0 ; Pág 0 RAM
return
;***********************************************************************************
; MUESTRA DATO
;***********************************************************************************
muestra
movf dato_serie,w ; recupera el dato guardado
movwf PORTA ; exhibe el dato en LEDS en PORTA
btfss dato_serie,4 ; pero, como el PORTA tiene el bit 4 que es
bcf PORTB, 4 ; open drain, nos conviene poner
btfsc dato_serie,4 ; el bit 4 del dato en otra salida;
bsf PORTB, 4 ; lo hacemos en el bit 4 del PORTB.
btfss dato_serie,5 ; y , como el PORTA tiene el bit 5 que es
bcf PORTB, 5 ; sólo usable como entrada, tenemos que poner
btfsc dato_serie,5 ; el bit 5 del dato en alguna salida;
bsf PORTB, 5 ; lo hacemos en el bit 5 del PORTB.
return
;***********************************************************************************
; MENSAJES
;***********************************************************************************
Bienvenida
; los primeros caracteres 0x00 son
; para estabilización del circuito
movlw 0x00
call enviaRS232
movlw 0x00
call enviaRS232
movlw 0x00
call enviaRS232
movlw 0x00
call enviaRS232
movlw 0x00
call enviaRS232
call msgCR
movlw 'H'
call enviaRS232
movlw 'o'
call enviaRS232
movlw 'l'
call enviaRS232
movlw 'a'
call enviaRS232
movlw ' '
call enviaRS232
movlw 'a'
call enviaRS232
movlw 'm'
call enviaRS232
movlw 'i'
call enviaRS232
movlw 'g'
call enviaRS232
movlw 'o'
call enviaRS232
msgCR
movlw 0x0D
call enviaRS232
movlw 0x0A
goto enviaRS232
END
-
Cuando tengas comunicaciones mayores a 2400 BPS, obligadamente deberas usar un oscilador externo, ya que el interno varia demasiado como para utilizarlo en comunicaciones seriales serias... 8) 8)
Coincido con JC40 en que no necesitas estabilizar nada para comunicarte, lo que estas intentando es corregir los defectos del reloj interno, que es un circuito R/C con los desvíos propios en cuanto a frecuencia de oscilacion, entonces eso es lo que desincroniza en algun momento tu comunicacion.
Ponle el bendito cristal externo y veras como se solucionan tus problemas!!
Ademas este micro tiene USART, si la usas escribiras mucho menos codigo para hacer lo mismo.
Perdon no habia leido bien... :lol: :lol:
En cuanto al codigo, al menos esta bien comentado, el tema de la organizacion es practica pura. :mrgreen: :mrgreen:
-
Amigos como les dije anteriormente................ese programa lo tome de internet......y mi diseño tiene cristal de 4Mhz pienso subirlo a 10 pues quiero agregarles mas funciones al diseño....este programa lo descargar para aprender........
Si por favor pueden facilitarme uno que simplemente envie datos se los agradecera, solo necesito eso para hacer las primeras pruevas, no he avanzado mucho, le agradeceria es que dieran.....uno que en realidad funcione gracias....pues he leido el manual y no logro hacerlo funcionar, no pido mucho o si?????
-
Hola arika_ve
mira he revisado tu programa y debe funcionar sin problemas, la situación es que no he podido establecer contacto con el MAX232 y mi PC con el Hypertérminal, tengo un pequeño programa que lo hicimos funcionar en un laboratorio de programación de PICs, pero lo quiero hacer por mis propios medios y no lo he logrado aun, te adjunto el programa para que verifiques los parámetros de tu programa y verás que el tuyo debe funcionar
; PRUEBA DE TRANSMISION
LIST P=16F877
INCLUDE <P16F877.INC>
ORG 0000H
bsf STATUS,RP0 ; Banco-1
movlw .25
movwf SPBRG ; Vtx = 9600bps
movlw B'00100100'
movwf TXSTA ; Tx = 8 bits / TX-ON / BRGH=1
bcf STATUS,RP0 ; Banco-0
bsf RCSTA,SPEN ; SPEN=1
;-----------------------------------------------
REPITE
movlw 'P'
call TX_DATO
movlw 'E'
call TX_DATO
movlw 'R'
call TX_DATO
movlw 'U'
call TX_DATO
goto REPITE
;-----------------------------------------------
TX_DATO
bcf STATUS,RP0 ; Banco-0
movwf TXREG ; Inicia Tx
return
END
Espero que te sirva de algo, caso contrario si pudieras darme una manito con un circuito que hayas probado de MAX232 para copmunicarte entre el 877 y la PC para verificarlo con el mio y asi darnos la mano con estos programas???
LEONARDO_59
-
Amigo gracias por tu respues.....probe el programa pero nada pasa, yo uso el MPLAB 5.4, intale el 6.4 y cuando doy a generar el archovo .HEX el programa me da esto......
Deleting intermediary files... done.
Executing: "C:\Archivos de programa\MPLAB IDE\MCHIP_Tools\mpasmwin.exe" /q /p16F877A "Ptose.asm" /l"Ptose.lst" /e"Ptose.err"
Message[302] C:\DOCUMENTS AND SETTINGS\USUARIO\MIS DOCUMENTOS\DISEñOS\PTOSE.ASM 9 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] C:\DOCUMENTS AND SETTINGS\USUARIO\MIS DOCUMENTOS\DISEñOS\PTOSE.ASM 11 : Register in operand not in bank 0. Ensure that bank bits are correct.
Error[173] C:\DOCUMENTS AND SETTINGS\USUARIO\MIS DOCUMENTOS\DISEñOS\PTOSE.ASM 31 : source file path exceeds 62 characters (C:\DOCUMENTS AND SETTINGS\USUARIO\MIS DOCUMENTOS\DISEñOS\PTOSE.ASM)
Halting build on first failure as requested.
BUILD FAILED: Wed Aug 29 13:57:55 2007
no entiendo muy bien mensaje ademas le agregue una linea de comando para eliminar una advertensia..........que es
ERRORLEVEL -302
-
Hola akira.
Cambia de directorio el archivo .asm a ensamblar. El error surge porque la ruta al archivo excede los 62 caracteres.
Ejemplo: Corta el archivo C:\DOCUMENTS AND SETTINGS\USUARIO\MIS DOCUMENTOS\DISEñOS\PTOSE.ASM
y pegalo en C:\
-
Ok resolvi eso amigo................mil gracias, pero y disculpame.....no se usar muy bien este MPLAB, como se yo que el programa envia los datos serialmente???
-
el programa quedo asi ahora pero no se donde ver ...para corroborar que se envia serialmente......
; PRUEBA DE TRANSMISION
LIST P=16F877A
INCLUDE <P16F877A.INC>
ERRORLEVEL -302
ORG 0000H
bsf STATUS, RP0 ; Banco-1
movlw .25
movwf SPBRG ; Vtx = 9600bps
movlw B'00100100'
movwf TXSTA ; Tx = 8 bits / TX-ON / BRGH=1
bcf STATUS, RP0 ; Banco-0
bsf RCSTA, SPEN ; SPEN=1
;-----------------------------------------------
REPITE
movlw 'P'
call TX_DATO
movlw 'E'
call TX_DATO
movlw 'R'
call TX_DATO
movlw 'U'
call TX_DATO
goto REPITE
;-----------------------------------------------
TX_DATO
bsf STATUS,RP0 ; Banco-0
movwf TXREG ; Inicia Tx
return
END
-
con que programa pruevo los programas de comunicacion serial para el pic 16F877????
-
Podrias utilizar Proteus.
Saludos
-
con que programa pruevo los programas de comunicacion serial para el pic 16F877????
Si usas el MPSIM del MPLAB, podes habilitar la salida de usart a pantalla o a un archivo.
Vas al menú DEBUGGER; SETTINGS, y se abrirá la ventana de configuración.
Seleccionas el tab USART1 IO, y configuras la salida a pantalla o a archivo.
Salida a Pantalla
(http://www.maunix.com.ar/es/tutorial/images/mpsim_usartoutput_enable1.jpg)
Salida a Archivo
(http://www.maunix.com.ar/es/tutorial/images/mpsim_usartoutput_enable2.jpg)
-
Bueno, en definitiva encontre simularlo con el Proteus, no logre con el PIC Simulator IDE, pues tiene herramientas para trabajar con el Puerto USART, termine el diseño, estoy probandolo, gracias por la ayuda para mas efectividad del programa, le agregue una linea de codigo al programa, que se encarga de monitorear que el dato este totalmente enviado
btfss TXSTA, TRMT ;checa si el buffer de transmision
goto esp_e ;si esta ocupado espera
-
btfss TXSTA, TRMT ;checa si el buffer de transmision
goto esp_e ;si esta ocupado espera
Mira, no creo que esta sea la forma más óptima. Chequear el bit TMRT te garantiza que el dato se vació del buffer de salida, pero has desperdiciado el otro byte que puedes usar en el buffer.
Por eso te conviene siempre verificar el TXIF y de esa forma te aseguras siempre tener un byte esperando para ocupar la salida cuando el otro se vacíe y esto lo hará el pic en forma automática y una vez que sabes que es el último byte verificas el bit TMRT (solo si hace falta) . El chequeo del bit TMRT es muy útil si vas a usar ese pin para otras funciones o bien para verificar en forma fehaciente que has terminado de transmisitir el dato (por ejemplo en comunicaciónes half-duplex).
Saludos
-
Ok amigo, y para eso implica el uso de una interrupcion, disculpame soy un poco grafico, si colocas unas lineas...........pues lee algo rapido el manual ( en ingles por supuesto ) y no me quedo muy claro, pues tenia curiosidad de tu explicacion, pero no logre entender muy bien tu idea, disculpame pero soy nuevo con el 877, y disculpa la molestia.