Forum: Compiler & IDEs wie schreib ich ein betriebsstundenzähler?


von Christian S. (Firma: DSK) (schmiddy)


Angehängte Dateien:

Lesenswert?

hi, ich hab ein problem ich möchte in mein programm ein 
betriebsstundenzähler einbauen aber ich weiß nicht wie ich ein schreibe. 
er soll min & std anzeigen. über 25 volt soll er anfangen zu zählen und 
unter 25 volt wieder aufhören.
kann mir da jemand bei helfen???
wäre echt nett von euch!!!!!!!

das programm ohne zhler hab ich beigehängt

von Christian S. (Firma: DSK) (schmiddy)


Angehängte Dateien:

Lesenswert?

so und hier nochmal als txt datei

von M. H. (doktorgnadenlos)


Lesenswert?

ich kann Dir keinen kompletten Source-Code liefern, aber prinzipielle 
Hinweise geben.

Zunächst brauchst Du einen nichtflüchtigen Speicher mit ausreichend 
vielen Schreibzyklen (z.B. ein serielles EEPROM).

Typischerweise wird im Minutenrythmus inkrementiert. Du brauchst also 
einen Timer, der im Minutenrythmus die Funktion zum Inkrementieren des 
Zählersaufruft. In dieser Funktion werden die entsprechenden Bytes (es 
werden wohl 2 oder 3 sein)im EEPROM gelesen, um 1 erhöht und wieder im 
EEPROM gespeichert (für Deine Applikation abhängig ob die Spannung >25V 
ist).
Damit steht im EEPROM immer die Betriebsdauer in Minuten.

Das EEPROM sollte zu Beginn mit "0x00" beschrieben sein. Im 
Lieferzustand steht dort zumeist "0xFF" drin, Du bekommst also zu Beginn 
gleich mal einen Überlauf, was aber nicht tragisch ist, Du verlierst nur 
die erste Betriebsminute.

von Daniel (Gast)


Lesenswert?

Hallo Cristian
so etwas in dieser Art habe ich vor kurzem programmiert. Aber es fehlen 
einfach noch Infos für dein Projekt.
Wie sieht es aus wenn µC resetet werden muss? Was passiert mit den 
bisherigen Betriebsstunden wenn µC neu gebootet wird?
So wie ich das nun sehe willst du die Daten einfach in einem LCD 
anzeigen lassen. Ist das korrekt???
Gruß Daniel

von Daniel (Gast)


Lesenswert?

10000(Schreibzyklen in EEprom)/60 (minuten) = 1666h Betriebstunden, d.h. 
dein Betriebstundenzähler zählt max 1666h.

von Christian Auerswald (Gast)


Lesenswert?

Evtl. könnte man das Programm ja so anpassen dass es nach 1000 Stunden 
die Minuten an eine andere Stelle im EEPROM schreibt.

von Christian S. (Firma: DSK) (schmiddy)


Lesenswert?

ja ganz genau das siehst du richt, ich will es auf dem display anzeigen

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Welcher EEPROM hat denn nur 10000 Zyklen?  Der ATmega2561 ist mit
(minimal) 100000 angegeben, in der Praxis werden es wohl eher eine
Million Zyklen sein.  (Brian Dean hat mal den Flash-ROM eines
AT90S1200 getestet.  Der war mit 1000 Zyklen spezifiziert, gehalten
hat er um die 167000.)

Die Idee, nach jeweils 10000 Stunden auf eine neues Stück EEPROM
zu gehen, hat natürlich auch was für sich.

von Peter D. (peda)


Lesenswert?

Christian Schmidt wrote:
> so und hier nochmal als txt datei

Und warum nicht als Source-Datei (*.c), wie es sich gehört?

Du programmierst wohl erst seit wenigen Tagen.

Programme als *.doc ist natürlich völlig daneben.


Peter

von Michael Wilhelm (Gast)


Lesenswert?

Ich habe es so gelöst:
1
__no_init __eeprom struct
2
{
3
  unsigned int einschaltzaehler;
4
  unsigned int betriebsminuten[100];
5
  unsigned char adresse;
6
}  eeprom_daten;

In der Initialisierung frage ich das EEPROM ab auf > 60000 (1000 Stunden 
Betrieb). Wenn größer, dann ist es das 1. Einschalten und alle Daten 
werden auf 0 gesetzt. Im laufenden Betrieb wird in Adresse der 
Arrayplatz gespeichert. Immer beim Erreichen der 60000 wird Adresse 
erhöht und somit auf den neuen Speicherplatz gezeigt.

Also 100000 Stunden können mitprotokolliert werden. Bei knapp 9000 
Betriebsstunden im Jahr läuft ads Ding nach ca. 11 Jahren über. Aber 
auch das könnte abgefangen werden (ist bei mir nicht nötig).

Syntax vom IAR.

MW

von Daniel (Gast)


Lesenswert?

Natürlich sollte es 100000 Zyklen heißen. aber am Ergebnis von 1666h 
ändert sich nichts.

Ich hatte das so gemacht: ich nehme 100 Bytes diese inkremeniere ich 
nacheinander z.B jede Minute(Byte1++,Byte2++...Byte100++,Byte1...)
Bekomme ich nun den Überlauf in Byte100 d.h. 255-> 0 so erhöhe ich nun 
Byte101. Bei Überlauf von Byte101->Byte102 inkrementieren usw. Somit 
kannst du nun 100*100000 Schreibzyklen für das EEprom nutzen. Man kan 
die Anzahl der Bytes auch erhöhen.
Man benötigt nur einen entsrpechenden Algoryhtmus für das Beschreiben 
und das Auslesen des EEprom.
Wenn du nämlich nach 100000 Schreibzyklen einen anderen Speicheradresse 
verwenden willst, musst du diese auch entsprechend abspeichern , damit 
du beim reboot weisst wo die Daten stehen.

von Sebastian (Gast)


Lesenswert?

Wie wär's denn damit, den internen Komparator zu nutzen, um einen Abfall 
der Betriebsspannung zu erkennen, den Controller selbst jedoch, über 
eine Diode entkoppelt, aus einen Elko so lange weiter zu speisen, bis 
der Zählerstand aus dem RAM in den EEPROM geschrieben ist? Sicherlich 
löst dies nicht das Problem, daß ein Reset den zuletzt aufgelaufenen 
Zählerstand löscht, aber man spart EEPROM-Schreibzugriffe. Der 
Komparator (vergleicht Betriebsspannung am Eingang und am 
Überbrückungs-Elko), muß dann einen Interrupt auslösen. In der ISR 
schreibt man dann den Zählerstand ins EEPROM. Bis der Elko leer ist, ist 
das längst getan.

von StinkyWinky (Gast)


Lesenswert?

@ Michael Wilhelm
> In der Initialisierung frage ich das EEPROM ab auf > 60000 (1000 Stunden
> Betrieb). Wenn größer, dann ist es das 1. Einschalten und alle Daten
> werden auf 0 gesetzt.

Das würde ich nicht machen. Nach 2.7 Jahren Betrieb würde die Anlage 
wieder neu geboren. Besser in Anschlag gehen und bleiben, dann weiss 
man, dass die Anlage alt ist.

von Michael Wilhelm (Gast)


Lesenswert?

>Das würde ich nicht machen. Nach 2.7 Jahren Betrieb würde die Anlage
>wieder neu geboren. Besser in Anschlag gehen und bleiben, dann weiss
>man, dass die Anlage alt ist.

Verstehe nicht was du meinst.

MW

von StinkyWinky (Gast)


Lesenswert?

Wenn die Anlage 60000 + 1 Min gelaufen ist und dann aus- und wieder 
eingeschaltet wird, so würde mit diesem Ansatz der Zähler auf 0 gesetzt.

von zolle (Gast)


Lesenswert?

sorry für den anhang in editor mein kollege bekommt das programm immer 
von mir und ich speichere ihm das in edietor weil er sagte das viel von 
euch das linux system drauf haben.

von zolle (Gast)


Lesenswert?

kann man denn keinen betriebsstunden zähler in das bisherige programm 
einbauen???

von zolle (Gast)


Lesenswert?

falls das nicht einfach auf die schnelle geht kann der 
betriebsstundenzähler auch notfalls weggelassen werden.
möchte mich an der stelle auch nochmal bedanken für die hilfe die ihr 
uns bisher gegeben habt. großes danke!!!
hab aber noch ne kleine frage: wir möchten gern zu unseren programm noch 
ein kleine wartezeit für ein ausgang einbinden. undzwar soll bei 
überschreitung der 25V eine wartezeit von ca. 60sek eingebunden werden. 
in den 60 sek soll der mikrocontroller aber die eingangsspannung ständig 
abfragen, vielleicht reicht es auch wenn er sie 5-10mal abfragt in der 
kurzen zeit. denn er soll nur schalten wenn er nach den 60sek noch über 
25V ist. geht das auch noch anders als mit ner schleife?

von Peter D. (peda)


Lesenswert?

zolle wrote:
> sorry für den anhang in editor mein kollege bekommt das programm immer
> von mir und ich speichere ihm das in edietor weil er sagte das viel von
> euch das linux system drauf haben.


Ich behaupte mal ganz frech, alle Programmierer benutzen nen Editor, 
ohne Ausnahme.

Sie wenden allerdings nen kleinen Trick an, bei "save as" tragen sie 
z.B. "blabla.c" ein und oh Wunder, es wird als "blabla.c" abgespeichert.


Peter

von Karl H. (kbuchegg)


Lesenswert?

zolle wrote:
> kann man denn keinen betriebsstunden zähler in das bisherige programm
> einbauen???

Oh. Man kann schon.
Das ist aber nicht die Frage. Die Frage ist: Kannst du das?
Immerhin ist es ja dein Projekt.
Anregungen wie man das machen könnte, hat es ja bisher zur
Genüge gegeben.

> geht das auch noch anders als mit ner schleife?
Ich würde mal sagen, jeder halbwegs vernünftige Programmierer
würde eine derartige Wartezeit auf jeden Fall anders als
mit einer Schleife lösen. Er würde dafür einen Timer
nehmen, der ihm die 60 Sekunden herunterzählt und wenn
sie um sind den gewünschten Schaltvorgang ausführen.

von Falk B. (falk)


Lesenswert?

Druckfrisch zum Thema. Es muss nicht immer im EEPROM gespeichert werden, 
der Prozessor kann auch Schlafen gehen.

Sleep Mode.

MfG
Falk

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.