TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: elmasvital en 17 de Marzo de 2008, 15:22:02
-
Alguien me puede confirmar que dos pics se pueden conectar usando sus respectivas usart conectando Rx con el Tx del otro y viceversa? osea sin que medie un max232. Esto es posible verdad?
Esque estoy intentando hacerlos andar y no lo consigo.
1 saludo
-
Alguien me puede confirmar que dos pics se pueden conectar usando sus respectivas usart conectando Rx con el Tx del otro y viceversa? osea sin que medie un max232. Esto es posible verdad?
Esque estoy intentando hacerlos andar y no lo consigo.
1 saludo
Si, es 100% posible. Dime:
1. ¿qué problemas tienes?
2. ¿Qué pics usas?
3. ¿Como tienes configurado el módulo?
4. ¿Verificas si se enciende el bit RCSTA.OERR?
-
Efectivamente, como ya te confirma Mauricio. Yo lo tengo así en el proyecto que tengo entre manos, y comunico un dsPIC con un PIC a 115200bps sin intermediarios.
-
La conexión es un 2550 conectado a usb que recibe dos bytes desde el pc y tal cual lo envia por usart al 16f877a.
En el programa de 16f877a cuando se recibe algo levanta la bandera PIR1,RCIF de recepcion pero el registro RCREG está vacío.
La configuración en ambos es 9600 baudios sin paridad en recepción contínua.
Esta es la configuración de usart en el 16f877a (a 20mhz) que es el que creo que da problemas
;**************CONFIGURACIÓN DE REGISTROS PARA PREPARAR LA RECEPCIÓN E INTERRUPCIÓN**************
BANCO1
bsf TRISC,7 ;RC7/Rx entrada,
bcf TRISC,6 ;RC6/Tx salida.
movlw b'00000100' ;Para configurar USART
movwf TXSTA ;Se activa la alta velocidad de baudios
movlw d'32' ;Valor para configurar los baudios
movwf SPBRG ;Velocidad de transmisión a 9600 baudios
bsf PIE1,RCIE ;Se habilita la interrupción en recepción
BANCO0 ;Acceso al banco 0
movlw b'10010000' ;Valor para configurar USART
movwf RCSTA ;RC7/Rx/DT en recepción continua
movlw b'11000000' ;Valor para configurar INTCON
movwf INTCON ;Se habilitan GIE y PEIE
para que sirve el bit RCSTA.OERR manuix?
-
Me parece que un error que tienes es al hacer:
bcf TRISC,6 para el pin TX, debes poner los dos pines como entrada.
Saludos
-
para que sirve el bit RCSTA.OERR manuix?
Te indica que el usart tuvo un error de overrrun. Las 2 causas más comunes que conozco son las siguientes
1) Que tu software no alcanza a leer los datos con la suficiente velocidad a medida que llegan, por ende se llena el buffer y te da un error de overrun
2) Que al encender el hardware, tienes ruido en el pin de recepción de usart (esto es muy muy común) lo que produce que la usart reciba algunos bytes los cuales no son atendidos por tu código (porque tu no esperas recibir nada).
El problema es que al activarse el OERR la usart desactiva su recepción contínua por eso puedes experimentar como si no te anda la usart. :)
Solución? Hacer un borrado del bit RCSTA, CREN y luego lo vueles a setear
bcf RCSTA,CREN
bsf RCSTA,CREN
Una forma de evitar estos problemas al arrancar es que esperes algunos mseg y revisar en forma períodica en tu código el estado de dicho bit.
-
Yo antes programaba en ASM pero después de conocer el CCS, procuro hacerlo en éste, una vez tardé 2 meses haciendo un código en ASM que implicaba, sensar dos encoders, hacer dos conversiones ADC y a la vez comunicación serial RS232, el mismo lo hice en CCS y tardé día y medio (incluyendo el aprendizaje en CCS) en ASM el cambio de bancos para leer la variable o el registro y luego si se te olvidó cambiarte de banco te lee un valor que no es, eso implica tiempo y :x de paso si te equivocas en asiganr un valor errado como éste:
movlw d'32' ;Valor para configurar los baudios
que debería ser 129 (Tabla 10-4 del Datasheet) según lo que quieres, eso es otro detalle, en fin que viva el CCS con el debido respeto que se merece el Padre ASM.
Salu2.
-
Yo antes programaba en ASM pero después de conocer el CCS, procuro hacerlo en éste, una vez tardé 2 meses haciendo un código en ASM que implicaba, sensar dos encoders, hacer dos conversiones ADC y a la vez comunicación serial RS232, el mismo lo hice en CCS y tardé día y medio (incluyendo el aprendizaje en CCS) en ASM el cambio de bancos para leer la variable o el registro y luego si se te olvidó cambiarte de banco te lee un valor que no es, eso implica tiempo y :x de paso si te equivocas en asiganr un valor errado como éste:
movlw d'32' ;Valor para configurar los baudios
que debería ser 129 (Tabla 10-4 del Datasheet) según lo que quieres, eso es otro detalle, en fin que viva el CCS con el debido respeto que se merece el Padre ASM.
Salu2.
Tienes razon ese era el problema... Es verdad que el asm es a veces muy muy muy muy muy muy desesperante y te hace perder mucho tiempo. Pero yo no tengo opción y pq me piden el programa en ensamblador.
1 saludo
-
Tienes razon ese era el problema... Es verdad que el asm es a veces muy muy muy muy muy muy desesperante y te hace perder mucho tiempo. Pero yo no tengo opción y pq me piden el programa en ensamblador.
1 saludo
yendo al tema del hilo, lo pudiste hacer andar? espero que sí :mrgreen:
-
Pues no manuix :-(
He conseguido que funcione en proteus...
Para descartar problemas he hecho que cuando el 2550 detecta un envio desde el usb lo que manda al rs232 es una F (70 en decimal) y el 877 cuando lo recepciona debe mostrar la F en el LCD. Ok esto funciona en la simulación en proteus pero en la placa real aparecen 3 bytes por arte de magia 128 000 248 (en decimal se entiende)
Asi que en esa estamos.
1 saludete.
-
Entiendo, un consejo es que verifiques el baudeaje. Una forma rápida de determinar si andan bien es que hagas transmitir a cada pic por separado y veas cuanto tiempo demora un byte en salir (esto pensando que tienes un osciloscopio).
Todo esto, suponiendo que no tienes problemas con el código :)
-
Bueno finalmente ha salido andando... mañana os explico pq la cosa tiene su miga...
Durante las miles de pruebas realizadas... sin exagerar le habré echado a este problemas más de 20 horas de trabajo (igual me quedo muy corto) me dió por modificar el baud rate con el que habia estado trabajando, 9600 baudios por 19200 y también introduje una pequeña modificación en mi codigo que en ese momento era
BANKSEL TXSTA
bcf TXSTA,SYNC
bsf TXSTA,BRGH
por este otro
BANKSEL TXSTA
movlw b'0000100'
movfw TXSTA
Compilo y el invento funciona... en un primer momento le eché la culpa al baud rate pero luego me di cuenta de que no... vi que si ponia
BANKSEL TXSTA
bcf TXSTA,SYNC
bsf TXSTA,BRGH
NO FUNCIONABA
y sin embargo con
BANKSEL TXSTA
movlw b'0000100'
movfw TXSTA
SI FUNCIONABA....
mmm mmm mmm pensé que me estaba dejando algun bit sin borrar y fuera determinante pero no. SI os fijais en movfw TXSTA está mal escrita... mi intención era poner movWF TXSTA. El efecto en el programa era que no modificaba en ese instante el TXSTA y eso se traducia a la postre en que se dejaba el bit BRGH a 0.
Segun la tabla 10-4 del datasheet del 877a para una configuración 19200 a 20MHZ con BRGH=1 debia ser 64. Y eso era lo que queria configurar pero me equivoqué y dejaba el bit BRGH a 0... Y FUNCIONA.... y deja de funcionar en PROTEUS :-P que antes con BRGH=1 si funcionaba como se comenta en un post anterior.
Para descartar otros problemas lo he realizado con dos 877a distintos, verificado los valores de TXSTA en el momento de la configuración con el ICD2 en modo debug.
Ahora mi pregunta es... alguien de los presentes tiene algun 877a usando el puerto usart como receptor y le funciona???
Y para descartar que es problema de mi programa lo he hecho tambien con otro que he encontrado en este mismo foro usando el buscador, con identico resultado. Aqui os lo dejo por si alguien quiere comprobarlo (con BRGH=0 y baud rate de uno supuestamente para BRGH=1)
LIST P=16F877A
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_OFF & _HS_OSC & _LVP_OFF & _DEBUG_ON
INCLUDE <P16F877A.INC>
ERRORLEVEL -302, -207, -205, -203, -305 ;evitar warnings al compilar
;<<<<<<---------------------- VECTOR DE RESET ------------------------>>>>>>>
ORG 00H ;Inicio en el Vector de Reset
goto INICIO ;Va a la primera instruccion del
;programa
;<<<<<<------------------- VECTOR DE INTERRUPCION -------------------->>>>>>>
ORG 04H ;Vector de interrupcion
INTER btfss PIR1,RCIF ;¿Interrupcion por recepcion?
goto VOLVER ;No. Falsa interrupcion
bcf PIR1,RCIF ;Si. Reponer Flag
movf RCREG,W ;Lectura dato recibido
; movwf PORTB ;Visualiza dato recibido
VOLVER retfie ;retorna de la interrupcion.
;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>>
INICIO clrf PORTB ;Limpia salidas
clrf PORTC
clrf ADCON1
bsf RCSTA,SPEN ;se activa la USART
bsf STATUS,RP0 ;Cambio al banco 1 ------------------
bcf STATUS,RP1
clrf TRISB ;Puerta B como salida
clrf TRISB ;Puerta B como salida
movlw 80H ;RC7/Rx entrada,
movwf TRISC ;RC6/Tx salida y RC5 Salida.
movlw 00H ;Configuracion USART
movwf TXSTA ;y activacion de transmision
movlw .64 ;19200 baudios
movwf SPBRG
bsf PIE1,RCIE ;Habilitacion interrupcion RX
bcf STATUS,RP0 ;Cambio al banco 0 -----------------
bsf RCSTA,SPEN ;se activa la USART
movlw 90H ;Configuracion de la usart
movwf RCSTA ;para recepcion continua
movlw 0C0H ;Habilitacion para las
movwf INTCON ;interrupciones generales
BUCLE goto BUCLE ;espera aqui hasta que salte la int.
END
-
Bueno finalmente ha salido andando... mañana os explicaré pq aun no estoy seguro de lo que ha pasado, no descarto un fallo en el datasheet de microchip.
Buenisimo que lo hayas solucionado, ahora lo importante será que sea estable en su andar a ver si anda solo frente a ciertas condiciones o si se más robusto y soporta algunos desajustes como ruido en el pin de recepción o similar.
Lo del error en el datasheet es factible, he encontrado algunos a veces. En estos casos una forma de aportar a la causa es subir el problema en http://support.microchip.com .
Fijate si no están mencionados en algún Errata correspondiente. Los errata mencionan bugs en el silicon pero también a veces alguna corrección de los datasheets que luego aparecen en las nuevas versiones.
-
Hola manuix relee mi post anterior que lo modifiqué para no añadir la solución en otro post
-
Si claro que los puertos de recepción y transmisión de la uart del pic16f877a funcionan, yo tengo conectado el pin RX del pic16f877a con el pin TX del 18f4550 y el pin TX del 16f con el pin RX directamente sin intermediarios, y funciona todo bien, una recomendación que te podría dar si me lo permites es que coloques en '1' el pin TX en ambos códigos de tus programas apenas empieza tu programa principal con esto evitarás ese bit fantasma que recibe el pic (cualquiera de ellos) a mi pasaba lo mismo, recibía un dato sin pedirlo y con esto lo solucioné.
Saludos.
-
Si claro que los puertos de recepción y transmisión de la uart del pic16f877a funcionan, yo tengo conectado el pin RX del pic16f877a con el pin TX del 18f4550 y el pin TX del 16f con el pin RX directamente sin intermediarios, y funciona todo bien, una recomendación que te podría dar si me lo permites es que coloques en '1' el pin TX en ambos códigos de tus programas apenas empieza tu programa principal con esto evitarás ese bit fantasma que recibe el pic (cualquiera de ellos) a mi pasaba lo mismo, recibía un dato sin pedirlo y con esto lo solucioné.
Saludos.
El tx en mi programa lo tengo a 1, pero no en el ejemplo este que he puesto pq lo saqué del buscador... solo lo puse por si alguien quiera comprobar el problema mencionado con el BRGH.
En tu programa del 16f877a me puedes indicar qué baud rate usas y si tiene BRGH=1 o 0??? Lo haces en ensamblador o en C?
No descarto que sea problema de mi software, seria lo más logico pero si pongo BRGH=1 con el baudrate a 64 para una velocidad de 20mhz tal como indica en el datasheet para 19200budios en modo BRGH=1 no funciona y si pongo lo mismo con BRGH=0 sí...
-
Ahora mi pregunta es... alguien de los presentes tiene algun 877a usando el puerto usart como receptor y le funciona???
Sí, de hecho se puede decir que tengo canas configurando usart para estos pics jiji. Hace poco los programo en C, pero hace años que lo hago en assembly y te digo que nunca me han fallado.
He usado toda la familia 16f873, 16f874, 16f876, 16f877 y sus hermanos los A. Ahora también uso los 16F88x con idénticos buenos resultados.
Los tengo en aplicaciones que andan 24x7 (24 hs, los 7 días de la semana) y siguen andando desde hace años.
En cuanto al proteus no tengo comentarios al respecto ya que no lo uso, pero como moraleja y siempre digo esto, el hardware es quien decide siempre y no el simulador :mrgreen: Lo que anda en un simulador puede que no ande en el hardware y viceversa. No por nada son simuladores, sirven para aproximarse a la solución real del problema pero rara vez cubren todos los aspectos reales del mismo.
En tu programa del 16f877a me puedes indicar qué baud rate usas y si tiene BRGH=1 o 0??? Lo haces en ensamblador o en C?
Tengo códigos en assembly y en C que configuran la usart. El C puntualmente es el Ht-pic pero lo que hago es solamente usar 'estilo C' pero internamente con asignaciones directas a los registros (sin usar inline assembly) así que es lo mismo que hacerlo en assembly.
No hay diferencias en esto en hacerlo en C o assembly, lo que importa es qué codigo queda generado y si te funcionará finalmente o no.
¿Tienes un osciloscopio? ¿Cómo compruebas lo del baudeaje "real"? Te pregunto por si por casualidad estás usando un adaptador USB a de puerto serie RS232 en alguna PC o bien alguna placa de expansión de puertos. Te digo porque si tu respuesta va por este lado te comento que con algunos adaptadores he tenido problemas, yo pensaba que era el código (que venía andando bien) y resultó ser el adaptador!! Cambiar de puerto de conexión en la PC a uno del motherboard me solucionó el problema.
-
Ahora mi pregunta es... alguien de los presentes tiene algun 877a usando el puerto usart como receptor y le funciona???
Sí, de hecho se puede decir que tengo canas configurando usart para estos pics jiji. Hace poco los programo en C, pero hace años que lo hago en assembly y te digo que nunca me han fallado.
He usado toda la familia 16f873, 16f874, 16f876, 16f877 y sus hermanos los A. Ahora también uso los 16F88x con idénticos buenos resultados.
Los tengo en aplicaciones que andan 24x7 (24 hs, los 7 días de la semana) y siguen andando desde hace años.
En cuanto al proteus no tengo comentarios al respecto ya que no lo uso, pero como moraleja y siempre digo esto, el hardware es quien decide siempre y no el simulador :mrgreen: Lo que anda en un simulador puede que no ande en el hardware y viceversa. No por nada son simuladores, sirven para aproximarse a la solución real del problema pero rara vez cubren todos los aspectos reales del mismo.
En tu programa del 16f877a me puedes indicar qué baud rate usas y si tiene BRGH=1 o 0??? Lo haces en ensamblador o en C?
Tengo códigos en assembly y en C que configuran la usart. El C puntualmente es el Ht-pic pero lo que hago es solamente usar 'estilo C' pero internamente con asignaciones directas a los registros (sin usar inline assembly) así que es lo mismo que hacerlo en assembly.
No hay diferencias en esto en hacerlo en C o assembly, lo que importa es qué codigo queda generado y si te funcionará finalmente o no.
¿Tienes un osciloscopio? ¿Cómo compruebas lo del baudeaje "real"? Te pregunto por si por casualidad estás usando un adaptador USB a de puerto serie RS232 en alguna PC o bien alguna placa de expansión de puertos. Te digo porque si tu respuesta va por este lado te comento que con algunos adaptadores he tenido problemas, yo pensaba que era el código (que venía andando bien) y resultó ser el adaptador!! Cambiar de puerto de conexión en la PC a uno del motherboard me solucionó el problema.
No uso ningun adaptador usb serie... uso un 18f2550 que recibe por usb y lo manda al 877a por rs232. El problema como digo es que el uso que tengo que hacer del bit TXSTA,BRGH es el contrario al que indica el datasheet o de lo contrario no funciona la transmisión. Lo que indicaba sobre proteus es que éste si responde a los dictados del datasheet pero no el pic :-P.
-
No uso ningun adaptador usb serie... uso un 18f2550 que recibe por usb y lo manda al 877a por rs232. El problema como digo es que el uso que tengo que hacer del bit TXSTA,BRGH es el contrario al que indica el datasheet o de lo contrario no funciona la transmisión. Lo que indicaba sobre proteus es que éste si responde a los dictados del datasheet pero no el pic :-P.
Bueno, volviendo a lo que has hecho, puedes pegar le código del 16f877A que estas usando? Según entendí más arriba que dices que lo que está posteado ya le has cambiado algunas cosas, por eso te solicito si lo podes volver a subir.
También por favor aclarame que fuses estas usando y que cristal
El código del 18f2550 también vendría bien, sobre todo si está en assembly , qué fuses tienes en dicho pic y cómo configuras la usart. Si usas algún C y puedes simularlo, te pido si puedes mostrar al menos el contenido de los registros SPBRG, el RCSTA, el TXSTA y si usas el oscilador interno también postea su valores.
Por último, anota qué modelo de pic tienes exactamente (todas las letras), tal vez sea algún error en el silicon que ya esté documentado en algún errata pero para ello necesitaría que transcribas exactamente todo lo que dice el pic en su lomo.
Saludos
-
...
En tu programa del 16f877a me puedes indicar qué baud rate usas y si tiene BRGH=1 o 0??? Lo haces en ensamblador o en C?
...
Bueno intenté pegar el código completo pero no puedo porque tiene más de 2000 caracteres asi que te lo adjunto no sin antes mostrarte lo que creo que te puede servir:
;===============================================================================
; Configuración de los puertos
;-------------------------------------------------------------------------------
bsf STATUS,RP0; Activa el banco 1
movlw 0xFF
movwf TRISA; Configura todo el puerto A como entradas, aunque solo se use AN0 y AN1 como entradas analógicas
movlw 0xF0; Configura RD7:RD4 como entradas y RD3:RD0 como salidas
movwf TRISD;
movlw b'10000000'
movwf TRISC; Se configura RX y TX
clrf TRISB; No se utiliza el puerto B
;===============================================================================
; Configuración de la comunicación serial USART
;-------------------------------------------------------------------------------
movlw b'00100100'
movwf TXSTA; 8 bits, Habilita transmisión, Modo Asíncrono, Alta velocidad
BANK0; Selecciona el Banco 0
bsf PORTC, 6; Aseguro que este bit sea 1 (STOP) y corregir posibles fallos en la comunicación que ocurren al
; encender el PIC
bcf RCSTA, CREN; Lo hago cero para borrar un posible bit de Overrun
movf RCREG, W;
movf RCREG, W; Leo dos bytes para vaciar el bufer de recepción
movlw b'10010000'
movwf RCSTA; Configura los pines RC7/RX y RC6/TX como pines del puerto serial, 8 bits y CREN=1
BANK1; Selecciona el Banco 1 nuevamente para configurar
movlw .64; 129=> 9600 // 64=> 19200
movwf SPBRG; Velocidad de transmision a 19200 Baudios
Inicio de la rutina de interrupción:
Interrupcion
movwf w_temp;
movf STATUS, W;
movwf status_temp;
movf PCLATH, W;
movwf pclath_temp;
BANK0
btfss PIR1, RCIF; Verifica si ocurrió una interrupción por recepción de datos via USART
goto Fin_Interrupcion
; Se recibió un dato
movf RCREG, W;
movwf dato; Leemos el dato
fin de la rutina:
...Fin_Interrupcion
; bsf RCSTA, CREN; Habilito nuevamente la recepción de datos
bcf PIR1,RCIF ; Clear the interrupt flag
movf pclath_temp, W;
movwf PCLATH
movf status_temp, W;
movwf STATUS;
swapf w_temp, F;
swapf w_temp, w
retfie
Configuración de las interrupciones:
;===============================================================================
; Configuración de las interrupciones
;-------------------------------------------------------------------------------
movlw b'11000000'
movwf INTCON; Habilita las interrupciones globales y las periféricas
movlw b'00100000'
movwf PIE1; Habilita interrupción solo por recepción de datos via USART
Rutina de transmisión de un byte:
Tx
movwf TXREG
BANK1
btfss TXSTA, TRMT
goto $-1; Espera a que termine de transmitir el dato
BANK0
return
Saludos.
-
Que raro... igual es una interacción con el 2550 que está programado en ccs. Investigaré el tema a fondo en cuanto termine el proyecto del brazo robot que ahora mismo me tiene todo el tiempo ocupado.
El caso es que con me funciona con el brgh=0 baud rate 19200 (64) contraviniendo lo que dice el datasheet.
Mil gracias por los consejos ya volveré con el tema en cuanto tenga un ratito de lugar.
-
Lei en otro tema una contestacion de Sisco muy explicativa acerca de porque no funciona el USB y la USART al mismo tiempo en un 2550.
Realiza una busqueda y encontraras la solucion.
Creo que el iniciador del tema fue Manolo Nocturno. :mrgreen:
-
No fui yo, pero rescato el link por si te sirve: http://www.todopic.com.ar/foros/index.php?topic=20568.0
-
Que raro... igual es una interacción con el 2550 que está programado en ccs. Investigaré el tema a fondo en cuanto termine el proyecto del brazo robot que ahora mismo me tiene todo el tiempo ocupado.
El caso es que con me funciona con el brgh=0 baud rate 19200 (64) contraviniendo lo que dice el datasheet.
Mil gracias por los consejos ya volveré con el tema en cuanto tenga un ratito de lugar.
Cuando tengas tiempo de ver el código de CCS o el Código Generado en assembly, te pido que guardes eso más que las instrucciones puntuales que usas en CCS.
Aunque tal vez el problema esté en otro lugar como apuntan Marcos y Manolo
-
Eruditos de la pagina, quiero hacer una comunicacion inalambrica entre pics (16F877A).
El que envia, debe transmitir 13 señales digitales correspondientes a distintos interruptores que pueden ser 1 o 0.
El problema es que trabajo con el software PIC SIMULATOR IDE y no tengo ni idea como tranmitirlos ni mucho menos recibirlos.
Pora favor ayudenme
-
Hola.
La comunicacion se puede hacer por serial. Se podria enviar un identificador de trama para cada senal (A: xxx, B:xxx ....) y en el PIC receptor se procesaria el dato correspondiente. Te recomiendo que mires el Procesador de comandos vía RS232 (con Buffer de recepción) (http://picmania.garcia-cuervo.com/PICC.php#COMBUF232) del gran RedPic para que te des una idea.
Los emisores que he usado son el TLP434A y su respectivo receptor, muy bueno, baratos, faciles de usar, 100mts de alcance, los venden en sigmaelectronica (http://www.sigmaelectronica.com.co).
Respecto al simulador, porque no pruebas cambiarte al Proteus????
Saludos
-
alguien que me ayude con la programacion en c para conectar 2 pic mediante usart usando el pic 16f877
de antemano gracias
-
alguien que me ayude con la programacion en c para conectar 2 pic mediante usart usando el pic 16f877
de antemano gracias
hola king12, que necesitas hacer exactamente?!?! que problema tienes?!?!?!
saludos...