TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: parsud en 27 de Abril de 2006, 12:42:34
-
HOLA AMIGOS DEL FORO, NO SE PORQUE PERO NO PUDE INGRESAR AL FORO A TRAVES DE MI NOMBRE YA REGISTRADO COMO NEOSUD, PERO YA ENTRE COMO PARSUD.
ESTOY LEYENDO LOS DATOS Q SON ENVIADOS DESDE UNA PC A TRAVES DEL PROGRAMA PROCOM PLUS, PARA LO CUAL UTIULIZO UN PIC16F876A CON UN XTAL DE 20MHZ, EL PROGRAMA FUNCIONA BIEN CUANDO SE TRATA DE ENVIAR 1, 2 O 3 CARACTERES A LA VEZ ES DECIR SI ENVIO EL DATO 3 O 45 ESTE LLEGA AL PIC Q EN VERDAD LLEGAN 2 Y 3 DATOS RESPECTIVAMENTE YA Q PRESIONO LA TECLA ENTER PARA Q SE ENVIE Y ESTE CONSTITUYE UN DATO TAMBIEN, HASTA EL PROGRAMA TRABAJA BIEN PERO CUANDO ENVIO DATOS COMO 234 O 6789, EL PIC SOLO LEE LOS 3 PRIMEROS DIGITOS Y LO DEMAS NO LO RECEPCIONA, ES MAS SI DESPUES DE RECIBIR EL TERCER DATO NO LE AGREGO ALGUNAS LINEAS MAS DE LO Q TIENEN PARA LOS 2 PRIMEROS DIGITOS, EL PIC TERMINARIA NO FUNCIONANDO LA RECEPCION AUNQUE EL PIC SIGUE HACIENDO LO DEMAS SIN RECEPCIONAR LOS DATOS Q SE LE ENVIA.
ESTE PROBLEMA ME ESTA CAUSANDO DOLORES DE CABEZA Y NECESITO SOLUCIONARLO LO MAS PRONTO POSIBLE.
ACUDO A UDS YA Q DEBEN HABER PASADO POR SITUACIONES PARECIDAS, LES AGRADECERIA SI PUEDEN AYUDARME EN ESTE TEMA.
ESTE ES EL PROGRAMA Q HE REALIZADO:
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _LVP_OFF & _DEBUG_OFF & _CPD_OFF
;9600 BAUDIOS
;EL PROCOM PLUSS ESTA CONFIGURADO PARA Q TABAJE A ESA VELOCIDAD Y SOLO LO UTILIZO
;PARA ENVIAR DATOS AL PIC
LIST P=16F876A, W=1
INCLUDE "P16F876A.INC"
CBLOCK 0X20
DELAY,TEMPORAL1,TEMPORAL,DIR_EE,VECES,TEMPORAL2
TEMPORAL3,TEMPORAL4,ESPIA,B_PORTA,VECES2
ENDC
ORG 0X00
GOTO INICIO
ORG 0X04
GOTO RECEPCION
ORG 0X05
INICIO
BSF STATUS,RP0
BCF STATUS,RP1
MOVLW B'0110'
MOVWF ADCON1
CLRF TRISA
CLRF TRISB
MOVLW B'10000000'
MOVWF TRISC
MOVLW B'0010'
MOVWF OPTION_REG
MOVLW .129
MOVWF SPBRG
MOVLW B'01101101'
MOVWF TXSTA
MOVLW B'11000000'
MOVWF INTCON
MOVLW B'00100000'
MOVWF PIE1
BCF STATUS,RP0
BCF STATUS,RP1
MOVLW B'11010000'
MOVWF RCSTA
CLRF PORTB
CLRF VECES
CLRF VECES2
EMPEZAR
BCF STATUS,RP0
BSF STATUS,RP1
MOVLW B'11000000'
MOVWF INTCON
MOVLW B'00100000'
MOVWF PIE1
BCF STATUS,RP1
MOVLW 0XEF
MOVWF PORTB
CALL RETARDO_1S
GOTO EMPEZAR
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
RECEPCION
INCF VECES2,1
MOVF VECES2,0
XORLW .1
BTFSS STATUS,Z
GOTO RX2?
GOTO RX1
RX2? MOVF VECES2,0
XORLW .2
BTFSS STATUS,Z
GOTO RX3?
GOTO RX2
RX3? MOVF VECES2,0
XORLW .3
BTFSS STATUS,Z
GOTO RX4?
GOTO RX3
RX4? MOVF VECES2,0
XORLW .4
BTFSS STATUS,Z
GOTO SALIR
GOTO RX4
RX1 BTFSS PIR1,5
GOTO RX1
NOP
MOVF RCREG,0
MOVWF TEMPORAL1
MOVLW 0XBF
MOVWF PORTB
CALL RETARDO_1S
BCF PIR1,RCIF
RETFIE
RX2 BTFSS PIR1,5
GOTO RX2
NOP
MOVF RCREG,0
MOVWF TEMPORAL2
MOVLW 0X86
MOVWF PORTB
CALL RETARDO_1S
BCF PIR1,RCIF
RETFIE
RX3 BTFSS PIR1,5
GOTO RX3
NOP
;.....................................................................................................
;TUVE Q PONER ESTAS LINEAS DE PROGRAMA SINO CUANDO ENVIO 4 DATOS LA RECEPCION QUEDA INHIBIDA AUNQUE EL
;PROGRAMA SIGUE FUNCIONANDO
BCF RCSTA,OERR
BCF RCSTA,CREN
BCF RCSTA,CREN
MOVF RCREG,0
MOVWF TEMPORAL3
CLRF RCSTA
CLRF TXREG
BSF STATUS,RP0
BCF STATUS,RP1
CLRF TXSTA
MOVLW B'01101101'
MOVWF TXSTA
BCF STATUS,RP0
MOVLW B'11010000'
MOVWF RCSTA
;.....................................................................................................
;.....................................................................................................
MOVF RCREG,0
MOVWF TEMPORAL3
MOVLW 0X87
MOVWF PORTB
CALL RETARDO_1S
BCF PIR1,RCIF
RETFIE
RX4 BTFSS PIR1,5
GOTO RX4
NOP
MOVF RCREG,0
MOVWF TEMPORAL4
MOVLW 0XE6
MOVWF PORTB
CALL RETARDO_1S
SALIR BCF PIR1,RCIF
CLRF VECES2
RETFIE
RETARDO_1MSP0
MOVLW .5
MOVWF DELAY
BUCLE2P0
CLRF TMR0
BUCLE1P0
MOVLW .10
SUBWF TMR0,0
BTFSS STATUS,Z
GOTO BUCLE1P0
DECFSZ DELAY,1
GOTO BUCLE2P0
RETURN
RETARDO_1S
BSF STATUS,RP0
MOVLW B'0101'
MOVWF OPTION_REG
BCF STATUS,RP0
MOVLW .250
MOVWF DELAY
SALTO2A
CLRF TMR0
SALTO1A
MOVLW .180
SUBWF TMR0,0
BTFSS STATUS,Z
GOTO SALTO1A
DECFSZ DELAY,1
GOTO SALTO2A
BSF STATUS,RP0
MOVLW B'0010'
MOVWF OPTION_REG
BCF STATUS,RP0
RETURN
RETARDO_1S_
BSF STATUS,RP0
MOVLW B'0101'
MOVWF OPTION_REG
BCF STATUS,RP0
MOVLW .63
MOVWF DELAY
SALTO2A_
CLRF TMR0
SALTO1A_
MOVLW .13
SUBWF TMR0,0
BTFSS STATUS,Z
GOTO SALTO1A_
DECFSZ DELAY,1
GOTO SALTO2A_
BSF STATUS,RP0
MOVLW B'0010'
MOVWF OPTION_REG
BCF STATUS,RP0
RETURN
END
ESPERO PUEDAN AYUDARME CON UN EJEMPLO Q HAYAN HECHO, NECESITO Q PUEDA RECIBIR DATOS COMO: M23456736 O HOLA, MASTER, ESCLAVO, RUYGFJKNGNDKL,ETC
SALUDOS
-
Hola.
MOVLW B'01101101'
MOVWF TXSTA
Estas utilizando 9 bits de recepcion(bit 6=bit de paridad) Cuidado con esto..Si estas usando esta configuracion, asegura que el programa de PC envie el bit de paridad(noveno bit), sino se te va a producir una desincronizacion en la recepcion de datos.
MOVF RCREG,0
MOVWF TEMPORAL1
MOVLW 0XBF
MOVWF PORTB
CALL RETARDO_1S
Mire a simple vista el programa, y esta parte puede ser conflictiva.Estas llamando a un retardo de 1 segundo luego de leer el dato.Si el programa de PC sigue enviando los restantes datos mientras el programa esta dentro de RETARDO_1S, el buffer se desborda, y comenzaras a perder los datos...
Otra cosa: ¿como estas enviando los datos desde el programa de PC? ¿como byte o como caracter? un dato como 6789 enviado como byte tendria una longitud de 2 bytes, mientras que enviado como caracter, su longitud seria de 4 bytes.
Exitos!
-
GRACIAS POR SU RESPUESTA, ES ALGO Q TENDRE Q REVIZAR, YA ESTARE COMENTANDOLE AL RESPECTO COMO ME FUE.
CON RESPECTO A LO Q ES COMUNICACION SERIAL DE PC A PIC, TENGO DOS TARJETAS IGUALES Q RECEPCIONAN DATOS ENVIADOS DESDE UN PROGRAMA HECHO EN VISUAL BASIC, ESTE PROGRAMA EN VISUAL BASIC PERMITE ENCENDER UNOS LEDS EN CADA MODULO, UNO DE LOS MODULO LO ROTULO COMO ESCLAVO1 Y EL OTRO COMO ESCLAVO 2, ENTONCES CADA VEZ Q EN PROGRAMA DEL VB SELECCIONO EL ESCLAVO 1 LOS DATOS SON RECEPCIONADOS POR AMBAS TARJETAS PERO SOLO UNO DE ELLOS ACTIALIZA SUS LEDS DEPENDIENDO DEL VALOR Q SE ENVIE, DE FORMA SIMILAR ES CON EL OTRO ESCLAVO, LAS TARJETAS FUNCIONAN BIEN CUANDO ESTA LA PC Y UNO DE LOS ESCLAVOS, PERO CUANDO CONECTO LOS DOS ESCLAVOS AL PUERTO SERIE EL DATO LLEGA A AMBAS TARJETAS PERO SOLO UNO DE ELLOS ACTUALIZA SUS LEDS CUANDO PREVIAMENTE SE LE HA SELECCIONADO MIENTRAS Q CUANDO SELECCIONO EN VB EL OTRO MODULO ESTE NO ACTUALIZA NADA.
MI PREGUNTA ES: ES POSIBLE EN RS232 HACER ESTO DE CONECTAR DOS TARJETAS A TRAVES DEL PUERTO SERIAL O SE ESTA SOBRECARGANDO EL PUERTO.
SE PUEDE HACER UNA INTERFACE PARA SOLUCIONAR DE ALGUNA MANERA ESTE PROBLEMA.
EL PROGRAMA EN EL PIC NO SOLO RECEPCIONA EL DATO SINO Q TAMBIEN LO ENVIA A LA PC PARA Q EL PROGRAMA EN VB ACTUALISE SUS CARGAS.
EL PROGRAMA FUNCIONA PERFECTO SI SOLO LE CONECTO UN ESCLAVO PERO CON LOS DOS SOLO RECEPCIONA BIEN AQUEL ESCLAVO Q PRIMERO RECIBE EL DATO PERO PARECE Q NO LO ENVIA DE VUELTA A LA PC YA Q EL VB NO ACTUALIZA SUS CARGAS.
AGRADECIA SI ME PUEDEN AYUDAR CON ESTE DILEMA.
YA LES ESCRIBIRE PARA COMENTARLES COMO ME FUE CON EL PROGRAMA ACTERIOR.
SALUDOS
-
Hola parsud, he leído tu post y en fín no quiero entrar donde no me llaman pero:
yo primero me aseguraría si utilizas un activex en visual de que está por ejemplo
en 19200,8,n,1 sin protocolo (por ejemplo)
Yo utilizo normalmente el 18F8720 y ultimamente el dsPIC 30F6014, así que no
puedo aydarte demasiado la verdad pero, yo lo que haría es un pequeño programa de
pruebas, muy muy pequeño.
Y por último vigila el típico error de principiantes:
Haz una subrutina del tipo MIraroverrun()
bcf RCSTA,CREN
bsf RCSTA,CREN
(esto último quita el error) este error inhibe el buffer.
:(