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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.