Ich könnte mal ein kleines Tutorial schreiben, wie man relativ einfach Delay Loops designen kann. Habs gestern mal in C++ ausprobiert -- im Gegensatz zu PHP oder Python wird das echt schnell, und man kann mit Brute-Force auch Loops dritter Ordnung (3 Register) in Sekundenbruchteilen berechnen. Mit einer einfachen 3-Register Schleife mit nur 9 Befehlen kann man bis zu 50.529.024 Cyles verbraten. Das sind bei 4MHz Takt immerhin 12.6 Sekunden... Wenn Interesse besteht: Anworten! :-) tk.
Hallo Tjabo, wie geht das denn: Delay Loops "echt schnell" ? Die sollen doch gerade langsam sein. In C++ glaube ich auch nicht, daß Du da reproduzierbare Zeiten hinkriegst. Die Delay Loops müssen schon in Assembler sein. Anbei mal mein Macro mit dem ich Delay Loops mache. Jedes Delay von 0 ... 65535 Zyklen wird genau ausgeführt. Mit dem neuen Keil-Assembler kann man auch die Begrenzung von 65535 Zyklen bis auf max 4294967295 Zyklen ausdehnen. Es macht aber keinen Sinn so extrem lange Zeiten zu warten, da ist ein Timerinterrupt viel günstiger. Schließlich soll der µC ja nicht sekundenlang toter Mann spielen, sondern z.B. weiterhin auf Tastatureingaben reagieren usw. Deshalb habe ich es bei den 65535 Zyklen belassen. Peter
Moment mal, ich habe in C++ ein Programm geschrieben, um "echt schnell" Assembler-Codes zu berechnen, dann dann im AVR für eine lange Warteschleife sorgen. Prinzipiell könnte man das modular anlegen, um auch andere Prozesser-Typen zu unterstützen. Ist eigentlich eine gute Idee... Beispiel-Output für AVR (schnell berechnet :) ): ; delay cycles = 400000 ; pc width: 16 bit ; assuming jump with rcall to this place. L0: ; RCALL L0 (3 cycles) ldi Rxx, $0b ; delaying 399993 cycles: L1: ldi Ryy, $3c L2: ldi Rzz, $c9 L3: dec Ryy brne L3 dec Ryy brne L1 dec Rxx brne L2 ; ret ; (4 cycles) Uebrig sind: 0
Ich glaube, jetzt verstehe ich, was Du meinst. Beim 8051 laß ich sowas den Assembler in meinem Macro machen. Der Vorteil ist, wenn sich der Quarz ändert oder die Delayzeit, dann trage ich nur den neuen Wert in den Macroaufruf und assembliere neu, das ist alles. Beim AVR scheinen solche Macros leider nicht möglich zu sein. Deshalb muß man wohl den äußerst umständlichen Weg gehen und die Delaywerte selber berechnen. Und deshalb hast Du dazu ein extra C++ Programm geschrieben. Wenn ich das aber richtig verstehe, muß man trotzdem den Code und die entsprechenden Werte von Hand eintippen. Du könntest doch Dein Programm so erweitern, daß es automatisch den Quelltext nach z.B. "DELAY xxx" durchsucht und dann den entsprechenden Code selber einfügt. Peter
Hi Tjabo, ich muß mich korrigieren. Man kann auch mit dem AVR Assembler genaue Delayschleifen automatisch berechnen lassen. Ein extra C++ Program ist also unnötig. Ich habs mit in die Codesammlung gestellt: http://www.mikrocontroller.net/forum/read-4-15758.html Peter P.S.: Was ist "PHP" bzw. "Python" ?
Hi, PHP und Python sind genauso wie auch Perl oder ASP (wem fallen noch mehr ein?) Skriptsprachen, hauptsächlich zur dynamischen Erstellung von Webseiten genutzt. Gruss Andre
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.