TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: raul1485 en 11 de Abril de 2007, 22:08:01
-
Saludos a todos loq ue estan aqui en el foro:
mi asunto es el siguiente estoy haciendo un proyecto de invernadero en el que necesito la comunacion serie asincrona del pic17f877a, dese transmitir y recibir hacia una pc. ya he logrado transmitir datos desde el PIC hacia la PC los h podido manejar a mi gusto.
Pero no he podido recibir datos de la PC al PIC, bueno si los recibo solo que mal, por ejemplo si mando una 'a' desde el hyperterminal no sale el dodigo ascci de dicha ´'a' que es un (65h), si no u sal oo numo como un 124h algo asi, otro problema es que si mando otra letra el programa como que se traba y tengo que resetear el pic para que buelva a recibir. si me pueden ayudar se los agradeceria.
bueno les mando el programa para que me digan cual es el problema:
la comunicaionn es a 300 baudios con un crital de 4mHz estoy utilizando el max232 y la transmicion funciona pérfectamente solo
la recepcion no.
;***********************************************************
list p=16f877A
#include<p16f877A.inc>
__CONFIG _CP_OFF & _CPD_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _LVP_OFF & _XT_OSC
org 0x00
nop
nop
bsf STATUS,RP0 ;Ir banco 1
bcf STATUS,RP1
clrf TRISA ;PORTA salida
clrf TRISB ;PORTB salida
clrf TRISC ;PORTC salida
clrf TRISD ;PORTD salida
clrf TRISE
bsf TRISC,7 ;RC7/Rx entrada, pin de recepción
movlw d'207' ;300 baud rate Xtal=4Mhz
movwf SPBRG
bcf TXSTA,BRGH ;Selección de baja velocidad
bcf TXSTA,SYNC ;Modo asíncrono
bcf STATUS,RP0 ;Ir banco 0
bcf STATUS,RP1
bsf RCSTA,SPEN ;habilita el puerto serie
bcf RCSTA,RX9 ;8 Bits de datos
bsf RCSTA,CREN ;Para Rx Continuo
_espera
btfss PIR1,RCIF ;Pregunta si el buffer de RX es full
goto _espera ;No, ir _espera
movf RCREG,W ;Si, W=RCREG y pone a cero el RCIF
movwf PORTB
goto _espera
end
-
En los pics 16F, debes poner los bit TRISC<6:7> ambos en uno para configurarlos como usart.
También revisa el tema del baudeaje. Realmente quieres transmitir a 300 bps? Configuras la misma velocidad en la pc?
-
Hola Maunix:
en cuanto a la configuracion de la PC esta configurada correcta menete a 300 baudios desde el hyperterminal de windows,
ademas de que como he dicho la transmicion PIC-PC ya esta lograda incluso con un programa similar a este.
en cuanto a los pines TRESC<6 7> esta configurado el pin 6 como salida y el pin 7 como entrada como puedes ver en el programa ya que el pin 7 es la entrada a al recepcion.
-
Hola Raul ¿Se ha de poner el bit de salida (trisc)a 0?, al leer tu configuración recordé algo que me paso como a ti y encontré esto:
The USART can be configured in the following modes:
• Asynchronous (full duplex)
• Synchronous - Master (half duplex)
• Synchronous - Slave (half duplex)
Bit SPEN (RCSTA<7>) and bits TRISC<7:6> have
be set in order to configure pins RC6/TX/CK and
RC7/RX/DT as the Universal Synchronous Asynchronous
Receiver Transmitter.
A mi el problema se soluciono colocando los 2 bits de configuración (trisc) tal y como dice el datasheet (pag. 97) en 1.
Suerte y un saludo.
-
Vayadespiste, gracias por el aporte. Eso mismo le estaba diciendo yo... pero viene bien la referencia al datasheet.
raul1485, revisa además el bit RCSTA,OERR , si está seteado debes apagar y reencender el módulo usar, sino dejará de recibir datos.
-
MAUNIX Y VAYADESPISTE, gracias por su aportacion la verdad ya resolvi ese detalle que tenia. Ahora el problema es que no recibo los mismos datos.
Por ejemplo si mando una 'A' desde el hyperterminal me manda un 15d en el el pic y si le vuelvo a mandar una 'A' me manda otro numero aleatorio y asi se la pasa y nunca me manda el 65h que es en realidad el codigo ASCII de la 'A' rara vez repite un mismo numero. Aunque ahora si ya no se me traba el programa como antes gracias a esa configuracion que me mandaron, no se que pueda ser si me pueden dar una pista o mandar un programa que funcione se los agradeceria. Ahi les va el programa:
list p=16f877A
#include<p16f877A.inc>
__CONFIG _CP_OFF & _CPD_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _LVP_OFF & _XT_OSC
org 0x00
nop
nop
bcf STATUS,RP0 ;Ir banco 0
bcf STATUS,RP1
bsf RCSTA,SPEN ;habilita el puerto serie
bsf STATUS,RP0 ;Ir banco 1
bcf STATUS,RP1
bsf TRISC,7 ;RC7/Rx entrada, pin de recepción
bsf TRISC,6 ;
clrf TRISA ;PORTA salida
clrf TRISB ;PORTB salida
clrf TRISD ;PORTD salida
clrf TRISE
movlw d'207' ;300 baud rate Xtal=4Mhz
movwf SPBRG
bcf TXSTA,BRGH ;Selección de baja velocidad
bcf TXSTA,SYNC ;Modo asíncrono
bcf STATUS,RP0 ;Ir banco 0
bcf RCSTA,RX9 ;8 Bits de datos
bsf RCSTA,CREN ;Para Rx Continuo
_espera
btfss PIR1,RCIF ;Pregunta si el buffer de RX es full
goto _espera ;No, ir _espera
movf RCREG,W ;Si, W=RCREG y pone a cero el RCIF
movwf PORTB
goto _espera
end
-
Tengo un problema similar, adjunto el código que he hecho para enviar datos desde el hyperterminal. Enciendo un led primero como garantía de que el pic se ha programado. Luego envío el caracter desde hyperterminal, el led se apaga al recibir, y tras un segundo saca por los led de PORTB el código ASCII. Eso es al menos, lo que pretendo, ya que todo va bien excepto que en los leds siempre se muestra el mismo código, independiente mente de la tecla que pulse en hyperterminal.
EL hardware va bien, lo fue en la operación de TX, es un entrenador PICTrainer.
PB_SALIDA
Banco_1
;Configuración de la puerta C
;*******************************
movlw b'11111111'
movwf TRISC ;RC7/Rx entrada, RC6/Tx salida?
;Configuración USART:
;*******************************************
bcf TXSTA,BRGH ;Velocidad baja
movlw .25 ;5 para reloj de 3,686MHz
movwf SPBRG ;9600 baudios con Fosc=4MHz
bcf TXSTA,SYNC ;Selecciona modo asíncrono
Banco_0
;Habilitación puerto serie
;*************************
bsf RCSTA,SPEN
;Habilita recepción
;********************
bsf RCSTA,CREN
;*********************PROGRAMA PRINCIPAL***********************
;**************************************************************
inicio2 clrf PORTB
bsf PORTB,0
call Recepcion
bcf PORTB,0
call delay_1s
movwf PORTB
call delay_1s
goto inicio2
;*****************************************************************
;* SUBRUTINAS *
;*****************************************************************
Recepcion btfss PIR1,RCIF
goto Recepcion
RX_Ok movf RCREG,W
movwf dato
return
-
Ya encontré el fallo, error de principiante, el valor cargado en SPBRG no era el de 9600. Gracias de todos modos.