Willa
25.01.2010, 19:49
Hallo!
Ich habe da mal wieder eine offene Frage. Ich möchte am int1 ein Rechtecksignal abfragen (Summensignal RC-Empänger). Dabei ist die Dauer des high Zustands wichtig. Ich dachte ich mache es so:
Wenn Pegel steigt, timer auf null setzen. Wenn Pegel sinkt, Timerwert auslesen.
Mal vorweg - der Code funktioniert wunderbar. Mir ist aber nicht ganz klar warum. Obwohl ich ihn mir selbst ausgedacht habe.
Code läuft so ab: Ich habe den interrupt auf "change" konfiguriert um beide Events zu detektieren. Im Change interrupt frage ich nun als erstes ab ob der Pin high ist. Falls ja, dann wird die gestoppte Zeit übernommen, falls nein wird die MEssung für den nächsten Kanal vorbereitet.
Was ich nicht verstehe: Im idealen Fall eines Pin-Change interrupts, wäre zur zeit des interrupts der Pegel doch genau bei 2.5V, oder? Und damit wäre es dann Zufall ob das als high oder low zustand erkannt wird.
Außerdem verstehe ich nicht, warum ich im Interrupt als erstes nachfrage ob der Pegel high ist. Wenn er high ist, sollte der Pinchange interrupt doch eigentlich eine steigende Flanke detektiert haben. Und wenn der Pegel low ist sollte eine fallende Flanke detektiert worden sein.
Kann mir jemand bei diesen Unklarheiten weiterhelfen....?
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 38400
Config Timer0 = Timer , Prescale = 256 , Capture Edge = Falling
On Timer0 Detectrxpause
Config Int1 = Change
On Int1 Getreceiver
Config Pind.3 = Input
Dim Empf(5) As Integer
Dim Channel As Byte
Enable Timer0
Enable Interrupts
Enable Int1
Getreceiver:
If Pind.3 = 1 Then
Empf(channel) = Timer0
Else
Incr Channel
End If
Timer0 = 0
Return
Detectrxpause:
Channel = 0
Return
Ich habe da mal wieder eine offene Frage. Ich möchte am int1 ein Rechtecksignal abfragen (Summensignal RC-Empänger). Dabei ist die Dauer des high Zustands wichtig. Ich dachte ich mache es so:
Wenn Pegel steigt, timer auf null setzen. Wenn Pegel sinkt, Timerwert auslesen.
Mal vorweg - der Code funktioniert wunderbar. Mir ist aber nicht ganz klar warum. Obwohl ich ihn mir selbst ausgedacht habe.
Code läuft so ab: Ich habe den interrupt auf "change" konfiguriert um beide Events zu detektieren. Im Change interrupt frage ich nun als erstes ab ob der Pin high ist. Falls ja, dann wird die gestoppte Zeit übernommen, falls nein wird die MEssung für den nächsten Kanal vorbereitet.
Was ich nicht verstehe: Im idealen Fall eines Pin-Change interrupts, wäre zur zeit des interrupts der Pegel doch genau bei 2.5V, oder? Und damit wäre es dann Zufall ob das als high oder low zustand erkannt wird.
Außerdem verstehe ich nicht, warum ich im Interrupt als erstes nachfrage ob der Pegel high ist. Wenn er high ist, sollte der Pinchange interrupt doch eigentlich eine steigende Flanke detektiert haben. Und wenn der Pegel low ist sollte eine fallende Flanke detektiert worden sein.
Kann mir jemand bei diesen Unklarheiten weiterhelfen....?
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 38400
Config Timer0 = Timer , Prescale = 256 , Capture Edge = Falling
On Timer0 Detectrxpause
Config Int1 = Change
On Int1 Getreceiver
Config Pind.3 = Input
Dim Empf(5) As Integer
Dim Channel As Byte
Enable Timer0
Enable Interrupts
Enable Int1
Getreceiver:
If Pind.3 = 1 Then
Empf(channel) = Timer0
Else
Incr Channel
End If
Timer0 = 0
Return
Detectrxpause:
Channel = 0
Return