Forum: Compiler & IDEs Die Zeit eines rechteckigen Signals mit einem Interrupts messen


von John Konj (Gast)


Lesenswert?

Hallo Leute,

ich hoffe jemand kann mir bei der Lösung meines Problems helfen. Also
worum es geht:
Ich muss mit einem Interrupt ein rechteckiges Signal messen. D.h. ich
muss die Zeit von Rising bis Reising messen was ich auch geschaft habe,
aber wie kann ich mit dem selben Innterrupt die Zeit von Rising bis
Falling messen, dazu muss ich sagen das rechteckige Signal ändert
anderauernd die Periodendauer, das Signal wird nicht negativ es wird nur
1 und 0 und da wo es 1 wird, die Zeit muss ich auch mit dem selben
Interrupt messen das heißt von Rising bis Falling, die Zeit soll man
einfach bei der Flanke Falling ablessen und als Past in einem Hyper
Terminal schreiben werden.

Ich hoffe ich habe mich deutlich ausgedruckt und jemand kann mir helfen,
und es ist dringend.
Schöne größe an jeden.
Hier habe ich das was ich schon selber geschrieben habe:

$regfile = "m8515.dat"
$crystal = 8000000
$baud = 4800


'Iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii 
iiiiiiii


Config Timer1 = Timer , Prescale = 8

Config Pind.3 = Input

On Int1 Signal_1
Config Int1 = Rising
Enable Int1
Enable Interrupts
Start Timer1
Dim Timeus As Long

Do

Print "Signal_1" ; Timeus

Loop


'Iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii 
iiiiiiii

Signal_1:
Timeus = Timer1

Timer1 = 0
Return

'Iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii 
iiiiiiii

von Jean P. (fubu1000)


Lesenswert?

Lustig BASCOM im GCC Forum^^.
Man hat Dir doch schon gesagt wie das zu machen ist. Interrupt auf 
Low-level.
Wenn ausgelöst Timer an und Interrupt auf High-Flanke. Usw.
Den Code suchste selber oder in nem BASCOM Forum.

Außerdem reicht es einen Post aufzumachen und nicht 2 im Elektronik 
Forum und 1 hier. Nenene.

Moin

von John Konj (Gast)


Lesenswert?

Ja ich weis aber mit zwei anfragen kriegt man mehr antworten ;-)=

von Anfänger (Gast)


Lesenswert?

Nachdem ich ein Assembler Freak bin, kann ich es Dir in Deinem Code 
nicht zeigen, aber zumindest eine Anleitung zur Logik geben:

Programmstart:
Stell den Interrupt auf rising + falling, er soll in beiden Fällen 
auslösen
Schalte den Timer / Zähler zunächst aus und setze ihn auf 0.

Signal_1:
Die Interrupt routine soll gleich zu beginn erkennen ob es sich um ein 
HIGH oder LOW am Eingang handelt und zu zwei Unterroutinen springen:

Unterroutine_1a:
Beim HIGH wird der Timer Zähler genullt und gestartet.

Unterroutine_2:
Bei einem LOW wird der Timer Zähler ausgelesen und versendet (das ist 
die rising2falling zeit) und weiter nichts unternommen.

Unterroutine_1b:
Beim beim nächsten HIGH wird der Timer Zähler ausgelesen und versendet 
(das ist die rising2rising zeit) und der Zähler für die nächste Messung 
genullt.

Unterroutine 1a und 1b kann die gleiche Routine sein. Du musst also 
keine Abfrage machen, ob es das erste HIGH oder zweite HIGH (oder ein 
weiteres) war. Vermische einfach alle Funktionen von 1a und 1b zusammen, 
also:

Unterroutine_1:
1)sende aktuellen Wert zum Hyperterminal
2)setze Timer / Zähler auf 0
3)starte Timer / Zähler

Damit wirst Du zwar beim ersten HIGH auch Daten zum Hyper Terminal 
schicken und und beim zweiten HIGH den bereits gestarteten Timer nochmal 
starten, aber der erste gesendete Wert kann im Hyperterminal ignoriert 
werden bzw ist sowieso eine "0", weil er beim Programmstart genullt 
wurde.

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.