usart timing Problem ist gelöst. Bevor ich mir endlos einen abquäle, frage ich hier noch mal nach. Projekt:
Wechselrichter => RS485-Adapter => Atmega328
Senden geht - beim Empfangen werden die richtig gesendeten Werte vom uc nicht richtig gelesen. Ich meine, es ist ein hardware-Problem weil der vom Adapter ausgegebene low-Pegel mit ca. 1,5V bei ca. 4,6V Vcc zu hoch ist.
Wie setze ich den Pegel am einfachsten herunter? gibt es fertige Bausteine?, Transistor, Optokoppler - hat jemand eine fertige Schaltung?
Ich würde auch einen neuen Adapter ordern - aber nur wenn relativ sicher ist, dass der besser funktioniert als der verbaute.
Wichtige Regeln - erst lesen, dann posten!
Bitte das JPG-Format nur für Fotos und Scans verwenden!
... Siehe Bildformate.
Zeige den Schaltplan (insbesondere auch vom Adapter). Das Photo vom Drahtverhau deiner Schaltung macht die Beurteilung deiner Schaltung ETWAS mühselig.
Wie sieht dein Massekonzept aus?
Ist die RS485 irgendwo isoliert?
Wichtige Regeln - erst lesen, dann posten!
Bitte das JPG-Format nur für Fotos und Scans verwenden!
... Siehe Bildformate.
Muß denn immer dieser oberlehrerhafte Zeigefinger sein? Ja das zweite Bild wäre im JPG Format vermutlich kleiner, aber die Welt geht deswegen nicht unter.
Zeige den Schaltplan (insbesondere auch vom Adapter).
Davon wird er vermutlich keinen Schaltplan haben. Auf dem Foto sieht das wie was Fertiges aus.
Ansonsten wären mehr Informationen zum Aufbau schon hilfreich. Das Foto des Aufbaus ist hier weniger hilfreich, da man nicht allzuviel erkennen kann. Auch wird hier wohl kaum jemand den schlecht erkennbaren Drahtverhau in einen aussagekräftigen Schaltplan verwandeln.
Deshalb:
mach mal einen Schaltplan, wo man die zusammengeschalteten Komponenten sehen kann. Der darf auch mit der Hand gemalt sein.
Nenne mal die einzelnen Komponenten mit Name und Hausnummer. Also welcher Wechselrichter, welches Adapterboard?
Wozu wird das Steckbrett gebraucht? Das und die Dupontkabel sind oft Fehlerquellen.
Irgendwie sind bei Dir alle Pegel schon etwas nach oben verschoben. Bei 4,6Vss sollte auch der HIGH-Pegel etwas kleiner sein. Auf Deinem Screenschot sieht aus als läge der ziemlich genau bei 5V. Ich vermute auch, das Du, wie Lu schon geschrieben hat, ein Masseproblem hast.
Also mach erst mal einen vollständigen Schaltplan (vom Adapter und Arduino reicht Blockdarstellung mit den benutzten Pins) und stelle den hier ein. Ich sehe in dem Drahtverhau auch noch weitere Bauteile (z.B. Widerstände), diese bitte auch einzeichnen.
Ein Foto von der Unterseite der Lochrasterplatte wäre auch interessant. Vielleicht sieht man da ja eine schlechte Lötstelle, Zinnbrücke etc.
Also mach erst mal einen vollständigen Schaltplan (vom Adapter und
Arduino reicht Blockdarstellung mit den benutzten Pins) und stelle den
hier ein. Ich sehe in dem Drahtverhau auch noch weitere Bauteile (z.B.
Widerstände), diese bitte auch einzeichnen.
Der Drahtverhau führt die uc-pins zur Steckerleiste:
//m328
//d2 d3 d4 d5 d6 d7 b0 b1 b2 b3 b4 b5 ++ -- rst c1 c2 c3 c4 c5
Die Widerstände sind für i2c + ds1820. Funktioniert bzw. nicht bestückt.
alle durchgemessen - alle ok. Status-leds flackern.
Der low Pegel ist zu hoch. Im Netz findet man Vil maximal 0,8V.
Da lieg ich ca. 1V drüber. Wenn der uc das Startbit nicht erkennt kann es nicht funktionieren.
Also muss der Pegel runter - aber wie?
Das Steckbrett habe ich zwischengeschaltet, um Dioden, Widerstände, etc ohne Löten testen zu können. War aber bislang nicht erfolgreich.
Entweder ein Verdrahtungsproblem oder der IC hat einen Treffer. Ist aber eher unwahrscheinlich.
Miss mal die Spannung zwischen der Masse auf dem Adapter und direkt am Arduino. Dort sollten 0V rauskommen, vermutlich aber deine 1,5V.
Das Steckbrett habe ich zwischengeschaltet, um Dioden, Widerstände, etc
ohne Löten testen zu können. War aber bislang nicht erfolgreich.
Vermutlich was falsch verkabelt und ein paar Dioden in die Masse eingeschleift?
Kann es sein, daß du RXD und TXD falsch verbunden hast? TXD sollte ein Eingang am Adapter sein, der mit RXD am Ardino verbunden werden muss und umgekehrt.
Verbinde den UART Adapter durch einen 1kΩ Widerstand mit dem AVR. Zeige uns dann das problematische Signal vor und nach dem Widerstand (dein Oszilloskop hat ja 2 Kanäle).
1
rs485 GND-------------GND M328
2
RXD----[===]--->RX
3
TXD<------------TX
4
VCC-------------Vin
Wenn du keine 1kΩ hast, nimm irgendwas zwischen 1 und 10 kΩ.
Kann es sein, daß du RXD und TXD falsch verbunden hast? TXD sollte ein
Eingang am Adapter sein, der mit RXD am Ardino verbunden werden muss und
umgekehrt.
Hmm, da hab ich wohl Blödsinn geschrieben, wenn die Pfeile der Datenrichtung auf dem Bild vom Adapter korrekt sind.
Fakt:
Der serielle Port ist auf deinem Arduino Nano Klon doppelt belegt. Der USB-UART Chip zieht den Pin im Ruhezustand über einen 1kΩ Widerstand auf HIGH. Außerdem hängt da noch eine LED als zusätzliche Last dran.
Vermutung:
Dein RS485 Board ist nicht defekt sondern zu schwach, das Signal auf LOW zu ziehen. Das Experiment in Beitrag "Re: usart problem mit ttl-Pegel" wird dies bestätigen, wenn ich Recht habe.
Lösungsvorschlag:
Verwende andere Pins, die nicht doppelt belegt sind, und die SoftwareSerial Klasse.
Ich kann nichts dafür, dass der Hinweis sprachlich so formuliert ist.
Lies ihn einfach als: "Bitte für Fotos und Scans das JPG-Format verwenden!".
Nach Lektüre des Artikels über die Bildformate sollte die Begründung klar sind. Sonst könntest du deine Schaltung auch als Video hochladen und bei der Aufnahme dazu noch wild mit der Kamera wedeln.
Ich kann nichts dafür, dass der Hinweis sprachlich so formuliert ist.
Lies ihn einfach als: "Bitte für Fotos und Scans das JPG-Format
verwenden!".
Nach Lektüre des Artikels über die Bildformate sollte die Begründung
klar sind. Sonst könntest du deine Schaltung auch als Video hochladen
und bei der Aufnahme dazu noch wild mit der Kamera wedeln.
Laß doch einfach mal das Gemecker über die Bildformate sein. Wenn die Dir zu groß sind mußt Du sie Dir nicht anschauen. Andere Leute hängen ganze PDF's an, obwohl in den Regeln steht so etwas als Link zu machen - da meckert doch auch keiner.
Vermutung:
Dein RS485 Board ist nicht defekt sondern zu schwach, das Signal auf LOW
zu ziehen. Das Experiment in
Beitrag "Re: usart problem mit ttl-Pegel" wird
dies bestätigen, wenn ich Recht habe.
ich glaube, du hast recht. Ich habe die rx-rx-Verbindung gelöst und den rx-Pegel beim Adapter gemessen. Zu meiner großen Verwunderung ging er bis auf Null runter. Der Adapter ist also ok.
Nach Anschluss des uc geht der low-Pegel auf 1,5V mit einem 1k-Pulldown bekommt man ihn auf 1,2V runter.
Der M328 hat ja 2Usarts. ich werde also auf den anderen usart umlöten.
Viel gelernt - auch über Bildformate - und alle genervt.
Ob die Tx & Rx richtig angeschrieben sind, weiss ich nicht. Es gibt solche Leute die machen das so fuer RS232. Tx, dh dort wo die Daten raus kommen hat ein Ruhepotential, dh nicht angeschlossen, + oder -12 V, kann auch + oder -3 V sein. Rx is nicht angeschlossen auf GND.
Waehrend RS485 differential ist und als GND, Data+, Data- angeschrieben ist.
Ob Rx oder Tx ist die Richtung der Daten, es schalten aber beide Daten.
Tx ist auf der Seite, wo ein Potential, oder ein Datenstrom anliegt im Falle von Stecker weg anliegt. Das kann aber die Seite wechseln.
Bei RS485 fuerhre ich GND, Data+, Data- und die Speisung am Stecker und dem Kabel mit, dann kann man auf der anderen Seite galvanisch trennen und den Trenner mit versorgen.
Bei RS232 fuehre ich genauso, GND, Tx, Rx, und die Speisung auf Stecker und Kabel fuer den Trenner auf der anderen Seite
Du kannst noch mehr lernen: JPEG ist als verlustbehaftetes komprimierendes Verfahren optimal für Fotos aus der realen Welt. Und auch für Screenshots von solchen Fotos.
Für computergenerierte flächige und orthogonal einfarbige Bilder wie z.B. Oszilloskopbilder ist PNG die richtige Wahl.
Wenn es ein Foto eines Oszillogramms wäre, dann wäre JPEG richtig. Es wäre aber auch völlig falsch, ein Foto vom Bildschirm eines Oszis zu machen, das eine Screenshotfunktion hat.
wird alle 4 Sekunden aufgerufen und läuft schon eine ganze Weile ohne dass mir ein Fehler aufgefallen ist. Bei rx-usart geht es ja nur darum, die bits irgendwo im Bereich der 104us zu treffen. Das macht die Funktion mit den delays recht zuverlässig. Für den Fall der Fälle kommt noch ein Abbruch-timer rein aber ich halte das jetzt schon für durchaus brauchbar.
Andere Leute hängen ganze PDF's an,
obwohl in den Regeln steht so etwas als Link zu machen
Das ist mir neu. In welchen Regeln steht das?
Da steht bei Bildformaten, Zitat:"Manchmal ist es angebracht, überhaupt nichts anzuhängen. Beispielsweise ist das oft der Fall bei Datenblättern: Statt die möglicherweise hundertste Version des Datenblattes heraufzuladen, wäre ein Link deutlich angebrachter." Das hier gepostete PDF ist von einer Webseite und da hätte der Link durchaus genügt. Am Ende ist das angehängte PDF mit 852kB auch nur ein Bild.
Mir geht einfach das Rumgemoser einiger Blockwarte, die ansonsten nichts zum Thema beitragen, auf den Zünder. Die Dateigröße, um die es ja bei den Regeln geht, ist doch heutzutage eher zweitrangig. Die Zeiten mit GSM und Co. sind lange vorbei.
Ein UART macht zB 4 fach oder 8 fach oversampling, und schiebt die Werte in einen Buffer rein. 3 von 4 samples muessen richtig sein fuer ein bit. Dann muessen Start und Stop bit stimmen, dass das Byte erkannt wird. Und man darf nicht erwarten, dass die bytes buendig, ohne zwischenraum kommen.
Ist mir aber zu kompliziert. Ich mach das in software:
Was man hier einfach und schnell testen kann. Nach jeder Bitabtastung ein Testpin umschalten. Da kann man auf dem Oszi den Abtastzeitpunkt mit dem Datensignal vergleichen, das geht besonders gut mit dem Muster 0x55 oder 0xCC.
Und wenn die Baudrate sowieso statisch ist, kann man auch ohne Zeilenmarathon sowas schreiben. Der Compiler rechnet das aus und ersetzt die Konstanten.
1
#define RX_BIT_TIME 96
2
#define RX_DATA (PINC & (1<<2))
3
#define TEST_LOW PORTC &= ~(1<<3);
4
#define TEST_TOG PORTC ^= (1<<3);
5
6
uint8_tsub_usart_rx(void)
7
{
8
uint8_tdata=0;
9
TEST_LOW;
10
11
while(RX_DATA);// Warte auf fallende Flanke vom Startbit
Einmal hat es jetzt funktioniert. (Einmal ist der uc hängen geblieben).
Ich möchte das ganze jetzt ausfallsicher machen. Eine crc-Überprüfung soll noch rein.
Weiter möchte ich den uc über den PC steuern. D.h. statt auf dem LCD sollen die Systemwerte auf den PC übertragen werden und die An- und Abschaltbedingungen sollen mittels RS485 auf dem uc-eeprom abgespeichert und von dort abgerufen werden.