PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer0 und Timingprobleme



rathma
09.05.2006, 10:38
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

franzl
09.05.2006, 19:20
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

Werner_Just
10.05.2006, 11:49
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

rathma
10.05.2006, 14:00
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 :/

teslanikola
10.05.2006, 15:16
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

rathma
10.05.2006, 15:51
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

Hanni
10.05.2006, 21:44
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

Mal so nebenbei:

das wird dennoch nicht zwangsläufig 1 µs ....
Der Grund:

Interupts.
Denn ein Interupt kann diese Warteschleife durchaus unterbrechen ....


Grüße,

da Hanni.

teslanikola
10.05.2006, 21:52
@Hanni: Da haste auch wieder recht aber ich denke das das CLI und SEI lösen das problem ;-)

rathma
11.05.2006, 08:20
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 :/

Hanni
11.05.2006, 12:00
aber es sollten nicht auch 1 usec 6 usec oder mehr werden

Ein kleines Rechenbeispiel:

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.





aber ich denke das das CLI und SEI lösen das problem


jo, sicher tut es das, allerdings sollte man dann auch die 2 Takte von der Schleife abziehen.

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.

rathma
11.05.2006, 15:01
ich werd am montag wieder an mein oszi rankommen, dann werd ich schauen wie genau ich das clocksignal hinbekomme. zumindest schaff ich es dann schonmal feste nachrichten über den bus zu schicken. kleine abweichungen nimmt sind ja kein problem(für das ist ja das clock signal da) aber wenn sie zu gross werden(so wie jetzt mit waitus) ist von 10 übertragenen nachrichten meistens nur eine angekommen(bzw angenommen worden).

noch was ganz anderes. wenn ich auf den attiny2313 anschalte, dann kann ich kurz auf allen pins ein high signal messen(vielleicht 1-2x 2 usec) ist das normal?