Verstümmelte serielle Ausgabe vom Steckbrett ATmega328 über FTDI-Breakout

Ich habe einen ATmega328P-PU auf einem Steckbrett,

Das Brotbrett

und ich versuche, die serielle Kommunikation durch einen dieser bösen Jungs zum Laufen zu bringen:

FTDI-Breakout-Front FTDI-Ausbruch zurück

Der 328P wird mit einem modifizierten Blink-Sketch geladen, der am Ende jeder Iteration nur eine Serial.print() ausführt.

int led = 13;
int count = 0;

void setup() {
  pinMode(led, OUTPUT); // initialize the digital pin as an output.
  Serial.begin(9600);
}

void loop()
{
  count++;
  for (int i = 0; i < 2; i++)
  {
    digitalWrite(led, HIGH);
    delay(150);            
    digitalWrite(led, LOW); 
    delay(150);          
  }
  delay(350);      

  Serial.print("abcdefghijklmnopqrstuvwxyz");
}

Die gute Nachricht ist, dass ich etwas bekomme , aber die schlechte Nachricht ist, dass alles verstümmelt ist.

Hier ist ein Beispiel von der Linux-Befehlszeile für das Zeug, das ich bekomme. Ich sehe auch eine ähnliche verstümmelte Ausgabe über Arduinos seriellen Monitor und Minicom:

$ (stty 9600 cs8 -parenb -cstopb;od -a )<  /dev/ttyUSB0
0000000 ack ack   `   f   ` ack   x   f ack   x   ~ ack  rs ack  rs can
0000020  rs  rs  rs   `  rs   f  rs   x  rs   ~  rs nul   f ack   x   f
0000040   x ack   ~   f ack   ~   ~ ack   f ack   ~   ~ ack ack   `   f
0000060   ` ack   x   f ack   x   ~ ack  rs ack  rs can  rs  rs  rs   `
0000100  rs   f  rs   x  rs   ~  rs nul   f ack   x   f   x ack   ~   f
0000120 ack   ~   ~ ack   f ack   ~   ~ ack ack   `   f   ` ack   x   f
0000140 ack   x   ~ ack  rs ack  rs can  rs  rs  rs   `  rs   f  rs   x
0000160  rs   ~  rs nul   f ack   x   f   x ack   ~   f ack   ~   ~ ack
0000200   f ack   ~   ~ ack ack   `   f   ` ack   x   f ack   x   ~ ack
0000220  rs ack  rs can  rs  rs  rs   `  rs   f  rs   x  rs   ~  rs nul
0000240   f ack   x   f   x ack   ~   f ack   ~   ~ ack   f ack   ~   ~
0000260 ack ack   `   f   ` ack   x   f ack   x   ~ ack  rs ack  rs can
0000300  rs  rs  rs   `  rs   f  rs   x  rs   ~  rs nul   f ack   x   f
0000320   x ack   ~   f ack   ~   ~ ack   f ack   ~   ~ ack ack   `   f
0000340   ` ack   x   f ack   x   ~ ack  rs ack  rs can  rs  rs  rs   `
0000360  rs   f  rs   x  rs   ~  rs nul   f ack   x   f   x ack   ~   f

Ich habe den Atmega_Board_Programmer-Sketch von Nick Gammon verwendet, um den Bootloader erfolgreich zu schreiben, insbesondere habe ich ein paar verschiedene Sicherungskonfigurationen (mit und ohne das Bit zum Teilen durch 8) ausprobiert, aber das Ergebnis ist immer dasselbe: verstümmelter Müll. Nun, eigentlich war das Blinzeln beim Teilen durch 8 super LANGSAM und offensichtlich nicht richtig.

Würde mich über Feedback oder Ideen zu möglichen Wegen freuen. Welche Einstellungen zu tweek? Ist die Schaltung sinnvoll?

BEARBEITEN / AKTUALISIEREN

Basierend auf dem Vorschlag von MarkU habe ich meine modifizierte Blink-Skizze erfolgreich auf einem Arduino Uno ausgeführt. Dadurch habe ich auch überprüft, ob das Breakout-Board FT232RL wie erwartet funktioniert. Ich bemerkte auch, dass die Blinksequenz auf dem Uno schneller zu sein schien als die gleiche Skizze, die auf meinem Steckbrett ausgeführt wurde. Hmmm...

Stellen Sie also das Steckbrett erneut auf und erhalten Sie eine verstümmelte Ausgabe. Dann habe ich an das langsamere Blinken im Vergleich zum Betrieb auf dem Uno gedacht und die Baudrate auf der Linux-Seite auf 9600 -> 4800 geändert. Hey! Es ist nicht mehr verstümmelt!

Die Skizze glaubt, dass sie bei 9600 sendet, also sieht es so aus, als wäre ich irgendwo um den Faktor 2 daneben. Hat mein Quarz 4 MHz statt 8? Ich habe keine Sicherung oder andere Einstellungen bemerkt, die das Timing um den Faktor 2 ändern würden.

Geben Sie hier die Bildbeschreibung einHier ist, was meiner Meinung nach das Problem ist: Ich kompiliere mit dem auf "Arduino Uno" eingestellten Zielboard, von dem ich glaube, dass dies eine konstante F_CPU = 16000000UL verwendet. Dann lade ich auf mein Steckbrett hoch, auf dem ein 8-MHz-Oszillator läuft, die Hälfte des erwarteten Werts.

Was ist der IC auf diesem "bösen Jungen"? Oder noch besser: Was ist das für eine "böse" - Bestellnummer? Und was ist die Art von Quarz, die Sie verwenden?
Das Breakout-Board hat FTDI 232RL und sieht genauso aus wie die von MarkU unten verlinkten Folger Technologies. Der Quarz ist 8,0 MHz 18pF-Fondskristalle. -20 °C ( mouser.com/Search/… )

Antworten (2)

Die Tatsache, dass Sie etwas erhalten, deutet für mich darauf hin, dass möglicherweise etwas mit Ihrer erwarteten und der tatsächlichen Uhr nicht stimmt. Gibt es eine Nadel, an der man die Uhr messen kann? Haben Sie Ihren Quarz/Ihre Frequenz korrekt definiert, wie es die von Ihnen verwendete serielle Bibliothek erfordert?

Verwenden Sie einfach die serienmäßigen Serial.print () -Aufrufe aus der Arduino 1.6.1-Bibliothek. Habe ein paar Google-Suchen durchgeführt, aber mir ist keine Möglichkeit bekannt, die Häufigkeit mit dieser Bibliothek anzugeben. Besorgen Sie sich ein Oszilloskop und sehen Sie, was an den XTAL1 / 2- und TX-Pins vor sich geht. Vielen Dank, dass Sie sich die Zeit genommen haben, um zu antworten.
Kein Problem. Hoffe, du bekommst es sortiert. Danke für das Häkchen, jetzt kann ich Kommentare hinzufügen. Yay

Dieses blaue Board sieht aus wie eine Variante von Sparkfun USB to Serial Breakout https://www.sparkfun.com/products/12731 mit dem FT232RL von FTDIchip.com im 28SSOP-Gehäuse. Dieses spezielle Board scheint Folger Technologies zu sein http://folger-technologies-llc.myshopify.com/products/3-3v-5-5v-ft232rl-ftdi-usb-to-ttl-serial-adapter-module-for- arduino-mini-port?variant=823021539 Sie sprechen nicht viel über die Spezifikationen des Boards, aber es ist wahrscheinlich genauso wie alle anderen FT232R-USB-Breakout-Boards.

FT232R-Datenblatt vom Hersteller erhältlich: http://www.ftdichip.com/Support/Documents/DataSheets/ICs/DS_FT232R.pdf

Stellen Sie sicher, dass der cmos/ttl-TX-Sendeausgang des ATmega328 den cmos/ttl-RX-Empfangseingang des FT232R ansteuert und der cmos/ttl-TX-Ausgang des FT232R den cmos/ttl-RX-Eingang des ATmega328 ansteuert. (Der häufigste Fehler bei seriellem UART ist das Verbinden von TX mit TX.)

Bei 9600 Baud (8 Bit, keine Parität, 1 Startbit, 1 Stoppbit) dauert die Übertragung jedes Zeichens 10/9600 = 1,042 ms, und 26 Zeichen sollten etwa 27 ms dauern. Können Sie ein Oszilloskop bitten/ausleihen, um das TX-Signal zu betrachten? Das ist ungefähr der einzige Weg, um herauszufinden, was hier passiert.

Ich habe noch nie gesehen, dass ein Hochfrequenz-Quarzoszillator auf einem weißen lötfreien Steckbrett funktioniert - oft gibt es eine erhebliche parasitäre Kapazität, die bei höheren Frequenzen unerwünschte Ladeeffekte verursacht. Vielleicht möchten Sie erwägen (darf ich es sagen?), Ihre Firmware auf einem der allgemein verfügbaren Arduino-Boards auszuprobieren - da Sie bereits mehr über Elektronik wissen als der Ziel-Arduino-Benutzer, können Sie Ihre eigene benutzerdefinierte Firmware laden, müssen Sie nicht müssen ihre IDE / Bootloader / Shields / etc. verwenden. Ein getestetes / echtes PCB-Layout sollte besser funktionieren als ein lötfreies Steckbrett. Sparkfun verkauft einen Arduino Pro Mini 328, der einen viel schöneren Formfaktor hat, den man tatsächlich an ein Steckbrett anschließen könnte, aber der die Quarzoszillatorschaltung auf einem PCB-Layout hat. https://www.sparkfun.com/products/11114

Schätzen Sie die Antwort. Ich habe RX auf TX gekreuzt (anders probiert, aber dann bekomme ich nichts). Klingt so, als wäre ein Bereich die nächste Tagesordnung.