PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Rechteckiges Signal mit Hilfe eines Interrupts messen



Johnkonj
02.12.2008, 19:00
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


'Iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiiiiiiiiiiiiiiiiiiiiiiiiiiiii


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


'Iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiiiiiiiiiiiiiiiiiiiiiiiiiiiii

Signal_1:
Timeus = Timer1

Timer1 = 0
Return

'Iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiiiiiiiiiiiiiiiiiiiiiiiiiiiii
Code-Tags eingefügt (PicNick)

for_ro
02.12.2008, 20:06
Hallo,
mit

Config Int1 = Change

konfigurierst du den Int so, dass er bei jedem Wechsel von 0->1 und von 1->0 die ISR aufruft.
Dann überprüfst du in der ISR, ob der Eingang 0 ist, dann war es eine fallende Flanke, bzw. wenn er 1 ist, dann war es eine steigende Flanke.
Entsprechend speicherst du in den Variablen Signal_High bzw. Signal_Low die Zeit des Timers ab.
Falls es passieren kann, dass der Timer überläuft, musst du noch eine entsprechende ISR definieren und die Überläufe zählen.

Gruß

Rolf

Gock
03.12.2008, 11:25
Ich kenne mich zwar nicht mit Bascom aus, aber (falls möglich) wäre es einfacher, wenn Du statt dem INT1 den ICP benutzt. Der ist dafür gemacht, möglichst einfach und präziese Zeiten zwischen 2 (einstellbaren) Flanken zu messen.
Gruß

raggy
03.12.2008, 16:17
Hallo
ich bin auch der meinung das es mit dem ICP wesendlich einfacher ist.
hier ein kleines Beispiel.


'--------------------------------------
$regfile = "m32def.dat"
$crystal = 16000000
$baud = 115200

Dim Wcount As Word

On Icp1 Oncapture 'Interrupt-Routine

Config Timer1 = Timer , Prescale = 256 , Capture Edge = Rising

Enable Icp1 'Capture-Interrupt
Enable Interrupts 'Interrupts global

Main: 'Hauptschleife
Goto Main
'--------------------------------------
Oncapture: 'Timer1-Capture
Wcount = Timer1 'Erst Wert sichern
Timer1 = 0 'Sofort Timer-Reset

Print Wcount ; " ";
Return

Du brauchst es nur Deinen wuenschen anzupassen
Gruß raggy

Besserwessi
03.12.2008, 18:09
Wenn man schon den ICP Interrupt nimmt, sollte man auch die ICP Register Auslesen, und nicht den Timer direkt. Der Timer sollte man auch nicht jedes mal zurücksetzen, sondern die Differenz zum vorherigen Wert berechenen.