Wirklich gleichzeitig wirst du sie nie abfangen können, da der PIC ja nur einen Prozessor innen drin hat. Du wirst immer mehr oder weniger Verzugszeiten wegen deinem Code bekommen, wobei diese aber bei einer Taktfrequenz von und über 1MHz zu 100Hz (also alle Nulldurchgänge bei Wechselstrom) verschwindend gering werden.
Aber nur nebenbei
.
Ja, das mit einem blockierenden Pooling zu lösen ist unmöglich (ich gehe mal davon aus, dass du keine Interrupts verwendest). Du brauchst eine andere Art von Polling, eine die dem Gedankengang folgt: Ist ein Ereigniss da, dann handle sie ab, ansonsten gehe weiter.
Code:
schleife:
btfss eingang1
call nulldurchgang_bei_1
btfss _eingang2
call nulldurchgang_bei_2
goto schleife
nulldurchgang_bei_1:
...
return
nulldurchgang_bei_2:
...
return
Das Problem bei diesem ist, dass du theoritsch jederzeit einen Nulldurchgang verpassen könntest, sollte dein Prozess, der diesen Abhandelt zu lange braucht.
Eine andere Möglichkeit wäre, wenn du den einen Zustand per Pooling abhandelst und den zweiten auf einen I/O-Pin Interrupt legst. Aber auch da ist es natürlich auch möglich, dass du durch den Interrupt den zweiten, gepollten Nulldurchgang verpasst, wenn der Interrupt zu lange dauert, oder wenn bei fast gleichzeitig auftreten, da der Interrupt das Hauptprogramm unterbricht.
Eine dritte Möglichkeit, die mri so auf die Schnelle einfällt wäre, dass du beide Nulldurchgänge auf I/O-Interrupts legst, aber in diesem nur jewels einen Bit setzt. Dadurch wird das Interrupt sehr schnell abgehandelt und danach musst du nur im Hauptprogramm nur noch dafür sorgen, dass du die Bits auswertes und auf einen oder zwei erkannten Nu
lldurchgänge reagierst.
Mit dieser Möglichkeit ist es dir nicht möglich einen Nulldurchgang zu "übersehen", aber dadurch, dass du nicht "augenblicklich" darauf reagierst, kommen natürlich kleine Verzugszeiten zwischen erkennen und regieren hinzu.
MfG
Mobius
€dit: Aso, ich verstehe grad die Fragestellung
. Also, wenn du _nur_ die Zeit zwischen den beiden Nulldurchgängen erkennen willst, ist das einfacher zu lösen, als ich es oben hingeschrieben habe.
Weil du musst ja nichts anderes machen, als erkennen, welches der beiden NUlldurchgänge zuerst kommt und danach den Timer zu starten und es zu stoppen, sobald der zweite Nulldurchgang erkannst wird.
Dafür wären methode 1 oder 3 am besten geeignet, also, dass du entweder beide Eingänge hintereinander abfragst und als reaktion darauf den Timer startest, stoppst, etc, oder das gleiche, nur ins Interrupt verschoben.
Lesezeichen