Forum: Mikrocontroller und Digitale Elektronik PIC 18F4455 Betriebsstundenzähler für 4 Motoren


von Ersi (cell85)


Lesenswert?

Hi,

ich hab vor einen Betriebsstundenzähler für 4 Motoren zu realisieren. 
Dazu wollte ich mein PIC18F4455 eval board mal einsetzen welches fast 
verstaubt ist.

Könnte ich das wie folgt machen oder hat jemand vielleicht eine andere 
Idee?

Jeder Motor hat ein unsigned long int welches mit einem Timer Interrupt 
mit eine frequenz von 1sek um +1 erhöht wird falls der motor aktiv ist 
(high auf GPIO):
1
//Pseudocode:
2
3
unsigned long int Sekundenzaehler1=0; //globale variable für zähler motor1
4
5
6
//diese funktion wird jede sekunde mit dem Timer Interrupt aufgerufen
7
Betriebsstundenzaehler1() 
8
{
9
  if Motor1aktiv == 1
10
  { 
11
   Sekundenzaehler1++; 
12
  }
13
  else 
14
  {}
15
}
16
17
18
//Abfragen der Betriebsstunden 
19
uint BetriebsstundenMotor1()
20
{
21
 uint betrMin = Sekundenzaehler1 /60;
22
 uint betrStd = betrMin /60;
23
24
return betrStd;
25
}

Dann sollte der Wert am besten jede Stunde oder alle 10std. mal im 
EEPROM das nur 256byte groß ist , gebackupt werden, falls mal der strom 
ausfällt.
Jedoch hat der Microchip Eeprom ja angeblich 1millionen cycles, 
eigentlich könnte man doch auch direkt da reinschreiben oder?

Was meint ihr?

Viele Grüße
Sven

von Chris (Gast)


Lesenswert?

Ja, sollte passen, die Frage ist, wie machst du den 1Sek timer, denn
zeitweise werden die Interrupts deaktiviert.

Auch solltest du das EEprom refreshen, dazu brauchst du dann einen 
counter
im eeprom. Angenommen du hast vier Werte mit je 3 byte welche du 20x 
schreibst, dann sind das maximal 57 Jahre, wenn du alle 15Minuten die
Werte ins EEprom schreibst, bei 5 minuten Schreibinterval sind es 19 
Jahre.
Du könntest auch ca alle 4 Minuten schreiben, sprich wenn wenn sich was
in den 3 Bytes ändert, dann sind es 15 Jahre garantierten Datenerhalt.

Normalerweise macht man zwei Bereiche, und sichert diese mit einer 
Checksum
ab, und schreibt abwechselnd in den einen und in den anderen Bereich.

EEprom refreshen heisst,
eeprom_refresh() { int i: for(i=0;i<256;i++) 
eeprom_write(i,eeprom_read(i));}

und sollte gemacht werden, vor das eeprom 80000 x geschrieben wird, also
z.B. bei 20 eeprom location, sollte der eeprom counter maximal 4000 
anzeigen.

von Ersi (cell85)


Lesenswert?

Ok gut das klingt ja machbar. Nur du hast recht, wie würde man das mit 
der Sekunde realisiern oder ist dazu eine RTC Uhr nötig ? Ich könnte 
dann den Unterschied der vergangen Zeit auf meinen Counter addieren.

Gibts eigentlich SPI EEPROMS die das selbst managen, das nicht immer die 
gleiche Speicherzelle benutzt wird?

von Chris B. (dekatz)


Lesenswert?

RTC brauchst dafür nicht.

a)Den PIC mit einem 3,2768MHz Quarz betreiben, Timer0 mit Prescealer 256 
einstellen und Interrupt für Timer0 freigeben.
1/3276800Hz * 256 (Prescealer) * 256 (TMR0) ergebenn genau 20ms.
In der Interruptroutine zählst du eine Variable von 50 runter.
Wenn Variable auf 0, wieder mit 50 laden und Stundenzähler 
aktualisieren.

(Geht auch mit jeder x-beliebigen Quarzfrequenz - nur eben mit anderen 
Werten für die Variable und nicht alle Q-Frequenzen ergeben so "schöne" 
Teiler,kann man aber mit Timer Preload auch hinbekommen.....)

b)Timer1-Oscillator mit 32,768kHz Quarz betreiben, Prescealer 1:1. Damit 
bekommts du alle 2 Sekunden einen Interrupt. Wenn die Auflösung von 2 
Sekunden für den Stundenzähler nicht reicht, dann TMR1 nach jedem 
Interrupt eben mit 32768 laden - ergibt auch 1 Sekunde.

von Ersi (cell85)


Lesenswert?

Danke Chris für den Tipp! Ich hab am PIC einen 4 Mhz Quarz, ich denke 
das bekomme ich so wie du beschrieben hast gut hin.
Mich hat nur die Aussage  "...denn zeitweise werden die Interrupts 
deaktiviert..." unsicher gemacht.

Ich müsste während der EEPROM schreib und lese Phase alle Interrupts 
deaktivieren glaube ich - stand irgendwo im Application Note.

von Udo S. (urschmitt)


Lesenswert?

Warum pufferst du den Pic nicht mit Diodeund einem entsprechenden Elko 
vom Rest der Betriebsspannung. Dann hast du im Falle des Ausschaltens / 
Stromausfall genügend Zeit das zu erkennen und genau dann und nur dann 
deine Zähler ins Eprom zurückzuschreiben.

von Ersi (cell85)


Lesenswert?

Hi Udo,
ich hab das noch nie gemacht und so auf anhieb keine Ahnung wie man das 
mit dem PIC erkennen kann. Die Schaltung würde ich hinbekommen. Das ist 
aber eine sehr gute Idee danke!

von kukuk (Gast)


Lesenswert?

Betriebsstunde auf die Sekunde genau ?

...fuer die kukuk_s_uhr !

von spess53 (Gast)


Lesenswert?

Hi

>ich hab das noch nie gemacht und so auf anhieb keine Ahnung wie man das
>mit dem PIC erkennen kann.

Dein PIC hat doch einen Analogkoparator. Einfach die Spannung (evtl. 
heruntergeteilt) vor der Diode mit einer passenden Spannung nach der 
Diode oder Referenzspannung vergleichen. Im Komparatorinterrupt dann die 
Werte abspeichern.

MfG Spess

von Dirk (Gast)


Lesenswert?

Eine Alternative, falls der Platz im EEPROM reicht, könnte wie folgt 
aussehen: Du legst die Daten zweimal im EEPROM ab und versiehst sie 
jeweils mit einer Prüfsumme (die Du natürlich auch im EEPROM ablegst). 
Beim Einlesen kannst Du dann anhand der Prüfsummen erkennen, welche der 
beide Datensätze gültig sind.

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.