Forum: Mikrocontroller und Digitale Elektronik variables delay (at90s2313)


von Michael Buchholz (Gast)


Lesenswert?

Hallo Leute...

...da man mir wo anders nicht weiterhelfen konnte, möchte ich Euch mal
mit einer vermutlichen Anfängerfalle belästigen.

.def  c0  =  r19
.def  c1  =  r20
.def  c2  =  r21


.macro  delay
    ldi  C0,(@0<<2)
WGLOOP0:
    ldi  C1, $37
WGLOOP1:
    ldi  C2, $C9
WGLOOP2:
    dec  C2
    brne  WGLOOP2
    dec  C1
    brne  WGLOOP1
    dec  C0
    brne  WGLOOP0
.endmacro


Aufruf über z.B. "delay 10" entsprechend 10 mal 5ms

Tut um's verrecken nicht das, was ich erwartet habe :/ Was mache ich
da falsch? Ich komm einfach nicht drauf meggerschimpf

Gruss
Michael

von ...HanneS... (Gast)


Lesenswert?

Du berücksichtigst die Taktfrequenz des Controllers nicht...

Besser als mit Delay steuerst du deine Programme aber mit einem
Timer-Interrupt.

...

von Michael Buchholz (Gast)


Lesenswert?

Danke für den Tip, aber die 4MHz hab ich schon berücksichtigt. Der Code
(ab C1) hab ich mir vom Tool "AVRloop"
(C:\Programme\AVR\AVRloop\AVRloopgen.html) generieren lassen. Soft
hab ich auch die 4MHz als Takt vorgegeben...
Wenn ich an Stelle von
    ldi  C0,(@0<<2)
einfach mal
    ldi  C0,0x01
schreibe, funzt es ja auch. der Bock muss m.E. ganz wo anders
liegen...

TimerIRQ... Ich bekomme das ja noch nicht mal hin heul


Thx
Micha

von ...HanneS... (Gast)


Lesenswert?

Von solchen Programmen halte ich nix, sie tragen nicht zum Verständnis
der Materie bei.

Schau mal hier, vielleicht hilft es dir ja weiter:
http://www.mikrocontroller.net/forum/read-4-15758.html#15758

...

von Michael Buchholz (Gast)


Lesenswert?

... naja. Wie ne verschachtelte Zählschleife tun soll, ist mir schon
klar. Das sieht ja in anderen Sprachen, wie z.B. Pascal oder Basic
nicht gross anders aus. Bevor ich aber ne'n Taschenrechner herhole und
da wie'n irrer rumrechne, bediene ich mich doch lieber eines solchen
Tools.

Ich denke, was mir nicht ganz klar ist und wo der Fehler liegen könnte,
ist die Übergabe der Werte an C0 mit *(@0<<2)* das hab ich so aus einer
anderen Schleife übernommen und verstehen tue ich das auch nicht,
weil's mir noch nie einer erklärt hat...

Dein Link ist interessant. Werde mal versuchen, den Ablauf zu verstehen
;o)

So. Nu is aber Bubutime angesagt ;)

Gutes Nächtle
Micha

von ...HanneS... (Gast)


Lesenswert?

Achnee???

Du willst also mit (@0<<2) nur den (Macro-) Parameter übernehmen??
Warum schiebst du ihn dann um 2 Bit nach links? (<<2) Das entspricht
einer Multiplikation des Parameters mit 4. Das geht natürlich nur gut,
solange der Parameter 6 Bit nicht überschreitet, also kleiner als 64
ist.

Wenn du in einem Macro lediglich den Parameter übernehmen willst, dann
reicht @0 für den ersten Parameter, @1 für den zweiten usw. Musst du
einen Parameter aufgrund seiner Größe auf zwei Bytes aufteilen, dann
helfen dir die Funktionen low() und high(), sind es mehr als 2 Bytes,
dann gibt es auch Funktionen, ist aber alles in der Hilfe zum
AVR-Studio erklärt.

> Bevor ich aber ne'n Taschenrechner herhole und
> da wie'n irrer rumrechne, bediene ich mich doch lieber eines
> solchen Tools.

Wiso wie ein irrer rumrechnen?
Wenn du den Zusammenhang verstehst, dann ist das eine einfache
Multiplikation, die man meist auch ohne Taschenrechner lösen kann
(falls vman nicht zur P.I.S.A.-Generation gehört). Falls man solche
Tools nutzt, weil man den Zusammenhang nicht versteht, dann erkennt man
die Zusammenhänge nie und macht sich lediglich von Anderen abhängig (wie
den Autoren dieser Tools). Gut, man muss das Rad nicht jedesmal neu
erfinden, aber es ist vorteilhaft, wenn man es versteht...

> Ich denke, was mir nicht ganz klar ist und wo der Fehler liegen
> könnte, ist die Übergabe der Werte an C0 mit *(@0<<2)* das hab ich
> so aus einer anderen Schleife übernommen und verstehen tue ich das
> auch nicht, weil's mir noch nie einer erklärt hat...

Das ist ein gutes Beispiel für das, was ich meine...
Es bringt nix, anderer Leute Wissen (Programmcode) einzusetzen, ohne es
selbst zu verstehen.
Du hast Teile des Macros (unverstanden) aus einem fremden Quellcode
abgeschrieben. Hättest du diese Information aus der Hilfe zum
AVR-Assembler, dann hättest du auch die Erklärungen dazu lesen können
und hättest sogar eine Chance, die Zusammenhänge zu verstehen.

...hätte... - Gut, hätte ich Enten gekauft wären die Hühner nicht
ersoffen... ;-)

Sorry, ist nicht bös gemeint...

Und schau dir trotzdem mal den Umgang mit dem Timer-Interrupt an, Delay
(Warteschleifen) ist bei größeren Verzögerungszeiten immer eine
Sackgasse.

Bit- & Bytebruch...
...HanneS...

von Michael Buchholz (Gast)


Lesenswert?

...och, keine Bange: Ich hab mir in meinen 43 Jahren ein ziemlich dickes
Fell zugelegt ;o)

Tja, was soll ich sagen:
Wie ich die Zeit einer Schleife berechne, ist mir schon klar und bevor
ich das Tool hatte, hab ich das ja auch "zu Fuss" gemacht. Ist ja
nicht schwierig.

Und das ich nicht ganz so unbedarft bin, magst Du vieleicht daran
erkennen, das ich schon die Vermutung hatte, das da was mit der
Übergabe der Parameter nicht hinhaut; ich hab's wirklich nicht
verstanden und auch in der Doku nichts finden können; vermutlich
ständig dran vorbeigelesen :/

Mit den TimerIRQ's werde ich mich natürlich zu gegebener Zeit auch mal
auseinandersetzen. Bei diesem Projekt spielt es absolut keine Rolle,
weil eh nix anderes zu tun ist als zu warten ;o)


Dank erstmal für Deine Hilfe. Werd' es im Laufe des Tages mal
ausprobieren, wenn die Motorräder sauber, die Hüpfburg meiner Tochter
aufgebaut, mein Kreuzchen für die Landtagswahl gemacht und das Frauchen
zufrieden ist ;o)))

Baba
Micha

von ...HanneS... (Gast)


Lesenswert?

43 ist gut... - War ich vor 12 Jahren auch mal...

Denn man schönen Sonntag und mach das Kreuz ins richtige Feld... 8-D

...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.