PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sehr kleine Wartezeiten mit Timer realisieren



Goblin
24.03.2006, 18:03
Tagchen. Ich brauch sehr kleine Wartezeiten im µs-Bereich. In Bascom gibts ja WAITUS, aber der nimmt als Argumente nur Konstanten. Und meine Wartezeiten würden variieren. Kann ich das irgendwie mit nem Timer machen? Bei den Bascom Samples ist nen Timer0.bas dabei, da hab ich mir mal eine Schleife angesehen wo der Timer als Counter benutzt wird und ein Do Loop erst verlassen wird wenn er einen bestimmten Zählerwert erreicht hat. Der Wert ist bei mir aber immer 1. Was zählt der da? Flanken vom Prozessortakt? Benutze den internen Taktgeber. Wie kann ich das mit den Wartezeiten machen? Hab noch nie mit Timern gearbeitet...

pebisoft
24.03.2006, 18:17
$regfile = "m16def.dat"
$crystal = 8000000


Dim A As Word

Waitus A

End

Goblin
24.03.2006, 18:56
fuck, da hat der alte flamer wohl doch mal recht. er hatte mir nur bei waitms(255-x) wobei x nen byte war nen fehler gegeben und in der hilfe stand das mit der konstante.... weiss der teufel....

Michael
24.03.2006, 20:10
Hallo Goblin,

da hat der alte flamer wohl doch mal recht.hat er nicht.
Waitus läßt sich nicht mit einer Variable aufrufen.
steht auch in der Hilfe: ...must be a constant. Not a variable!
Kleinere Wartezeiten kannst du mit einem Unterprogramm realisieren.
Dort steht z.B. nur Waitus 100.
Rufst du es in einer For-Next Schleife auf, kannst du mit dem Schleifenzähler die Wartezeit beeinflussen.

Gruß, Michael

pebisoft
24.03.2006, 20:54
$regfile = "m16def.dat"
$crystal = 8000000


Dim A As Word
Dim B As Word
A = 500
B = 1000

Waitms A
Waitms B
Waitus A
Waitus B

End

erste sahne.....

mit fastavrbasic 16bitvariable (8mhz), 1us geht für den sprung und rücksprung verloren :

Sub wait_us(wait_wert_us as word )

$Asm
lds R19,wait_wert_us+1
dec R19
brmi weiter
inc R19
WGLOOP2:
ldi r18,255
WGLOOP1:
ldi R17, $01
WGLOOP0:
Nop
Nop
dec R17
brne WGLOOP0
dec R18
brne WGLOOP1
dec R19
brmi weiter
brne WGLOOP2
weiter:
lds R18,wait_wert_us
WGLOOP4:
ldi R17, $01
WGLOOP3:
Nop
Nop
dec R17
brne WGLOOP3
dec R18
brne WGLOOP4
$EndAsm
End Sub

Michael
24.03.2006, 20:59
Hallo pebisoft,

pebisoft schrieb:
Dim A As Word

Waitus A das funktioniert nunmal nicht.
Waitms ist was anderes...
Gruß, Michael

pebisoft
24.03.2006, 21:17
Rufst du es in einer For-Next Schleife auf, kannst du mit dem Schleifenzähler die Wartezeit beeinflussen. ..

geht nur ab 15us, und 8tersprüngen weil in der forschleife der rest verbraten wird.

E-Fan
24.03.2006, 21:47
Waitus ist wie Waitms meines Erachtens nach viel zu ungenau.
Lade doch den Timer am Anfang der Interruptroutine einfach mit dem nächsten Wert vor.

Interruptroutine:
Timerx = A
w
e
i
t
e
r
e
r
C
o
d
e
Return

Dadurch das der Timer ab einem vorgegebenen Wert weiterzählt verringert sich die Zeit, die bis zum nächsten TimerCounter overflow vergeht, nach den Vorgaben der Variablen und Du kannst Dir (fast) jede Frequenz erzeugen die Du brauchst. Ich mach das so weil ich für ne bestimmte Anwendung recht genaue 50Hz brauche. Mit nem 8Bit-Timer lieg ich bei 10MHz nur 0.18Hz neben meinem Ziel. Mit nem 16Bit-Timer gehts logischer Weise noch genauer.
Allerdings kommst Du nicht dran vorbei die genauen Werte im Simulator empirisch zu ermitteln wenn Du eine exakte Frequenz brauchst. Das geht aber recht schnell.

Rage_Empire
24.03.2006, 23:25
mit fastavrbasic 16bitvariable (8mhz).........

und ich dachte, wir sind hier im Bascom-Forum. #-o Oder sind wir? :-k

](*,) ](*,) ](*,)

Goblin
25.03.2006, 10:17
hehe eben. der bascom-compiler frisst das von pebisoft in überarbeiteter form, aaaber: das ergebnis ist nicht so wie es sein sollte. ich hab mal zum test nen pwm gemacht:



$regfile = "m8def.dat"
$crystal = 1000000

Config Portd = Output
Dim Counters As Integer
Dim Threshold As Integer
Dim Eins As Word
Dim Zwei As Word


Let Threshold = 10000
Let Eins = 0
Let Zwei = 100


Do
Portd = 255
Waitus Eins
Portd = 0
Waitus Zwei
Incr Counters
If Counters > Threshold Then Gosub Setter
Loop


Setter:

Let Counters = 0
Let Eins = Eins - 10
Let Zwei = Zwei + 10
Return


ergebnis: leds immer auf volle pulle an. seltsam. aber das was michael meinte mit der for/next-schleife und dem schleifenzähler ist überhaupt die lösung. voll einfach und müsste funktionieren. probier ich heute nach der arbeit erstmal aus.

Gast23
29.03.2006, 10:12
Hast du diesen Thread nicht komplett gelesen?
[highlight=red:f4d8d21963]Waitus geht nicht mit Variable[/highlight:f4d8d21963]

Das steht in der Hilfe