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
Du berücksichtigst die Taktfrequenz des Controllers nicht... Besser als mit Delay steuerst du deine Programme aber mit einem Timer-Interrupt. ...
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 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 ...
... 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
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...
...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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.