UART-Kommunikationsproblem

Ich versuche, etwas von einem Atmega an meinen PC zu senden.

Das Setup ist: Ubuntu 14.04, atmega644P-20PU, USBASP v2, TTL-to-USB pl2303

Zuerst habe ich versucht, den Code in C zu schreiben und diesen Code verwendet und dann diesen und ich habe das gleiche Ergebnis erhalten: '�' oder zufällige Zeichen (in Minicom oder Bildschirm)

Dann habe ich C aufgegeben und ein einfaches Arduino-Programm hochgeladen:

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

(Beim Ausführen von Arduino habe ich einen 16-MHz-Kristall eingesetzt. In anderen Fällen habe ich einen 20-MHz-Quarz verwendet. Außerdem habe ich F_CPU im Code entsprechend eingestellt.)

In allen Fällen blinkt die R(receive) LED des pl2303 im richtigen Moment (abhängig von der im Code eingestellten Verzögerung).

Außerdem habe ich CuteCom verwendet, um anzuzeigen, was ich von der seriellen Schnittstelle bekomme, und anstelle von '�', je nach verwendetem Code, den ich bekomme "\0x00\0x80\0x80"(für Arduino-Code) oder in anderen Fällen "\0x80\0x00\0x80".

Ich verwende RX0 und TX0 (Pin 14 und 15). RX0 verbunden mit TX von pl2303 und RX von pl2303 mit TX0 der mcu.

Ich habe auch RX und TX von pl2303 kurzgeschlossen und versucht, Daten darüber zu senden, und ich erhalte zurück, was ich sende.

Baudrate von pl2303 ist 9600

$stty -F /dev/ttyUSB1

Geschwindigkeit 9600 Baud; Zeile = 0;

mind. = 60; Zeit = 1;

ignbrk -brkint -icrnl -imaxbel

-opost -onlcr

-isig -icanon -iexten -echo -echoe -echok -echoctl -echoke

In allen Fällen habe ich 8N1 verwendet.

Ich hoffe, ich war spezifisch genug und kohärent.

(Normalerweise versuche ich, selbst Antworten und Lösungen zu finden, aber jetzt bin ich verloren)

Haben Sie ein Oszilloskop zur Verfügung, mit dem Sie das Signal erfassen können? Was erhalten Sie auch, wenn Sie Daten vom PC senden?
't' sieht 0001011101auf der Zeile wie 0x80 0000000011und 0x00 aus, 0000000001fast sicher haben Sie die Baudrate am Empfängerende zu schnell.
Ich könnte mit einem Oszilloskop arbeiten. Ich werde die Ergebnisse anzeigen, wenn ich das tue. Ich habe nicht versucht, vom PC an die MCU zu senden, aber ich werde versuchen, die Ergebnisse so schnell wie möglich anzuzeigen.
@Jasen Tolle Beobachtung. Aber ich verstehe immer noch nicht, was ich noch einstellen könnte. der port ist auf 9600, cutecom ist auf 9600 eingestellt, die mcu ist auch auf 9600 eingestellt, mit dem richtigen quarz. Ich kann dazu keinen Druckbildschirm hinzufügen, weil ich nicht genug "Reputationspunkte" habe.
Stellen Sie cutecom auf 1200 Baud ein und sehen Sie, was passiert.
@Jasen omg es funktioniert.
@Jasen bitte erkläre mir das
Irgendwo haben Sie einen 8x-Teiler auf der UART-Uhr. Ich kenne nicht genug Arduino, um zu erraten, wo es schief gelaufen ist.
@Jasen du hast 1200 gesagt, weil ich 3 Zeichen anstelle von einem bekommen habe, und die 9600 mit 2 ^ 3 geteilt und 1200 bekommen habe? Ich verstehe immer noch nicht, warum das gemacht werden musste und das Zeug anfangs nicht funktionierte
@Jasen Danke * 8. Du hast keine Ahnung, wie sehr ich damit zu kämpfen hatte.
Nein, 8, weil alle Symbole am Anfang des Drahtes 8 Nullen haben

Antworten (2)

't' sieht 000101110auf der Zeile wie 0x80 000000001und 0x00 000000000aus (einschließlich des Startbits und des Ignorierens des Stoppbits), mit ziemlicher Sicherheit haben Sie die Baudrate am Empfängerende zu schnell.

Angesichts der Tatsache, dass Sie 0 Nullen und eine 1 sehen, ist es wahrscheinlich 8-mal zu schnell eingestellt. Versuchen Sie es also mit 1200 Baud in Cutecom und suchen Sie nach einer möglichen Ursache dafür, dass der Baudratenteiler im Arduino 8-mal zu hoch eingestellt ist.

Wie oben erwähnt, haben Sie CKDIV8-Fuse noch in Fuses programmiert.

Sie können es vorübergehend beseitigen, indem Sie in der Software die Einstellung 1x Prascaler festlegen

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

Oder setzen Sie einfach die richtigen Sicherungen mit deaktivierter CKDIV8- und full swing crystal oscillatorCKSEL-Einstellung.

Das ist mein Setup für mega 328p:

Mega-328p-Full-Swing-Kristall

vielen Dank. ich bin ein ziemlicher anfänger was avr-coding angeht. Gibt es einen Grund, warum ich diesen Prescaler verwenden möchte?
Der Taktvorteiler wird normalerweise verwendet, um einen nicht standardmäßigen Takt aus dem internen Oszillator zu erzeugen (z. B. stromsparender und kostengünstiger Smbus-Slave bei 2/4 MHz). Das spontane Umschalten wäre für Anfänger sehr schwierig (z. B. _delay_ms() wird statisch für eine bestimmte definierte F_CPU kompiliert).
habe es. Ich habe Ihnen geschrieben und eine E-Mail an Ihre E-Mail von github gesendet. Ich hoffe, Sie verwenden es noch. Ich bin sehr gespannt auf Ihre Gedanken dazu (hier finden Sie ein Chat-System :( )