Ich versuche, mit Arduino-artigem Code über einen USB-Serial-Konverter von einem ATtiny85 auf einen PC zu übertragen, ohne viel von irgendetwas zu verstehen. Ich war schockiert und entsetzt, dass es nicht funktioniert hat.
Ich habe bestätigt, dass der Winzling die Spannung an einem seiner Pins flackert, aber wenn ich diesen Pin zum Senden oder Empfangen über das serielle USB-Kabel verbinde und versuche, mit einem Terminalprogramm zu hören, erhalte ich nichts.
Ich bin nicht sicher, wie ich feststellen soll, welches Teil defekt ist.
Benötige ich mehr als VCC, GND und TXD, um seriell zu senden?
Einzelheiten:
Der Code für den Winzling ist in der Arduino-Umgebung geschrieben und ein ähnlicher Code blinkt erfolgreich alle 4 "PORTB" -Pins, zumindest entsprechend den LEDs. Ich benutze den Code von HLT und Saporetti , um ihn mit dem Arduino-Dialekt von C ++ zu programmieren. Das Programm kommt noch unter einem K rein.
#include <SoftwareSerial.h>
SoftwareSerial s(0,1); //receive on "0", and transmit on "1" aka "PB1" aka pin 6
void setup() { s.begin(4800); } // assuming 1Mhz, 4800 baud
void loop() { s.println(millis()); } // transmit something at every opportunity
Es sind viele Übersetzungen erforderlich, aber der Code ist ziemlich einfach. Der Code, der die Baudrate festlegt, scheint 1MHz anzunehmen, aber zum Glück hat meine Attiny werkseitig voreingestellte Sicherungen und läuft mit 1MHz. In jedem Fall flackert Pin 6 seine Spannung entsprechend der LED.
Also verbinde ich mit den kleinen Kabeln das "ftdi" -Ende des FTDI-USB-Seriell-Wandlers mit dem winzigen: Schwarz zu GND, Rot zu VCC, Orange zu 6. Ich öffne das Programm "minicom" auf dem PC, stelle den Baud ein rate auf 4800 und warte auf nichts. Wenn ich mit meinem Boarduino spreche , hat es keine Probleme.
Das FTDI-Konverterkabel hat die folgende Pinbelegung: Schwarz ist GND, Braun ist "CTS", Rot ist VCC (+4,98 V), Orange ist "TXD", Gelb ist "RXD", Grün ist "RTS".
Wenn ich vom winzigen auf den PC übertragen möchte, sollte ich die Spannung an "TXD" oder "RXD" flackern lassen? Mit anderen Worten, muss die Übertragungsleitung vom Slave zum Host oder vom Host zum Slave übertragen werden?
Ich habe tatsächlich beide ausprobiert und auch nicht gearbeitet. Ich habe bisher Geräte im Wert von weniger als einem Dollar gebraten, und ich werde übermütig, also stecke ich nur Drähte in das Kabel. Vielleicht soll ich die Drähte "CTS" und "RTS" nicht ignorieren?
Muss ich andere Kabel verwenden? Tun RTS und CTS etwas?
Bei der Hardware handelt es sich um ein ATTiny85-PU (DIP-8-Paket mit 1 MHz und 20 MHz), das über USB mit 4,98 V betrieben wird. Der Host-PC ist ein MacBook, und er führt alle Arduino-Aufgaben erfolgreich aus, einschließlich der Verwendung von ArduinoISP, um den ATtiny so zu programmieren, dass sein kleines Herz herausblitzt.
Die Antwort scheint also zu sein: Sie können einfach die Drähte anschließen, in der Tat nur GND (schwarz) und RXD (gelb), und alles funktioniert, solange die Software gut ist.
Dinge, die keine Rolle spielten:
Interner Oszillator funktioniert einwandfrei. Es scheint relativ stabil zu sein, wenn ich es einschränke. Bei 9600 Baud sind alle Probleme vernachlässigbar.
Die Verwendung der USB-Stromversorgung für die Signale funktioniert einwandfrei. Sie können eine separate Spannungsquelle verwenden (die sich eine gemeinsame Masse teilt), aber das FTDI-Kabel liest sowohl 3V- als auch 5V-Signale perfekt. Ich habe einen Akku angeschlossen, - an GND sowohl des FTDI als auch des Winzlings, + an den VCC des Tinys, und das hat einwandfrei funktioniert. Die Verwendung der VCC (rot) des FTDI (USB Power 5V) ist jedoch viel einfacher und genauso effektiv.
Dinge, die ich falsch gemacht habe:
Die gelbe FTDI "RXD" -Leitung empfängt Bits vom Mikrocontroller und verbindet sich so mit dem Sendeeingang des Mikrocontrollers. Ich hätte das selbst herausfinden können, indem ich die Sende- und Empfangsleitungen (orange und gelb) mit LEDs oder einem Arduino verband und überprüfte, welche Spannung flackerte, als ich vom PC sendete.
Weder SoftwareSerial noch NewSoftSerial funktionieren standardmäßig mit einem ATtiny. Obwohl der ATmega328p und der ATtiny85 viele Gemeinsamkeiten aufweisen, gibt es genügend Unterschiede, sodass es nicht ausreicht, nur die alte Software für den neuen Chip zu kompilieren.
Langsamere Baudraten heilen nichts. 300 Baud erfordern kompliziertere Verzögerungsroutinen, da die Anzahl der Zyklen zwischen Bits erheblich größer ist als ein 8-Bit-Zähler. 9600 Baud funktionieren einwandfrei und höhere Baudraten sind möglich.
Achten Sie darauf, zeitkritischen Code in C zu schreiben, insbesondere in Inline-Funktionen. Die Ausführungszeit hängt davon ab, wie der Compiler sie optimiert. Insbesondere wenn Sie die Verzögerung kalibrieren, indem Sie sie nur nach oben und unten ändern, erhalten Sie eine andere Antwort als bei Verwendung einer konstanten Verzögerung (mit erkennbarer Kompilierungszeit), da die generierte Assembly ziemlich unterschiedlich sein kann. Es ist nicht so, dass C "langsam" ist, sondern dass es zu schnell war. An einem Punkt habe ich Einsen schneller als Nullen gesendet (vermutlich sind sie aerodynamischer).
Um eine Übertragung zu starten, bringen Sie die Leitung auf LOW (das Startbit) und müssen dann sicherstellen, dass die Leitung an jedem der nächsten 8 Abtastpunkte die richtige Spannung aufweist und dass die Spannung beim 9. Abtastwert auf HIGH liegt . NewSoftSerial erwähnt, dass das Startbit eine Verzögerung von einer halben Länge aufweist, aber dies hat bei mir nicht gut funktioniert. Ich habe am Anfang eine Verzögerung von 75% und am Ende eine Verzögerung von 125% verwendet.
Die eigentliche Sorge bezüglich der Spannung könnte sein, dass einige "serielle" (insbesondere RS232) ± 12 V und nicht 0 V / 5 V betragen. Ich habe viel Zeit damit verbracht zu verstehen, wie ich die Spannung von 5V auf 3,3V einstellen kann, aber ich denke, das war völlig irrelevant.
Die serielle Übertragung ist auf jeden Fall einfach, aber das Timing "perfekt" zu machen, scheint ziemlich wichtig zu sein. Für mich war das nur eine Frage der Codierung des Sendes in der Baugruppe, damit ich die Zyklen zählen konnte.
quelle