-
Nach was, Gast:
Du schreibst:
Config Timer1 = Counter , Edge = Rising
Du willst aber doch sicher einen selbstlaufenden Timer und keinen Counter, der steigende Flanken an einem Pin deines AVR zählt. Also:
Config Timer1 = TIMER, prescale = 64
Der prescale-Wert sagt dem Timer, dass er nicht jeden Takt (also bei 4MHZ 4mio mal je Sekunde) sondern nur jeden 64sten hochzählen soll, was genau genug ist.
Dein Interupt löst übrigens immer dann aus, wenn der Timer überläuft. Also gerade dann, wenn er wieder bei 0 ist(oder vielleicht schon bei 1 oder 2). Das ist der denkbar schlechteste Zeitpunkt um seinen Wert abzufragen (überhaupt brauchst du zum Verstehen von Servosignalen den Timer-Interupt garnicht, weil die Pulse so kurz sind, dass der Timer, wenn du ihn bei deren Beginn zurücksetzt garnicht überläuft, bis sie vorbei sind.).
-
sry war unter andrem browser drinne.
Also ich möchte das der timer mir über die comschnittstelle die zeit des highsignals mitteilt.
Ich weiß nur nicht in welche stelle des programms/interrupts ich es stellen muss damit eine vernünftige zahl herrauskommt (im momentk ommt ja garkeine herraus)
-
Hier mal eine Variante, die dir die Zeit zwischen dem Ansteigen und dem Fallen eines Signals ausgibt. Das Ausrechnen, durch was du teilen musst um auf 'ne sinnvolle Zeiteinheit zu kommen, überlasse ich mal dir.
Code:
$regfile = "4433def.dat"
$crystal = 4000000
$baud = 9600
Config Timer1 = Timer , Prescale = 8
Start Timer1
On Int0 C1rise : On Int1 C1fall
Enable Int0 Rising : Enable Int1 Falling
Enable Interrupts
do
loop 'Endlosschleife
C1rise: 'Bei Beginn den Timer zurücksetzen
timer1=0
return
C1fall: 'Am Ende steht in timer1 drin, wie lange das Signal an war.
print timer1
return
PS: Ich hab' keine Ahnung, wie lange die Print-Befehl von Bascom braucht.
-
vielen dank schonmal.
mit dem obigen code (allesdings mit nosave) kommt soetwas an:
65042
3
2
42679
2
2
2
2
2
2
2
55647
2
2
3
2
2
3
2
64746
3
24588
2
2
2
2
3
2
56860
3
24437
3
24543
2
43786
(nur ein auszug)
ich habe mir gedacht das der print befehl vielleicht zu langsam sein könnte. also habe ich mit eine led geschnapp und den code soweit verändert.
Code:
$regfile = "4433def.dat"
$crystal = 4000000
$baud = 9600
Config Timer1 = Timer , Prescale = 8
Start Timer1
On Int0 C1rise Nosave : On Int1 C1fall Nosave
Enable Int0 Rising : Enable Int1 Falling
Enable Interrupts
Dim Zeit As Integer
Config Portd = Output
Do
Loop 'Endlosschleife
C1rise: 'Bei Beginn den Timer zurücksetzen
Timer1 = 0
Return
C1fall:
Zeit = Timer1
If Zeit > 750 Then
Portd.2 = 1
Else
Portd.2 = 0
end if
Return
ich habe mich gewundert warum denn die LED nicht leuchtet. Sie tat es doch, nur gaaanz wenig. Daraufhin habe ich mich im internet einmal nach einer osciloscopimprovisierung für den pc umgesehen. Für die soundkarte habe ich dann auch etwas gefunden. also erstmal das unbearbeitete servosignal angeschaut. Dann das des pins für die LED.
Und siehe da die LED bekommt jedesmal wenn das servosignal high ist eine flanke genausolang wie die highphase.
Ausgerechnet habe ich das bei einem prescale von 8 (einer auflösung von 2 µS) und einer signallänge von 1 - 2 ms eine zahl von 500 - 1000 im timer stehen müsste. (daher die zahl 750) Ich dachte also die LED müsste auf halben vollausschlag umspringen. Leider war dem nicht so. bitte helft mir den denkfehler zu finden