Forum: Mikrocontroller und Digitale Elektronik Einfache Frage über Assembler


von Pizza (Gast)


Lesenswert?

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

von Sebastian Eckert (Gast)


Lesenswert?

Bei einem AVR könnte das hinkommen. Bei anderen Controllern kann ein 
Befehslzyklus selbst für nop länger als 1 Takt sein.

von Pizza (Gast)


Angehängte Dateien:

Lesenswert?

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!!

von Hannes L. (hannes)


Lesenswert?

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...

...

von tt (Gast)


Lesenswert?

die pic-controller brauchen 4 Takte pro Befehl. --> 1/20MHz x4

von Sergey (Gast)


Lesenswert?

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.

von Pizza (Gast)


Lesenswert?

Ich danke euch!! Es hat mir weiter geholfen.

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.