Hallo, ich habe eine Frage um NOP-Operation. Wie lange ist ein NOP-Operation eigentlich? Wie kann man sie rechnen? Beispielerweise arbeite ich mit 20MHz. Ist es einfach so: 1/20MHz = 50ns.. ist das richtig? Pizza
Bei einem AVR könnte das hinkommen. Bei anderen Controllern kann ein Befehslzyklus selbst für nop länger als 1 Takt sein.
Ich versuche gerade ein Delay-Funktion in PIC Controller aufzubauen. Habe ein Source Code von PIC gefunden(Anhang). Ich bin aber sehr schwach mit dem Assembler-Sprache. Hier ist ein Teil von der angehängter Code: ... #elif PIC_CLK == 20000000 #define DelayDivisor 1 #define WaitFor1Us asm("nop"); asm("nop") #define Jumpback asm("goto $ - 6") ... #define DelayUs(x) { \ delayus_variable=(unsigned char)(x/DelayDivisor); \ asm("movlb (_delayus_variable) >> 8"); \ WaitFor1Us; } \ asm("decfsz (_delayus_variable)&0ffh,f"); \ Jumpback; ... Ich habe nicht verstanden, wieso 1 µsec hier gleich 2 mal asm("nop") ist. Mit "DelayUs(x)" habe ich auch nicht verstanden, wie das bedeutet. Es wäre sehr nett, wenn Ihr mir erklären könnten. Danke!!
Das Datenblatt eines AVRs enthält eine Liste, in der alle Befehle mit ihren wichtigen Eigenschaften (Flagbeeinflussung, Platzbedarf, Abarbeitungszeit) aufgelistet sind. Ich halte es für möglich, dass andere Controller-Hersteller das so ähnlich halten. Also schau bitte im verdammten Datenblatt Deines PICs nach... ...
http://www.piclist.com/techref/piclist/codegen/delay.htm - erzeugt fertige Delay-Routinen. Ansonsten: Bei 20MHz hat der PIC 5 MIPS, also braucht ein Befehl 0,2 us Tipps um Programmspeicher mit Delays zu sparen: NOP - einen Maschinenzyklus warten GOTO $+1 - zwei Maschinenzyklen warten, belegt aber nur 1 Stelle im Speicher (weil Sprungbefehle 2 Maschinenzyklen brauchen) 4 Maschinenzyklen warten, belegt aber nur 1 Stelle im Speicher (weil Sprungbefehl und Returnbefehl je 2 Maschinenzyklen brauchen) SUBROUTINE ..... ; IRGENDEIN CODE MOVLW 0X10 MOVWF 0X32 ..... ; IRGENDEIN CODE DUMMYLABEL RETURN ; RETURN ANWEISUNG ..... ; IRGENDEIN CODE CALL DUMMYLABEL ; DELAY 4 ZYKLEN ..... ; IRGENDEIN CODE Einfach ein Dummy-Label bei einer RETURN-Anweisung einfügen. Vorsicht, so etwas kannst du nur machen, wenn du auf den Hardware-Stack aufpasst bzw. im Moment genug Stack-Level hast.
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.