$regfile = "m16def.dat"
$crystal = 8000000
Dim A As Word
Waitus A
End
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...
-> MEIN PROJEKTBLOG <-
$regfile = "m16def.dat"
$crystal = 8000000
Dim A As Word
Waitus A
End
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....
-> MEIN PROJEKTBLOG <-
Hallo Goblin,
hat er nicht.da hat der alte flamer wohl doch mal recht.
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
$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
Hallo pebisoft,
das funktioniert nunmal nicht.pebisoft schrieb:
Dim A As Word
Waitus A
Waitms ist was anderes...
Gruß, Michael
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.
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.
und ich dachte, wir sind hier im Bascom-Forum. Oder sind wir?Zitat von pebisoft
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:
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.Code:$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
-> MEIN PROJEKTBLOG <-
Lesezeichen