Problema de comunicación UART

Estoy tratando de enviar algo desde un atmega a mi pc.

La configuración es: Ubuntu 14.04, atmega644P-20PU, USBASP v2, TTL-to-USB pl2303

Primero traté de escribir el código en C y usé este código y luego este y obtuve el mismo resultado: '�' o caracteres aleatorios (en minicom o pantalla)

Luego renuncié a la C y subí un programa Arduino simple:

void setup()
{
   Serial.begin(9600);
}
void loop()
{
   delay(500);
   Serial.write('t');
}

(cuando ejecuté arduino, puse un cristal de 16MHz. En otros casos, usé uno de 20Mhz. También configuré F_CPU en consecuencia en el código).

En todos los casos, el LED R (recibir) del pl2303 parpadea en los momentos correctos (dependiendo del retraso establecido en el código).

También utilicé CuteCom para ver lo que obtengo del puerto serie y en lugar de '�', según el código utilizado, obtengo "\0x00\0x80\0x80"(para el código Arduino) o en otros casos "\0x80\0x00\0x80".

Yo uso RX0 y TX0 (pin 14 y 15). RX0 conectado a TX de pl2303 y RX de pl2303 a TX0 de la mcu.

También acorté RX y TX de pl2303 e intenté enviar datos a través de él y recibí lo que envié.

La tasa de baudios de pl2303 es 9600

$stty -F /dev/ttyUSB1

velocidad 9600 baudios; línea = 0;

mín = 60; tiempo = 1;

ignbrk-brkint-icrnl-imaxbel

-opost -onlcr

-isig -icanon -iexten -echo -ecoe -echok -echoctl -eco

En todos los casos utilicé 8N1.

Espero haber sido lo suficientemente específico y coherente.

(normalmente trato de encontrar respuestas y soluciones, pero ahora estoy perdido)

¿Tiene un osciloscopio disponible que pueda usar para capturar la señal? Además, ¿qué recibes si envías datos desde la pc?
't' parece 0001011101en la línea 0x80 como 0000000011y 0x00 como 0000000001casi seguro que tiene la velocidad de transmisión demasiado rápida en el extremo receptor.
Podría ponerme a trabajar con un osciloscopio. Voy a mostrar los resultados si lo hago. No intenté enviar desde la PC a la mcu, pero intentaré mostrar los resultados lo antes posible.
@Jasen Gran observación. Pero todavía no entiendo qué más podría configurar. el puerto está en 9600, cutecom está configurado en 9600, el mcu también está configurado en 9600, con el cristal adecuado. No puedo agregar una pantalla de impresión sobre esto porque no tengo suficientes 'puntos de reputación'.
configure cutecom a 1200 baudios y vea qué sucede.
@Jasen Dios mío, funciona.
@Jasen por favor explícame esto
en algún lugar tiene un divisor 8x en el reloj UART. No sé lo suficiente sobre arduino para adivinar dónde salió mal.
@Jasen dijiste 1200 porque obtuve 3 caracteres en lugar de uno, y dividí 9600 con 2 ^ 3 y obtuve 1200. Todavía no entiendo por qué se tuvo que hacer esto y las cosas no funcionaron al principio.
@Jasen Gracias * 8. No tienes idea de cuánto luché con esto.
No, 8 porque todos los símbolos tienen 8 '0's al principio del alambre.

Respuestas (2)

't' parece 000101110en la línea 0x80 000000001y 0x00 000000000(incluido el bit de inicio e ignorando el bit de parada) casi seguro que tiene una velocidad de transmisión demasiado rápida en el extremo receptor.

dado que está viendo 0 ceros y un 1, probablemente esté configurado 8 veces demasiado rápido, así que intente 1200 baudios en cutecom y busque una posible causa para que el divisor de velocidad en baudios en el arduino esté configurado 8 veces demasiado alto.

Como se mencionó anteriormente, todavía tiene el fusible CKDIV8 programado en los fusibles.

Puede deshacerse de él temporalmente configurando la configuración 1x prascaler en el software

CLKPR = (1 << CLKPCE); // Enable change of CLKPS bits
CLKPR = 0x00; // Set prescaler to 1

O simplemente configure los fusibles correctos, con full swing crystal oscillatorla configuración CKDIV8 y CKSEL deshabilitada.

Esta es mi configuración para mega 328p:

mega 328p cristal completo

muchas gracias. Soy una especie de principiante con respecto a la codificación avr. ¿Hay alguna razón por la que querría usar este prescaler?
El preescalador de reloj se usa generalmente para hacer un reloj no estándar a partir de un oscilador interno (por ejemplo, esclavo smbus de bajo consumo y costo a 2/4 MHz). Cambiarlo sobre la marcha sería realmente difícil para los principiantes (por ejemplo, _delay_ms() se compila estáticamente para F_CPU definido específico).
entiendo. Te escribí a ti y a tu correo electrónico desde github. Espero que aún lo uses. Tengo mucha curiosidad acerca de sus pensamientos al respecto (podría encontrar un sistema de chat aquí :( )