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
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.
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
10000(Schreibzyklen in EEprom)/60 (minuten) = 1666h Betriebstunden, d.h. dein Betriebstundenzähler zählt max 1666h.
Evtl. könnte man das Programm ja so anpassen dass es nach 1000 Stunden die Minuten an eine andere Stelle im EEPROM schreibt.
ja ganz genau das siehst du richt, ich will es auf dem display anzeigen
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.
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
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
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.
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.
@ 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.
>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
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.
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.
kann man denn keinen betriebsstunden zähler in das bisherige programm einbauen???
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?
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.