Forum: Mikrocontroller und Digitale Elektronik Seltsames Phänomen bei serieller Übertr. ESP8266 - MBus 2. Versuch


von Christian B. (cb1969)


Angehängte Dateien:

Lesenswert?

Schönen Nachmittag

Ich versuche meinen Kaifa-Zähler (EVN) über den MBus auszulesen.
Den zugehörigen Schlüssel hat mir der Netzbetreiber zugeschickt und ich 
habe ihn mit diesem Sketch
https://github.com/micronano0/ESP8266-NodeMCU-KAIFA-SmartMeter-Reader-STV-
auf einem ESP8266 D1 mini verwendet.
(Aufbau Bild 1)

Ergebnis: Keine Daten.

Dann habe ich den Sketch auf die reine serielle Übertragung 
zusammengestutzt und gebe das Ergebnis auf einem kleinen Display aus:
1
#include <Adafruit_SSD1306.h>
2
3
#define SCREEN_WIDTH 128 // OLED display width, in pixels
4
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
5
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
6
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
7
8
byte incomingByte = 0; // for incoming serial data
9
10
void setup() {
11
  Serial.begin(2400, SERIAL_8E1); // opens serial port, 
12
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
13
  display.clearDisplay();
14
  display.setTextSize(1);      // Normal 1:1 pixel scale
15
  display.setTextColor(WHITE); // Draw white text
16
  display.setCursor(0, 0);
17
  display.println("Kaifa: ");
18
  display.display();
19
  delay(300);
20
}
21
22
void loop() {
23
  // send data only when you receive data:
24
  if (Serial.available() > 0) {
25
    // read the incoming byte:
26
    incomingByte = Serial.read();
27
28
    // say what you got:
29
    //Serial.print("I received: ");
30
    //Serial.println(incomingByte, HEX);
31
  display.print(incomingByte, HEX);
32
  display.print(" ");
33
  display.display();
34
  }
35
}

Der Zähler sendet alle 5 sek. ein Paket von 482Byte mit 2400E81.

Beim ESP kommen davon nur zweimal 68 FF (mit einer kurzen Pause) davon 
an.

Schließe ich einen RS232-Adapter an den MBusAdapter an (Bild 2) und 
lassen den PC (mit HTerm) empfangen, bekomme ich die gesamten Daten. 
(Bild 3)

Schließe ich den RS232-Adapter an den ESP an und sende die (vorher vom 
Zähler empfangene) Datei vom PC zum ESP8266, kommt auch alles an.

Nur vom Zähler direkt zum ESP bleiben nur die besagten 4 Byte übrig ... 
:(

Hat wer eine Idee?
Danke fürs Lesen
Christian

von Stefan F. (Gast)


Lesenswert?

Ich sehe, dass du innerhalb der Verarbeitungs-Schleife
1
if (Serial.available() > 0) {
2
   incomingByte = Serial.read();
3
   ...
4
}

Ausgaben auf das Display machst. Diese brauchen signifikant Zeit, 
deswegen brauchst du einen Puffer am seriellen Port. Vermutlich ist der 
vorhanden, aber ist er auch groß genug?

Ändere den Code mal so dass display.display() verzögert aufgerufen wird. 
Und zwar nachdem alle Bytes verarbeitet wurden, also Serial.available() 
== 0 ist.

von Christian B. (cb1969)


Lesenswert?

Leider keine Besserung
1
#include <Adafruit_SSD1306.h>
2
3
#define SCREEN_WIDTH 128 // OLED display width, in pixels
4
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
5
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
6
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
7
8
byte incomingByte = 0; // for incoming serial data
9
10
void setup() {
11
  Serial.begin(2400, SERIAL_8E1); // opens serial port, 
12
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
13
  display.clearDisplay();
14
  display.setTextSize(1);      // Normal 1:1 pixel scale
15
  display.setTextColor(WHITE); // Draw white text
16
  display.setCursor(0, 0);
17
  display.println("Kaifa: ");
18
  display.display();
19
  delay(300);
20
}
21
22
void loop() {
23
  // send data only when you receive data:
24
  if (Serial.available() > 0)
25
  {
26
    // read the incoming byte:
27
    incomingByte = Serial.read();
28
29
   display.print(incomingByte, HEX);
30
   display.print(" ");
31
  }
32
  else
33
  {
34
  display.display();    
35
  }
36
}

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Wie hoich ist die Leerlaufspannung (ohne Datenübertragung) an Rx und Tx 
zwischen den beiden Boards?

von Christian B. (cb1969)


Lesenswert?

Ich fürchte, ich verstehe nicht was Du meinst.

TX (vom MBus-Board) und RX (vom ESP) sind verbunden, somit (erwartbare) 
0.000V

Und da der Zähler nur sendet ist die Gegenrichtung nicht verbunden.

Oder was meintest Du?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Hast du ein Oszilloskop, um mal zu kontrollieren, was sich denn dort 
real auf der RX-Leitung des µC abspielt?

Denn ohne ein solches Messgerät wirst du bei seriellen Bussen laufend im 
Blindflug mit Herumbastlen die Fehler suchen müssen. Dort im 
Beitrag "Re: UART Übertragungsfehler bei bestimmten Zahlenwerten" sind solche Fälle 
verlinkt.

Christian B. schrieb:
> Ich fürchte, ich verstehe nicht was Du meinst.
Ein Schaltplan wäre nicht schlecht. Denn mit Fotos vom Aufbau muss man 
erst noch die Module und deren Pinbelegung herauskramen und sich in 
Gedanken diesen Schaltplan aufmalen. Das tue ich mir ehrlich gesagt 
nicht an. An einem Schaltplan sieht man fundamentale Designflaws auf 
einen Blick...

: Bearbeitet durch Moderator
von Christian B. (cb1969)


Angehängte Dateien:

Lesenswert?

Sieht so aus als ob mehr als nur die "4 Byte" übertragen würden.

Der Pegel zwischen den Datenpaketen ist 3V3 (das wolltest Du, Stefan, 
vermutlich wissen)
Und es werden die ganze Zeit (nicht mit einer Pause wie bei den 
Empfangenen beiden "68 FF") Daten gesendet.

von Stefan F. (Gast)


Lesenswert?

Christian B. schrieb:
> TX (vom MBus-Board) und RX (vom ESP) sind verbunden, somit (erwartbare)
> 0.000V

Eben nicht. UART Rx und Tx Leitungen müssen im Ruhezustand auf HIGH 
Pegel sein, also idealerweise 3,3 Volt. Alles was davon abweicht könnte 
ein Hinweis auf die Fehlerursache sein.

Christian B. schrieb:
> Der Pegel zwischen den Datenpaketen ist 3V3 (das wolltest Du, Stefan,
> vermutlich wissen)

Genau. Der HIGH Pegel sieht plausibel aus, aber der LOW Pegel ist mit 
seinen >2 Volt viel zu hoch. Da würde ich weniger als 0,5 Volt erwarten.

von Christian B. (cb1969)


Lesenswert?

Ja. Siehe meine Antwort ober Deiner.
Ist ~3V3.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Christian B. schrieb:
> Der Pegel zwischen den Datenpaketen ist 3V3
Passt.

Aber bei den Daten kommt der Pegel ja nicht  annähernd auf 0V. Für mich 
ist das eine klassische Buskollision.

: Bearbeitet durch Moderator
von Christian B. (cb1969)


Lesenswert?

Stefan F. schrieb:
> Genau. Der HIGH Pegel sieht plausibel aus, aber der LOW Pegel ist mit
> seinen >2 Volt viel zu hoch. Da würde ich weniger als 0,5 Volt erwarten.

Du wirst sicher recht haben.
Fragt sich nur, warum dann reproduzierbar immer "68 FF" kommt, und der 
ganze Rest nicht ...

von Stefan F. (Gast)


Angehängte Dateien:

Lesenswert?

Kontrolliere, ob die Stromversorgungs-Schienen des Steckbrettes an den 
markierten Stellen unterbrochen sind. Das ist bei einigen Steckbrettern 
der Fall.

Wenn sie bei dir unterbrochen sind, dann fehlt bei dir eine GND 
Verbindung, was die Ursache für die falschen LOW Pegel sein könnte.

von Christian B. (cb1969)


Lesenswert?

Lothar M. schrieb:
> Für mich ist das eine klassische Buskollision

Kollision womit?
Ich messe mal den TX ohne ESP ...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Stefan F. schrieb:
> Kontrolliere, ob die Stromversorgungs-Schienen des Steckbrettes an den
> markierten Stellen unterbrochen sind.
Also einfach mal die Spannung an allen Massepins der Module 
gegeneinander messen. Da muss immer 0V herauskommen.

Christian B. schrieb:
> Ich messe mal den TX ohne ESP ...
Tu das.

: Bearbeitet durch Moderator
von Christian B. (cb1969)


Lesenswert?

Sobald ich vom ESP den RX abstecke geht der Pegel am Mbus-Board beim 
Senden fast auf 0.

Wahrscheinlich muss ich erst den RX als Eingang definieren? (Hätte 
gedacht, das ist er per default ...)

von Stefan F. (Gast)


Angehängte Dateien:

Lesenswert?

Du hast den Rx Eingang des ESP8266 doppelt belegt.

Um das internet Signal (vom USB-UART) durch externe Beschaltung (dein 
MBus Board) zu übersteuern, muss deine Quelle einen kräftigen 
niederohmigen Ausgang haben. Hat es aber nicht.

Du brauchst einen Buffer zwischen den beiden Boards, z.B. 74HC125

von Christian B. (cb1969)


Lesenswert?

Das klingt sehr plausibel und erklärt eigentlich auch die 
Reproduzierbarkeit.
Zu Beginn des Datenpaketes gehen die Signalspitzen ein wenig weiter 
Richtung 0V und steigen dann rasch an.

Das werden die ersten beiden Byte sein, die gerade noch so durchkommen. 
Dann ist Sense.

Vielen Dank für eure Hilfe
Christian

von Jens M. (dl4aas) Benutzerseite


Lesenswert?

...es gibt auch Wemos Boards, bei denen der Widerstand auf 150Ohm 
reduziert wurde. Daran bin ich mit einem Auswerter für einen Stromzähler 
zunächst gescheitert. Widerstand vergrößert und es lief wieder...

Jens

von Christian B. (cb1969)


Lesenswert?

Nachdem ich ja genügend Ports frei habe, werde ich auf SoftwareSerial 
wechseln, hatte aber noch nicht die Zeit das zu testen.

LG
C.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.