Einfache Frage über Assembler

Gast #572499
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!!
Angehängte Dateien:
#572511
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...

...
Gast #572688
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren