hallo
dass liegt warscheinlich daran, dass beim Bascom Simulator
keine Taktquelle (Quarz) vorhanden ist. Bei Timern ist es desshalb
immer sinnvoll sie direkt mit einen µC auszuprobieren.
mfg franzl
Ich wollte mir mit hilfe des timers eine waitus funktion basteln(die im basic vorhanden befehle stimmen ja leider gar nicht(mehr als über 100% abweichung)
aber leider funktioniert der simulator nicht oder ich mach was falsch. kann das sein?
auch fertige sampels von Bascom gehen im simulator nicht(zb die timer0.bas)
kann mir einer einen tipp geben
gruss
markus
hallo
dass liegt warscheinlich daran, dass beim Bascom Simulator
keine Taktquelle (Quarz) vorhanden ist. Bei Timern ist es desshalb
immer sinnvoll sie direkt mit einen µC auszuprobieren.
mfg franzl
Hallo Markus,
> aber leider funktioniert der simulator nicht oder ich mach was falsch. [...]
> auch fertige sampels von Bascom gehen im simulator nicht
"Sim Timers" eingeschaltet?
Ciao,
Werner
hatte gestern abend dann auch noch gefunden den hacken. aber jetzt auch gleich das nächste problem bzw frage:
ich hab einen 20 mhz quart und will mit einer sub genau eine 1us pause machen.
ich dachte mir, nehm ich dazu den timer 0 und lass ihn einfach 20 tackte zählen(bei einen teiler von 1)
wenn ich dann mit set einen pin auf high mach dann die sub laufen lasse und das wieder mit reset auf low mache zeigt mir aber mein impulse von ~3,5 usec an. kann das dein das der set und reset befehl so lange dauert? gibs da eine schneller möglichkeit? ich wollte eigendlich zum programmieren schon baisc verwenden, da ich kein c profi bin und asembler kann ich garnicht :/
machs mit einem ASM-Code:
!Rcall wait 'Damit rufst du die Sub auf
Die Sub selber:
wait:
!ldi R17, $03
!WGLOOP0: dec R17
!brne WGLOOP0
!nop
!ret
Das ist ganz genau 1µS bei 20Mhz, genauer bekommst dus nicht ( erst recht nicht mit dem Timer, da du ja für den Timer Start / stop / int schon mehr als 20 MIs benötigst.
Und die Schnelste möglichkleit einen Pin zu setzen ist auc wieder ein ASM befehl:
!SBI PortX, PINNummer
Und das Resetzen:
!CBI PortX, PINNummer
ich kan einfach mit ! asm code in avrbascom einfügen? das ist ja super, danke für euere hilfe. bin mal gespannt wie das alles klappen wird.
gruss
markus
Mal so nebenbei:Zitat von teslanikola
das wird dennoch nicht zwangsläufig 1 µs ....
Der Grund:
Interupts.
Denn ein Interupt kann diese Warteschleife durchaus unterbrechen ....
Grüße,
da Hanni.
@Hanni: Da haste auch wieder recht aber ich denke das das CLI und SEI lösen das problem
obs jetzt stadt 1usec 2 usec ist , ist mir relativ egal aber es sollten nicht auch 1 usec 6 usec oder mehr werden wie es mit den waitus 1 befehl ist :/
Ein kleines Rechenbeispiel:Zitat von rathma
20 MHz = 50 ns / Takt
=> 20 Takte = 1µs
Bei einem ATmega 32 benötige ich um in die ISR zu springen, 6 Takte.
Der Rücksprung nimmt mal eben 4 Takte ein.
Damit sind schon alleine dadurch, das ein Interupt aufgetreten ist, mal eben 10 Takte weg.
Bedenkt man noch, das in ISR zumindest das Statusregister SREG gesichert und wiederhergestellt werden sollte, sind im einfachsten Fall weitere 2 Takte verbraten (bei Basecom typischerweise 6, da dieses danach noch aufn Stack gepusht wird).
Damit sind wir nun schonmal bei 12 - 16 Takten ... nur, weil mal eben nen Interupt auftrat.
In einer ISR wird ja nun noch das eine oder andere gemacht ...
z.B. weitere Register auf den Stack geschoben und wieder runtergeholt, irgendwelche Rechenoperationen etc.
Fakt ist daher, so wie der Code dort steht ist er (leider) nicht wirklich genauer wie waitms von Basecom.
jo, sicher tut es das, allerdings sollte man dann auch die 2 Takte von der Schleife abziehen.Zitat von teslanikola
Im übrigen, sollte man vor allem längere Wartezeiten nicht mit Schleifen sondern mit einem Timer realisieren.
So, ich hoffe nun einmal ein paar Denkansätze gegeben zu haben.
Grüße,
da Hanni.
Lesezeichen