PIC 18F4455 Betriebsstundenzähler für 4 Motoren

OP #3156269
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
Gast #3156286
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.
OP #3156390
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?
#3156453
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.
OP #3156466
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.
Gast #3156523
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
Gast #3156647
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren