Arduino 2560 / Datenverlust bei Hardware-UART und SPI

OP #7467844
Lesenswert?

Hallo in die Runde!

Ich suche seit Tagen die Ursache für folgenden Fehler:

Ich habe mit einem Arduino Nano (und Pro Micro) mittels Software-Uart problemlos die Signale eines SmartMeter-IR-Kopfs auslesen können. Keine Fehler, keinen Datenverlust. Da die Daten in meinem kleine Projekt nach der Auswertung noch gespeichert (eeprom) und dann auf SD-Karte ausgegeben werden sollen bin ich auf einen Arduino Mega 2560 (Clone) umgestiegen (echte Usart, mehr Speicher usw). Die per i2c angebundenen eeprom und RTC laufen problemlos, der SD-Kartenleser erst nachdem ich einen Levelconverter (mit TXS0108E) dazwischen geschaltet habe. Während der Programmentwicklung hab ich vom PC per Python-Programm mittels FTDI-USB-Serial-Adapter (FT232RL) einen Datenstrom vom SmartMeter simuliert. Dieser wurde auch ohne Probleme vom Atmega-Hardware-Uart eingelesen/verarbeitet (egal bei welchem).

Sobald ich aber den echten Lesekopf (sowohl BitShake als auch von volkszaehler) anschließe kommt beim Atmega-Uart nur Datenmüll an. (Die Leseköpfe sind ok, denn die "kleinen" Atmegas als auch ein Rasp Pi Pico lesen (mit gleichem Kopf, gleichem Kabel) saubere Daten ein). Ein Zwischenschalten des Levelconverter (mit TXS0108E) bringt keine Verbesserung auch ein Schaltung per Mosfet bringt nichts. Es kommen nur verstümmelte Daten an (damit CRC-Fehler). Gleiches Problem mit einem anderen Board mit Atmega256!

Daher meine Fragen an Euch:

Ist ein problematisches Verhalten bei den Hardware-Uarts und/oder SPI-Pins vom Atmega256 bekannt? Er sollte doch "normale" 5-V-Signale analog den "kleineren" Atmegas verarbeiten können?

Hat jemand eine Idee oder Erfahrung, wie eine Schaltung aussehen könnte, die saubere Daten beim Atmega256 ankommen?

Vorab schon ein "Danke" für Eure Bemerkungen! Grüße Stefan

OP #7467857
Lesenswert?

Hallo!

(Sorry für die Verzögerung - als NewBie in dem Forum hab ich eine Zeitsperre)

Einen Schaltplan habe ich noch nicht gezeichnet bzw. nur als Bleistift-Skizze. Anbei der Aufbau als Bild. Per RJ11-Anschluss gehen die Daten direkt zum UART-PIN!

Das gleiche Problem habe ich aber auch wenn der RJ11-Anschluss ohne Breadboard direkt an den Uart-RX-PIN geht (beide 256er-Boards)

Angehängte Dateien:
OP #7467895
Lesenswert?

Ja, gleicher Aufbau (FTDI), gleiche Kabel, gleiche Datenstrom. Alle Boards (auch 256er) bekommen Daten und werten korrekt aus.

Gleicher SmartLeser-Kopf, gleiche Kabel, gleicher Aufbau/Verkabelung: Alle Boards außer(!) die 256er bekommen Daten, werten korrekt aus und CRC stimmen!

Daher meine Frage, ob jemand die Erfahrung gemacht hat, dass der Atmega256 bekannte Zicken hat oder Besonderheiten bzgl. dem Anschluss an den UARTS zu beachten sind!? Hab nirgends Hinweise dazu gefunden?!

Da der RaspPi Pico kein Probleme macht und genug Speicher und PINs / Schnittstellen hat werde ich wohl meine Software für den RaspPi umschreiben.

#7468153
Lesenswert?

Ich wüsste nicht, dass Serial1/2/3 auf dem Arduino Mega 2560 Probleme machen. Wenn du die SPI-Schnittstelle benutzt (also TwoWire.h), dann mag es nötig sein, vorher pinMode(53,OUTPUT) aufzurufen. Aber es ist lang her, dass ich was mit dem Arduino Mega 2560 gemacht habe, und womöglich wird das inzwischen auch schon von der Arduino-Bibliothek gemacht ...

LG, Sebastian

OP #7468164
Lesenswert?

Danke Sebastian! Ich wollte mit meinem Beitrag die Runde nur rückversichern ob ich an einem allgemein bekannten Problem scheitere oder wohl eher an meinem Aufbau/Auswahl Komponenten liegt! (Was ich nun eher vermute)

Ich denke, ich verschwende keine Zeit mehr mit dem Atmega sondern mach meine Portierung auf dem Rasp Pi Pico weiter! Da der Code nur an wenig Stellen wirklich Hardware-abhängig ist dürfte das bald erledigt sein und läuft schon zum Teil! Auf zu neuen Ufern :-)

Danke+VG Stefan

#7468167
Lesenswert?

Stefan H. schrieb:

Ich denke, ich verschwende keine Zeit mehr mit dem Atmega sondern mach meine Portierung auf dem Rasp Pi Pico weiter!

Äh, das ist nicht sinnvoll. Denn Du hast da entweder ein Hardwareproblem mit Deinem Aufbau oder aber ein Softwareproblem.

Die durch Vermeidung zu umgehen, hilft zwar unmittelbar das Ziel zu erreichen, lässt Dich beim nächsten Auftreten von Problemen aber genauso hilflos zurück.

Finde den Fehler. Nimm ein Oszilloskop, sieh Dir an, wie das Signal aussieht.

Sieh Dir zum Vergleich an, wie Dein mit einem FT232 erzeugtes Alternativsignal aussieht.

Verwendest Du auf dem RP2040 ebenfalls Softwareserial oder eine Hardware-UART?

Hast Du geprüft, ob Deine Variante mit dem Arduino Nano auch mit Deiner vom FT232 erzeugten Simulation funktioniert?

#7468173
Lesenswert?

Ich benutze auch die 4 UARTs des ATmega2560, sie funktionieren einwandfrei. Ich hab mir allerdings nicht irgendwas aus dem Web geladen, sondern die FIFOs selber programmiert, ist ja nicht aufwendig. Ich benutze ein Baudratenquarz 14,7456MHz, damit gehen auch hohe Baudraten ohne Rundungsfehler: 14,7456MHz / 16 / 230400 Baud = 4,0

#7468182
Lesenswert?

Kann gut sein, daß Dein SmartMeter TTL-Pegel liefert, der PC liefert aber RS-232 Pegel, d.h. ein invertiertes Signal. Bei einer SW-UART kann man oft einstellen, ob invertiert oder nicht, bei der HW-UART ist das fest. Miß einfach mal die Spannnung an TXD im Ruhezustand. TTL: +3V .. +5V RS-232: -6 .. -12V

Gast #7468206
Lesenswert?

Stefan H. schrieb:

Ein Oszi hab ich noch nicht hingehängt!

Ohne ist das aber ein Ratespiel mit Zufallsserfolgen. Kein Oszi, kein HW debugger, nicht mal die Rohdaten aus dem uart angesehen. Nur aufs Ergebniss nach CRC geschaut.

Sende von Deinem AVR aus Daten die man leicht analysieren kann. Nur 1 nur 0 oder 01 Wechsel, 0xFF, 0xAA, 0x00. Zähle die Frames mit dem Oszi aus und überprüfe ob ALLE Parameter stimmen. (9200bps, 8n1). Sei EXAKT bei der Zeitbestimmung des Frames und lese sorgfältig wie eine Uart Übertragung aufgebaut ist. Vergleiche wie Deine Übertragung aussieht und wie die der Gegenseite. Gleiche Daten, gleiche Pegel, gleiches Timing. Fehler sollten Dir so sofort ins Auge springen. Ungefähr die Länge eines 8n1 Bytes mit 9600bps reicht nicht. Erst dann kanst Du Dir sicher sein das der AVR auch genau das empfängt.

Welcher Art sind die Fehler? Störungen verhageln einzelne Frames aber hin und wieder kommt das richtige an. Falsche Übertragungsparameter produzieren konstanten Datenmüll.

Nein, es liegt nicht daran das die Uart HW nicht korrekt funktionieren würde. Der Uart ist ein so zentrales Element und Du macht etwas derart triviales damit, das solche Fehler als erstes auffallen würde. Außerdem gibt es für bekannte Bugs die chip errata, wenn Du dir unsicher bist. Anfänger suchen immer gleich beim Chip, haben aber vorher alle etablieretn Methoden ausgelassen ihre eigenen Fehler zu finden.

OP #7468225
Lesenswert?

Hallo! Die Pro Mini in meinem Bestand haben einen Atmega328P (ohne B) und damit nur einen HW-Uart! Eine Schnittstelle für die Konsole/User-Interface/Programmierung, eine für den Sensor war mein Plan! Den Anschluss Sensor an Soft-Sio, RTC und eeprom per i2c funktionierte gut, für den Export auf SD-Card (SPI) wurde mir RAM/EPROM zu eng! Daher auch der Wechsel auf ein größeres Board!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren