Uart atmega324PA comunicación con max485

Hola a todos,

Bueno, llevo varios días intentando comunicar dos micros usando comunicación 485.

A un extremo un atmega2560(master) y al otro un atmega324PA(slave), mi problema radica en que le envío una serie de tramas desde el master y el slave debe contestar respecto a esas tramas.
Ahora el asunto es que me recibe una trama bien y otra mal, por ejemplo:

Código:
IN: 071200010100000000<\r>
071200010100000001<\r>
[COLOR="Red"]IN: 0712000??<\r>[/COLOR]
IN: 071200020100000000<\r>
071200020100000000<\r>
[COLOR="red"]IN: 0712000?<\r>[/COLOR]
IN: 0712015F0100000000<\r>
0712015F0100000001<\r>
[COLOR="red"]IN: 07120?<\r>[/COLOR]
IN: 071201610100000000<\r>
071201610100000000<\r>
[COLOR="red"]IN: 07120??<\r>[/COLOR]
IN: 071201630100000000<\r>
07120163010000FFFF<\r>
[COLOR="red"]IN: 0712?????<\r>[/COLOR]
IN: 071201650100000000<\r>
071201650100000001<\r>

Por cada trama de entrada el debe responder algo pero como algunas tramas llegan mal, entonces no me responde bien. si miro en el RX del max485 del slave, todas las tramas llegan bien, al parecer el problema está internamente en el micro, sin embargo yo tengo dos modos de "procesar" estas tramas, una cuando X pin está en 1 y otra cuando está en 0, si ese pin está en 0 simplemente retorna lo que recibe sin ningún problema pero cuando está en 1 sucede lo que ya comenté anteriormente, ya revisé las instrucciones que hay dentro de esa condición pero no noto nada raro, solo tengo un par de "call" y ningún "wait".
Me gustaría saber si saben que tipo de pruebas puedo hacer para corregir esto, ya que se supone que el pin de activación del 485 ya lo estoy manejando sin problema.

Gracias!
 
Suena a problema en el software... necesitariamos que pusieras ambos programas (master y slave) y ambos circuitos para poder ayudarte...

Con los ATMEGA muchas veces encontrar la solucion es relativamente simple, si tienes un debbuger conectado por JTAG (como el DRAGON o el AVRISP MKII) solo activas un breakpoint en el AVRSTUDIO y comienzas el debuggeo, cuando el programa llega al punto solicitado se detiene y puedes leer lo que hay en memoria, con eso puedes ir monitoreando poco a poco hasta encontrar donde esta el problema
 
Hola Chico3001, si yo también creo que es de software pero ya le he cambiado de todo jejeje y como dije anteriormente le quité todos los delay, lastimosamente no tengo esos debbuger, cuento en el momento con una stk600 con esta la puedo hacer?
Gracias!
 
Asegúrate que los pines de activación del transceiver 485 permanecen en el estado que deben tener mientras dure toda la transmisión desde el uart del micro.
 
Al parecer ese es el problema, la activación de ese pin, aproximadamente cuanto tiempo debo tenerlo activo? en mi código lo he cambiado muchas veces el tiempo de encendido y apagado, si quito esta parte del código, imprime bien aunque no llega al otro lado del 485 porque no activo el pin.

Código:
Rs485 = 1
Waitms 1
Print # 2 , Trama ; Chr(13);
Waitms 2
Rs485 = 0

Otra cosa curiosa es que tengo que ponerle en la subrutina que hace cuando interrumpe la uart, un delay de 2ms, de lo contrario, entra la primera vez pero no sigue recibiendo las tramas
 
Última edición:
la activación del pin de transmisión del transceiver 485 lo tienes que tener activo hasta que finalice la transmisión del último byte que transmites, y para ello tienes dos opciones:

1.- Generar una interrupción que se active cuando la transmisión ha finalizado (USART0_TX_vect) y ahí es donde ya puedes cambiar el estado del transceiver a recibir.

2.- después de transmitir el último byte monitorizar mediante un while() el bit de finalización de transmisión (TXC0: USART Transmit Complete) y esperar a que finalice la transmisión, y ahí es donde ya puedes cambiar el estado del transceiver a recibir.
 
lo que me parece muy raro es que coja una trama y la otra no... tal vez lo que pasa es que el master tiene activo el pin y envia luego lo desactiva pero en eso entonces a la vez el otro lo activó y se va haciendo cola en la uart?...
En esta oportunidad estoy programando en bascom y no se como mirar lo que me indicas, de todos modos voy a revisarlo, ya que tengo una subrutina que se activa cuando llega algo por la uart a causa de la interrupción pero no se a ciencia cierta cuando ha terminado de transmitir.
 
Y la solución a esto fue cambiar el atmega324PA, seguro ya lo había quemado muchas veces o bueno no se. lo probé con otro y funciona perfecto sin los delay, luego cuando tenga tiempo intentaré descubrir que le pasó al primer módulo.
 
Atrás
Arriba