Hilfe zum Programm, welches eine Uhr steuern soll

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 25 11 2024  20:35:38      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte


Autor
Hilfe zum Programm, welches eine Uhr steuern soll

    







BID = 906136

Jabo

Neu hier



Beiträge: 29
Wohnort: Köln
 

  


Hallo,

ich bin gerade dabei mir eine große DigitalUhr zu basteln.
Ist auch alles soweit fertig, jedoch habe ich noch einige Probleme mit dem Programm.

Ich benutze einen Arduino um die Uhr zu steuern. Klappt auch soweit außer, dass

- beim Drücken des Kopfes um die Stunden bzw Minuten einzustellen,es viel zu schnell geht und man es dann nicht genau einstellen kann

- die Uhr geht am Tag 3 Minuten nach (liegt bestimmt an den ganzen If-Abfragen, die ja auch ''Zeit'' brauchen)

Hab in der Schule etwas Java gelernt jedoch wohl nicht gut genug um die Probleme zu lösen. Hoffe ihr könntet mir ein paar Tipps geben.

Wäre euch sehr dankbar!

Grüße,
Jannis

Hier das Programm (Ich habe den Kopf mal weggelassen) :

void loop() {
unsigned long currentMillis = millis();

if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
sek++;
if (sek>=60){
Serial.print("+Minute");
mint++;
sek=0;
}
if (mint>=60){
Serial.print("+Std");
std1++;
mint=0;
}
if (std1>=24){
Serial.print("+Tag");
std1=0;
}


set();

if(on){
digitalWrite(50, LOW); // Die zwei Lampen in der Mitte, die blinken sollen
digitalWrite(51, LOW);
on=false;
}else {
digitalWrite(50, HIGH);
digitalWrite(51, HIGH);
on=true;
}
}


if (digitalRead(52)==HIGH){ // Kopf zum verstellen der Minute
minute();
}
if (digitalRead(53)==HIGH){ // Stundenknopf
stunde();
}
}

void minute(){
mint++;
if (mint>=60){
std1++;
mint=0;
}
if (std1>=24){
std1=0;
}
set();
}

void stunde(){
std1++;
if (std1>=24){
std1=0;
}
set();
}

void set(){
int stddd = std1;
if(stddd>=10)
stddd/=10;
else if(stddd<10)
stddd=0;
set(7,(stddd));
set(0,(std1%10));

int mintt = mint;

if(mintt>=10)
mintt= mintt/10;
else if(mintt<10)
mintt=0;

Serial.println("SET");
Serial.println(mintt);
Serial.println("SET");
set(14,(mintt));
set(21,(mint%10));
}

void set(int x, int zahl){

if(zahl==0){
digitalWrite((1+x), HIGH);
digitalWrite((2+x), HIGH);
digitalWrite((3+x), HIGH);
digitalWrite(( 5+x), LOW);
digitalWrite((4+x), HIGH);
digitalWrite((6+x), HIGH);
digitalWrite((7+x), HIGH);

Serial.println("NULL");
}
else if (zahl==1){

digitalWrite((1+x), LOW);
digitalWrite((2+x), LOW);
digitalWrite((3+x), HIGH);
digitalWrite((5+x), LOW);
digitalWrite((4+x), LOW);
digitalWrite((6+x), LOW);
digitalWrite((7+x), HIGH);
Serial.println("EINS");
}
else if (zahl==2){

digitalWrite((1+x), LOW);
digitalWrite((2+x), HIGH);
digitalWrite((3+x), HIGH);
digitalWrite((5+x), HIGH);
digitalWrite((4+x), HIGH);
digitalWrite((6+x), HIGH);
digitalWrite((7+x), LOW);
}
else if (zahl==3){

digitalWrite((1+x), LOW);
digitalWrite((2+x), HIGH);
digitalWrite((3+x), HIGH);
digitalWrite((5+x), HIGH);
digitalWrite((4+x), LOW);
digitalWrite((6+x), HIGH);
digitalWrite((7+x), HIGH);
}
else if (zahl==4){

digitalWrite((1+x), HIGH);
digitalWrite((2+x), LOW);
digitalWrite((3+x), HIGH);
digitalWrite((5+x), HIGH);
digitalWrite((4+x), LOW);
digitalWrite((6+x), LOW);
digitalWrite((7+x), HIGH);
}
else if (zahl==5){

digitalWrite((1+x), HIGH);
digitalWrite((2+x), HIGH);
digitalWrite((3+x), LOW);
digitalWrite((5+x), HIGH);
digitalWrite((4+x), LOW);
digitalWrite((6+x), HIGH);
digitalWrite((7+x), HIGH);
}
else if (zahl==6){

digitalWrite((1+x), HIGH);
digitalWrite((2+x), HIGH);
digitalWrite((3+x), LOW);
digitalWrite((5+x), HIGH);
digitalWrite((4+x), HIGH);
digitalWrite((6+x), HIGH);
digitalWrite((7+x), HIGH);
}
else if (zahl==7){

digitalWrite((1+x), LOW);
digitalWrite((2+x), HIGH);
digitalWrite((3+x), HIGH);
digitalWrite((5+x), LOW);
digitalWrite((4+x), LOW);
digitalWrite((6+x), LOW);
digitalWrite((7+x), HIGH);
}
else if (zahl==8){

digitalWrite((1+x), HIGH);
digitalWrite((2+x), HIGH);
digitalWrite((3+x), HIGH);
digitalWrite((5+x), HIGH);
digitalWrite((4+x), HIGH);
digitalWrite((6+x), HIGH);
digitalWrite((7+x), HIGH);
}
else if (zahl==9){

digitalWrite((1+x), HIGH);
digitalWrite((2+x), HIGH);
digitalWrite((3+x), HIGH);
digitalWrite((5+x), HIGH);
digitalWrite((4+x), LOW);
digitalWrite((6+x), HIGH);
digitalWrite((7+x), HIGH);

}
}


BID = 906223

Offroad GTI

Urgestein



Beiträge: 12742
Wohnort: Cottbus

 

  

Ich würde mal die Real Time Clock in die Runder werfen wollen.




_________________
Theoretisch gibt es zwischen Theorie und Praxis keinen Unterschied. Praktisch gibt es ihn aber.

BID = 906225

Her Masters Voice

Inventar


Avatar auf
fremdem Server !
Hochladen oder
per Mail an Admin

Beiträge: 5308
Wohnort: irgendwo südlich von Berlin

dann werf ich noch einen DCF77 Empfänger dazu...

BID = 906234

der mit den kurzen Armen

Urgestein



Beiträge: 17434


Offtopic :
so ein Quatsch mit der Auswertung des Zeitzeichensenders DCF77 fällt das stellen der Uhr ja weg. Es reicht wenn der µC sich neu Syncronisiert und das aktuelle vollständige Datenpaket übernimmt. Und wenn schon ein DCF77 Empfänger vorliegt, sollte auch der Takt von da bezogen werden. [ot]
Das Zeitdiagramm des DCF77 ist im Netz verfügbar.


_________________
Tippfehler sind vom Umtausch ausgeschlossen.
Arbeiten an Verteilern gehören in fachkundige Hände!
Sei Dir immer bewusst, dass von Deiner Arbeit das Leben und die Gesundheit anderer abhängen!

BID = 906239

winnman

Schreibmaschine



Beiträge: 1628
Wohnort: Salzburg


Eingang Impulsauswertung und zusätzlich auswerten nach zB 0,5s.

Innerhalb der 0,5s nur um 1 Verstellen.
Kommen innerhalb der 0,5s mehrere Impulse, die ignorieren.
Steht länger als 0,5 der Eingang an, dann mit selbst generiertem Takt hochzählen.

BID = 906270

Jabo

Neu hier



Beiträge: 29
Wohnort: Köln

Vielen Dank für die Tipps!

Das mit den Knöpfen fürs Verstellen der Zeit hat geklappt - funktioniert

Mit der Zeit bin ich noch nicht wirklich weiter gekommen. Die Uhr nach dem DCF77 Signal zu steuern hört sich super an ist aber für meine Zwecke etwas zu aufwendig.

Das ''Real Time Clock'' Modul habe ich auch schonmal gesehen.
Aber wie genau funktioniert es?
Ich bin leider nicht so gut im Progamieren und habe auch bei Google keine Beispielcodes gefunden, die ich verstehe.
Ist das eher einfach das in mein Programm einzuarbeiten oder würde das bedeuten, dass ich besser ein komplett neues schreiben müsste (habe ziemlich lange für das Jetzige gebraucht :D)

Gibt es vielleicht eine Möglichkeit die Zeitdifferenz, die die ganzen Abfragen brauchen ausrechnen zu lassen? Dann könnte man die zB. nach allen 10 min auf die aktuelle Zeit addieren lassen.

Grüße,

Jannis


BID = 906275

Her Masters Voice

Inventar


Avatar auf
fremdem Server !
Hochladen oder
per Mail an Admin

Beiträge: 5308
Wohnort: irgendwo südlich von Berlin

mit deiner Methode wirst du nie eine halbwegs genaue Uhr hinbekommen, also freunde dich schonmal damit an was komplett Neues zu schreiben.

BID = 906310

Jabo

Neu hier



Beiträge: 29
Wohnort: Köln

Mist, dann war die Arbeit wohl umsonst

Denk ihr das würde auch gehen?

http://www.amazon.de/DS1307-wirklic.....clock

Dann werd ich das mal bestellen und mich da einlesen.

Grüße,

Jannis

BID = 906311

der mit den kurzen Armen

Urgestein



Beiträge: 17434

Wenn du Wert auf genau Zeit legst sollte auch diese Uhr sich mit dem DCF77 synchronisieren.
Also warum nicht gleich ein DCF77 Modul nehmen ?

_________________
Tippfehler sind vom Umtausch ausgeschlossen.
Arbeiten an Verteilern gehören in fachkundige Hände!
Sei Dir immer bewusst, dass von Deiner Arbeit das Leben und die Gesundheit anderer abhängen!

BID = 906312

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach


Zitat :
Gibt es vielleicht eine Möglichkeit die Zeitdifferenz, die die ganzen Abfragen brauchen ausrechnen zu lassen?
Bei Verwendung des Hardwaretimers wird das nicht nötig sein, denn der läuft ja unabhängig von deinem Programm im Hintergrund.
Nur solltest du vermeiden an dem Timer herumzudrehen; allein das Auslesen ist erlaubt.
Irgendwann wir es dann einen Überlauf geben, den must du eben programmtechnisch berücksichtigen.

Ein Fehler von in der Größenordnung von etlichen Sekunden, aber weniger als 1 Minute am Tag kann auch auf der Ungenauigkeit des verwendeten Quarzes beruhen. Typischerweise sind die Quarzoszillatoren von Microcontrollern nicht genauer.
Wenn es genauer gehen soll, wird man normalerweise die Quarzfrequenz mit einem einstellbaren Kondensator genau auf die Sollfrequenz "ziehen". Alternativ kann man auch der Software die wahre Quarzfrequenz mitteilen.
Wenn du das DCF-Signal zur Verfügung hast, kannst du ja leicht den Unterschied zwischen der Arduino-Sekunde und der DCF-Sekunde ermitteln.






[ Diese Nachricht wurde geändert von: perl am 19 Nov 2013 23:41 ]

BID = 906320

hajos118

Schreibmaschine



Beiträge: 2453
Wohnort: Untermaiselstein


Zitat :
perl hat am 19 Nov 2013 23:41 geschrieben :


Ein Fehler von in der Größenordnung von etlichen Sekunden, aber weniger als 1 Minute am Tag kann auch auf der Ungenauigkeit des verwendeten Quarzes beruhen. Typischerweise sind die Quarzoszillatoren von Microcontrollern nicht genauer.

... und tückischerweise auch noch temperaturabhängig...

_________________
Interpunktion und Orthographie dieses Beitrags sind frei erfunden.
Eine Übereinstimmung mit aktuellen oder ehemaligen Regeln wäre rein zufällig und ist nicht beabsichtigt.
Wer einen Fehler findet, darf ihn behalten!

BID = 906354

Murray

Inventar



Beiträge: 4857


Zitat :
Offroad GTI hat am 19 Nov 2013 17:28 geschrieben :

Ich würde mal die Real Time Clock in die Runder werfen wollen.


Oder die hier
http://www.elv.de/i-c-realtime-clock-i2c-rtc-komplettbausatz.html
Die kannst gleich aufstecken beim Uno (Buchsenleisten nicht vergessen).

[ Diese Nachricht wurde geändert von: Murray am 20 Nov 2013 14:26 ]

BID = 906419

winnman

Schreibmaschine



Beiträge: 1628
Wohnort: Salzburg

Bei DCF77 solltest du doch auch relativ einfach einen Sekunden oder Minutenimpuls erhalten.

Jetzt deine interne Uhr ein bisschen schneller machen und dann erst beim eintreffen des Impulses wider neu starten.

(So arbeiten die Nebenuhren mit Sekundenzeiger einer Zentraluhrenanlage oft).

Du musst halt schauen, dass du nach 59,5 Sekunden mit deinem Kram durch bist. Erst wenn der Minutenimpuls vom DCF77 kommst gehst du in die nächste Runde.

Kommt nach 61s kein Impuls musst du dann auf möglichst genau 60s in deinem Programm kommen.

Das hat nur den Nachteil, dass bei DCF77 Signalausfall danach die Uhren nicht mehr auf die tatsächliche Zeit gestellt werden.

Aber zur vollen Stunden und ich glaub 1x am Tag gibt's da doch noch andere eindeutige Signale mit denen dann nochmal eine Art Reset gemacht werden kann.

BID = 906546

der mit den kurzen Armen

Urgestein



Beiträge: 17434

Spätestens nach 3 Min sollte auch der µC das volle gültige Datenpaket haben. Schließlich werden alle Daten in jeder Minute übertragen. Das Zeitdiagramm und auch der Aufbau der Datenübertragung ist ja wohl sehr gut im Netz beschrieben.
Edit : lediglich der 59 Impuls fehlt ansonsten hast du jede Sekunde einen Impuls und in der Impulslänge stecken die Daten. Also ist da eine Pause von genau 2 s vor dem Minutenimpuls.
Edit2
für Faule

_________________
Tippfehler sind vom Umtausch ausgeschlossen.
Arbeiten an Verteilern gehören in fachkundige Hände!
Sei Dir immer bewusst, dass von Deiner Arbeit das Leben und die Gesundheit anderer abhängen!

[ Diese Nachricht wurde geändert von: der mit den kurzen Armen am 21 Nov 2013 17:54 ]

[ Diese Nachricht wurde geändert von: der mit den kurzen Armen am 21 Nov 2013 18:00 ]

BID = 908385

Brizz

Stammposter



Beiträge: 386
Wohnort: Rheine

Du rechnest :

if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;


Vielleicht rechnest Du mal so:


while (currenMillis > previousMillis) {
previousMillis = previousMillis + interval;

dann wird Deine Uhr mit der Genauigkeit von currentMillis gehen.


[ Diese Nachricht wurde geändert von: Brizz am  6 Dez 2013 23:06 ]


Zurück zur Seite 0 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 20 Beiträge im Durchschnitt pro Tag       heute wurden bisher 12 Beiträge verfasst
© x sparkkelsputz        Besucher : 182399315   Heute : 6513    Gestern : 7548    Online : 958        25.11.2024    20:35
7 Besucher in den letzten 60 Sekunden        alle 8.57 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0911481380463