INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Datenempfang von Decoderchip
19.01.2015, 17:54
Beitrag #17
RE: Datenempfang von Decoderchip
Hallo,

ein byte Array für die Eingangsdaten sollte funktionieren.

Aber du schreibst in der while-Schleife nicht nur die empfangenen Daten in den Puffer sonder gibst Tag, Monat und Jahr auch nach jedem empfangen Zeichen erneut aus.

Dann fehlt irgendwie noch eine Synchronisierung auf den Telegrammanfang. Je nachdem wann der Arduino gestartet wird kann es passieren dass das erste empfangene Zeichen z.B. der Minutenwert ist und den schreibst du dann in Z[0] !!!

Also das Programm anpassen:

Erst mal alle empfangenen Zeichen verwerfen bis 127 eintrifft. Das natürlich nur einmal nach dem Start des Arduinos. Das geht vermulich am einfachsten in setup().

Dann 12 Byte lesen und in das Array schreiben.

Dann das Array auslesen, die Werte umrechnen und ausgeben.

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.01.2015, 00:58
Beitrag #18
RE: Datenempfang von Decoderchip
Ok hab das Programm jetzt abgeändert kann es leider nicht ausprobieren hab kein DCF Signalempfang (befinde mich zur zeit nicht in Deutschland) denke aber morgen gibts ne Rückmeldung ob es funktioniert.

Was mir bei der Abfrage zum Telegrammende aufgefallen ist das es eigentlich auch so nicht ganz richtig ist --> Grund: 127 - 65 = 62 diese Zahl kann sich allerhöchstens im Jahresbyte befinden sollten wir uns also im Jahr xx62 befinden würde diese Abfrage vermutlich auch nicht gant funktionieren?!?!? Ich hab mir deshalb überlegt ob ich es dann über den DOUT machen soll wo ich über den Pin den Decoderchip ansteure und somit ihm mitteile das er die Daten übertragen soll. Hierbei stellt sich mir aber die Frage ob ich einen Pin von Input auf Output umschalten kann mitten im Programm und dann wieder zurück? Da laut Datenblatt erst überprüft werden muss ob der DOUT Pin auf "HIGH" (INPUT)ist dann muss ich ihn auf "LOW" setzen (Ausgang und LOW) und nach 10 ms fängt der Decoderchip an die Daten zu übertragen (wieder INPUT). Leider weiß ich jetzt nicht ob es möglich ist einen Pin über "pinMode() " auch außerhalb von void setup umschalten darf/kann.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.01.2015, 10:53
Beitrag #19
RE: Datenempfang von Decoderchip
Hi,
meiner Meinung nach liegt der Hauptfehler hier:
Code:
while (Serial.available() >0)
{
for (int n=0;n<12;n++)
{ Z[n]= Serial.read();} //Z0 = START , Z1 = Tag, Z2 = Monat, Z3 = Jahr, .....
Die for-Schleife wird gestartet, sobald mindestens ein Zeichen verfügbar ist. Das Serial.read ist allerdings so schnell, dass bestimmt nicht alle 11 weiteren Zeichen da sind bis 12mal Serial.read abgearbeitet ist. Ich würde erwarten, dass Z[0] normalerweise tatsächlich 126 ist, Z[1] vielleicht noch ok, aber alles andere dürfte auf 255 gesetzt werden. Bei letzterem bin ich mir nicht so sicher, da Serial.read in dem Fall -1 (int) zurückliefert. Wenn man das einem byte zuweist müsste es eigentlich 255 sein. Jedenfalls wartet das read IMHO nicht auf weitere Zeichen.
Um meine Theorie auszuprobieren könntest Du vor die for-Schleife mal ein delay(1000) setzen. Das ist keine gute Lösung, aber zum schnell mal probieren vielleicht nicht schlecht.

(20.01.2015 00:58)Andi89 schrieb:  Was mir bei der Abfrage zum Telegrammende aufgefallen ist das es eigentlich auch so nicht ganz richtig ist --> Grund: 127 - 65 = 62 diese Zahl kann sich allerhöchstens im Jahresbyte befinden sollten wir uns also im Jahr xx62 befinden würde diese Abfrage vermutlich auch nicht gant funktionieren?!?!?
Naja, bis das ein Problem wird vergehen fast 50 Jahre. Das würde ich vorerst mal ignorieren.

Zitat: Ich hab mir deshalb überlegt ob ich es dann über den DOUT machen soll wo ich über den Pin den Decoderchip ansteure und somit ihm mitteile das er die Daten übertragen soll. Hierbei stellt sich mir aber die Frage ob ich einen Pin von Input auf Output umschalten kann mitten im Programm und dann wieder zurück? Da laut Datenblatt erst überprüft werden muss ob der DOUT Pin auf "HIGH" (INPUT)ist dann muss ich ihn auf "LOW" setzen (Ausgang und LOW) und nach 10 ms fängt der Decoderchip an die Daten zu übertragen (wieder INPUT). Leider weiß ich jetzt nicht ob es möglich ist einen Pin über "pinMode() " auch außerhalb von void setup umschalten darf/kann.
Klar kann man das machen. Warum auch nicht? Das Bascom-Beispiel im Datenblatt macht es auch so.
Allerdings, wenn ich das Datenblatt richtig verstehe, sollte man das nicht zu oft machen, da der Controller bei Benutzung von DOUT seine Zeit nur alle 2 Minuten synchronisiert. Ich verstehe zwar nicht, was das soll, aber ich glaube dass sogar drinsteht, dass man TX verwenden soll, wenn man die Uhrzeit dauernd braucht.

Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.01.2015, 14:28 (Dieser Beitrag wurde zuletzt bearbeitet: 20.01.2015 14:35 von Andi89.)
Beitrag #20
RE: Datenempfang von Decoderchip
So hatte inzwischen wieder Signalempfang und es hat leider nicht funktioniert!! Ich hatte die Abfrage auf den Wert 127 aber die danach eingelesenen Werte waren alle total falsch Sad.
Habe deshalb jetzt die Schaltung auf DOUT mal umgebaut. (so wie im Datenblatt vorgegeben mit 27k und 1k Ohm). Ich lasse dann anschließend auf dem Display die ersten 4 Bytes darstellen wobei von den Bytes 1-3 jeweils noch 65 abgezogen wird. Als Ergebnis stimmte nur das für Z1[0] der Wert 126 manchmal ausgegeben wurde.Der ausgegebene Wert für Z1[0] war entweder 0 oder 126. Für Tag, Monat, Jahr kamen wieder total falsche Werte raus. Ich hatte erst die Vermutung das evtl. sich noch falsche Daten im seriellen Buffer befinden deshalb schließe ich am Anfang die serielle Schnittstelle um somit den Speicher zu löschen! Dieser Vorgang hat aber auch keine Verbesserung gebracht

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F,16,2);
byte Z1[12] = {};
byte Tag;
byte Monat;
byte Jahr;
int Signal = 0; // Pinzuweisung RX
int start = 0; // Variable für DOUT auf HIGH Abfrage


void setup()
{
delay(500);
pinMode(Signal, INPUT);
digitalWrite(Signal, HIGH); //interner Pullup aktivieren
lcd.init();
lcd.init();
lcd.backlight();
lcd.home();
lcd.print("Warte auf Sig.");
Serial.end(); // Anfangs serielle Schnittstelle schließen um alle Werte im Buffer zu löschen
do
{
delay(1000);
start = digitalRead(Signal); // Abfrage von DOUT Zustand
if (start == 1)
{
delay(5000);
pinMode(Signal, OUTPUT); //Umschalten auf OUTPUT
digitalWrite(Signal, LOW); // kLOW Signal um Übertragung von Decoderchip zu starten
delay(2); // kurze Pause da LOW für min. 5 uS anliegen muss
pinMode(Signal, INPUT); // Umschalten auf Input
Serial.begin(2400); // Baudrate einstellen
}
} while(start == 0);
lcd.clear();
}



void loop()
{
if (Serial.available() > 0)
{
for (int n=0;n<12;n++)
{
Z1[n]= Serial.read();
}
}
delay(500);
lcd.setCursor(9,1);
lcd.print(Z1[0]); // Anzeigen lassen ob Z1[0] 126 entspricht = START
Tag = Z1[1] - 65;
Monat = Z1[2] - 65;
Jahr = Z1[3] - 65;
lcd.setCursor(0,0);
lcd.print(Tag);
lcd.setCursor(9,0);
lcd.print(Monat);
lcd.setCursor(0,1);
lcd.print(Jahr);
Serial.end();
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.01.2015, 15:34
Beitrag #21
RE: Datenempfang von Decoderchip
Hi,
lies vielleicht nochmal meinen letzten Beitrag. Den Hauptfehler machst Du immer noch.
Außerdem dürfte das, was Du da machst nur einmal kurz beim Einschalten funktionieren. setup() wird nur einmal am Anfang durchlaufen!
Außerdem ist bevor das Gerät eingeschaltet wird, bestimmt noch nichts in irgendeinem Puffer. Ein Serial.end() vor einem begin() macht gar nichts.
Was ich an Deiner Stelle machen würde ist folgendes:
Vergiss erstmal das mit dem LCD. Schließe den Decoder mal nicht an Pin 0 und 1, sonder irgendwo anders an und verwende SoftSerial. Gib dann mal das, was Du von der Uhr empfängst über Serial aus und schau Dir's mal im Serial Monitor an. Das ganze ganz ohne irgendwelche Interpretation, sondern einfach nur die empfangenen Bytes ausgeben.
Dann könnten wir wenigstens mal sehen, ob der Hardware-Aufbau stimmt und ob das ganze im Prinzip funktioniert.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.01.2015, 19:40 (Dieser Beitrag wurde zuletzt bearbeitet: 20.01.2015 19:43 von Andi89.)
Beitrag #22
RE: Datenempfang von Decoderchip
sorry hab deinen Post erst nach meinem gesehen ! Also das mit dem delay vor der "for" Schleife hat nichts gebracht! Habe jetzt das mit dem SoftSerial gemacht. Das Ergebnis Alle Bytes passen bis auf den Wochentag der wurde die ersten paar male noch falsch übertragen aber nach der 6-7 Minute wars dann richtig! Zuerst hab ich es ohne Array gemacht ( und festgestellt das es eigentlich 14 Bytes sind nach dem 127 folgen noch 2 weitere sind dann die im Datenblatt genannten Zeilenvorschübe??) und anschließend mit Werte zuerst in ein Array. dort ist Anfangs auch alles richtig bis auf den Monat da gibt er momentan noch den falschen Wert aus denke aber das es in ein paar Minuten auch richtig ausgegeben wird. Habe dies jetzt aber über den TX Ausgang gemacht ( direkt von Decoder TX auf PIN13 beim Arduino). Da es evtl dann den Bytes 13 und 14 liegt ändere ich jetzt mal das Array und schaue mal was passiert wobei ich grad noch glaube das sich nichts ändert da ja sonst trotzdem beim ersten Durchlauf die ersten 12 Bytes richtig sein müssten.

#include <SoftwareSerial.h>

byte Z1[14] = {};
SoftwareSerial DCF(13, 12);

void setup()
{
Serial.begin(9600);
DCF.begin(2400);
}


void loop()
{
if(DCF.available() > 13)
{
for (int n = 0;n<14;n++)
{
Z1[n] = DCF.read();
}
Serial.println(Z1[0]);
for (int i = 1; i <11;i++)
{
Serial.println(Z1[i]);
}
Serial.println(Z1[11]);
}
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.01.2015, 22:07 (Dieser Beitrag wurde zuletzt bearbeitet: 20.01.2015 22:12 von Andi89.)
Beitrag #23
RE: Datenempfang von Decoderchip
So ich habe eine gute Nachricht zu überbringen!! Ich hab das Programm jetzt umgeschrieben und angepasst (habe die SoftSerial für das TX Signal benutzt) und siehe da es funktioniert von Zeit über Datum wird jetzt richtig am Display angezeigt Smile. Allerdings muss man aber dazu sagen das sich ab und zu Fehler einschleichen bei den Bytes vom Decoderchip ich mache immer wieder die Beobachtung das auf einmal falsches Jahr , Tag oder sonstiges mal für 1-2 Zyklen falsch ist. Bin mir aber nicht sicher ob das empfange Signal hier einfach gestört wird durch eine andere Frequenz (befinde mich in Großbritannien). Aber trotzdem danke euch allen für die mega hilfreiche Unterstützung!! Aber jetzt hab ich trotzdem schon die nächste Frage gibt es eigentlich beim Arduino auch eine interne Uhr mit der ich die synchronisieren kann oder Library dazu?? Die zweite Frage ist da diese Schaltung mal ein Solarbetriebener Wecker werden soll und sich im Haus befindet ist das ganze sehr auf Strom sparen ausgelegt. Wenn ich den Decoderchip mit 3.3V betreibe und den Arduino mit 5V würde das TX Signal dann trotzdem richtig ausgewertet werden oder sollte man solche Verbindungen möglichst unterlassen? Mein Plan ist soviel wie möglich mit 3.3V zu betreiben. Nur mein LCD Display brauch auf jedenfall 5V da ist dann auch noch die Erfahrung zu machen ob es geht wenn Arduino 3.3V den LCD (5V) über I2C ansteueren kann oder ob das fehlerhaften Daten führt
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste