Serienneuling: Warum kann ich die Drähte nicht einfach anschließen?

14

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.

Jack Schmidt
quelle

Antworten:

9

Sie können Daten definitiv nur mit TX & GND übertragen.

Zunächst möchten Sie die ATtiny85 TX-Leitung mit der FTDI RX-Leitung (gelb am TTL-232R) verbinden. Stellen Sie sicher, dass der USB-Adapter 5 V verarbeiten kann - ich bin mir ziemlich sicher, dass auch der 3,3 V TTL-232R 5 V toleriert.

Entsprechend der Beispielseite für SoftwareSerial müssen Sie die Richtung der TX- und RX-Leitungen in Ihrer Setup-Funktion festlegen:

// include the SoftwareSerial library so you can use its functions:
#include <SoftwareSerial.h>

#define rxPin 2
#define txPin 3
#define ledPin 13

// set up a new serial port
SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);
byte pinState = 0;

void setup()  {
  // define pin modes for tx, rx, led pins:
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);
}

Die Baudrate beträgt in Ihrem Fall 4800. Die SoftwareSerial-Bibliothek scheint CTS & RTS nicht zu unterstützen, stellen Sie also sicher, dass Sie sie nicht auf der Host-Software verwenden.

Auf der Referenzseite finden Sie weitere Informationen zu möglichen Timing-Problemen, die sich möglicherweise verschlimmern, wenn Sie mit dem internen Oszillator des Winzlings mit 1 MHz arbeiten.

Peter Gibson
quelle
Vielen Dank! Die Referenzseite machte deutlich, dass 4800 zu schnell war, so dass ich auf 300 Baud abfiel und die Dinge "besser" waren. Der PinMode hat keinen Einfluss auf das Senden, aber ich habe ihn trotzdem hinzugefügt, um die Dinge klarer zu machen. Ich versuche jetzt, die Verzögerung zwischen den Bits zu verlangsamen, bis etwas empfangen wird. Minicom zeigt nur? markiert jetzt. Im schlimmsten Fall kommen meine 16-MHz- und 20-MHz-Oszillatoren am Freitag an.
Jack Schmidt
Glaubst du, es könnte das Spannungsproblem sein? Das Anpassen des Timings hat immer noch nicht funktioniert, und ich bekomme viele Fragezeichen, sodass etwas übertragen wird. Kann ich das Problem beheben, indem ich den Vcc auf winzig bis 3 V absenke, dh, kann ich ihn einfach an einige Batterien anstelle von USB anschließen? Schließe ich die Masse sowohl an die USB-Masse als auch an die Batteriemasse an?
Jack Schmidt
Oh, auch danke, dass du darauf hingewiesen hast, dass der gelbe Draht für meinen Winzling bestimmt ist. Das orangefarbene Kabel scheint stark zu flackern (an eine LED vom PC angeschlossen). Überträgt der PC oder bleibt er die meiste Zeit eingeschaltet?
Jack Schmidt
Ja, sollte im Leerlauf HI bleiben und beim Senden flackern. Ich bin nicht sicher, ob der FTDI genug Strom liefern kann, um eine LED anzusteuern. Der AVR wird in Ordnung sein, aber ich würde die LED von der FTDI-TX-Leitung entfernen. Crystal sollte die Timing-Probleme beheben (aber Sie müssen die Sicherungen einstellen, um vom internen Oszillator umzuschalten).
Peter Gibson
Ich arbeite immer noch daran, aber ich bin überzeugt, dass es sich um ein Timing-Problem oder ein schreckliches Arduino-on-ATTiny-Softwareproblem handelt. Einige mittlere 2-3 Bytes werden empfangen (aber nicht angezeigt) und der Rest wird als 0x80 verstümmelt. Ich werde meine eigene (triviale) AVR Soft Serial Send-Funktion schreiben, während ich auf den Kristall warte. Gibt es eine einfache / kostengünstige Möglichkeit, um zu sehen, was gesendet wird? 300 Baud sind für meine alten Augen immer noch ziemlich schnell.
Jack Schmidt
7

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.

Jack Schmidt
quelle
2
+1 für 1 ist aerodynamischer :) Der FTDI TTL232R gibt U-art-Signale mit Logikpegel (0-5 V) aus. Wenn Sie eine direkte Schnittstelle mit einem seriellen Standardanschluss herstellen, benötigen Sie einen Schnittstellen-IC wie den MAX232, der die Spannung umwandelt Ebenen in beide Richtungen.
Peter Gibson
Herzlichen Glückwunsch, dass es funktioniert. Vielen Dank für Ihren ausführlichen Beitrag. Ich hoffe, dass dies vielen anderen Menschen bei ihren ATtiny-Projekten hilft.
Davidcary