Forum: Mikrocontroller und Digitale Elektronik Bau eines S0-Impulszählers


von Pappnase (Gast)


Angehängte Dateien:

Lesenswert?

Ich möchte gerne an vier S0-Schnittstellen von Stromzählern die 
S0-Impulse zaehlen. Zum Empfangen des Signals möchte ich ich einen 
FPT100 verwenden, wie im Schaltplan gezeigt. Leider ist der 
Fototransistor nicht ganz korrekt gezeichnet.

An dem Transistor sind bei der Basis zwei zusätliche Widerstände R1 und 
R2 eingezeichnet, die eventuell wegfallen können (sollen zur Einstellung 
des Arbeitspunktes dienen, falls das Infrarotlicht der S0-Schnittstelle 
nicht ausreichend ist, um den Transistor mit genügend Energie zu 
steuern).

Der Fototransistor wird am Eingang PINC0 des Atmega88 (die weiteren an 
PinC1-PinC3) angeschlossen, der Widerstand R1 dient dann noch als 
PullDown-Widerstand für PinC0.

Dann hab ich mir mit Eurer Hilfe ein kleines C-Programm bestehend aus 
einer Headerdatei und der Quellcode-Datei geschrieben, dass die Impulse 
zählt und nach und nach in einem Ringspeicher ablegt.

Wie ich später die Inhalte des Ringspeichers weiterverarbeite (ob sie 
per UART wohingesendet werden oder wie auch immer) soll später kommen. 
Ebenso habe ich mir die Option freigelassen, mit Tastern für 
Starten/Stoppen später zu ergänzen, daher sind die Funktionen zunächst 
etwas verschachtelt in main wird Messung_Starten aufgerufen, in Messung 
starten weitere Unterprogramme.

Ich habe mir zum Zählen der Impulse zwei Varianten überlegt, einmal in 
Funktion Impulse_zaehlen, die ständig im Kreis läuft. Dann hab ich aber 
mal gelesen, dass es besser sein könnte, den Kram per Interrupt zu 
steuern, um den uC nicht zu sehr zu "überlasten". Da ich vier 
S0-Schnittstellen auswerden möchte, entfällt die Möglichkeit die Zählung 
über einen Timer oder so zu machen, darum habe ich mich in der Version 
mit Interrupts für den PCINT1-Interrupt entschieden, der ausgelöst wird, 
sobald eine Pegeländerung an PinC0-PinC3 stattfindet.

Ich hab das Programm im Debug-Modus mehrmals ausprobiert und es scheint 
so zu funktionieren.

Zum Einstellen des Speicherintervalls habe ich eine Variable 
WerteSichern_Intervall_Sekunden eingeführt, wo die Zeit in Sekunden 
(ggf. später veränderbar), eingestellt werden kann. Momentan steht der 
Wert auf 300 Sekunden.

Dann hab ich eine Timer_Basiszeit_Sekunden eingeführt, wo die Sekunden 
immer weitergezählt werden und diese mir als Zeitstempel für den 
Datensatz im Ringspeicher dient, damit ich weis, wozu die jeweiligen 
Messwerte gehören. Die Zeit wird nicht genullt, rein rechnerisch hätte 
ich bei einem 32-bit-Integer genügend Platz, um viele Jahre lang 
Sekunden zählen zu können.

Es sind gewiss noch Fehler in dem Programm vorhanden, auch wenn der 
Compiler keine Fehler anzeigt, aber bei dem Timer bin ich mir nicht 
sicher, ob der alles so korrekt macht, wie ich es später möchte (z.B. 
dass alle 300 Sekunden die Zaehlresultate im Ringspeicher abgelegt 
werden oder ob ich beim Timer mit OCR1A und dem Prescaler alles richtig 
gemacht hab).

Ich hab mir auch überlegt, ob ich die Daten im Ringbuffer ggf. auch in 
dem EEPROM ablegen kann, ich habe gesehen, dass ich mit dem AVR-Studio 
auch den Inhalt des Atmega88 auslesen kann, somit müsste ich glaub ich 
auch die Messwerte dort speichern und später dann so auslesen können, 
vielleicht sende ich die Daten auch alle paar Minuten zu Testzwecken mit 
dem UART an meinen Computer um zu sehen, ob es funktioniert, somit 
müsste ich dann sehen, ob Timer1 richtig konfiguriert ist.

Wahrscheinlich gibt es so ein Programm schon in ähnlicher Weise, aber 
wie soll man es sonst lernen und vielleicht kann jemand von Euch damit 
auch etwas anfangen, darum stell ich es hier rein, weil das andere auch 
tun und wieder andere davon profitieren können.

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.