Ich habe einen ATmega328P-PU auf einem Steckbrett,
und ich versuche, die serielle Kommunikation durch einen dieser bösen Jungs zum Laufen zu bringen:
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.
Hier 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.
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?
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
Tom L.
Steve