Verzögerung mit Assembler

Gast #504397
Lesenswert?
• ▲
▼
Hallo,

ich möchte mittels Assembler eine Verzögerung einbauen. Habe aus dem LCD 
Beispiel aus dem Tutorial schonmal folgendes gefunden:

.ifndef XTAL
.equ XTAL = 4000000
.endif

delay50us:                              ; 50us Pause
           ldi  temp1, ( XTAL * 50 / 3 ) / 1000000
delay50us_:
           dec  temp1
           brne delay50us_
           ret

Wofür sind die drei ersten Zeilen eigentlich gut ?? In XTAL steht 
anscheind schonmal die Frequenz von 4Mhz drin, später wird dann etwas in 
temp1 geladen, aber woraus setzt sich das genau zusammen, bzw. was muss 
ich für die 50us rechnen ??

Also bei 4Mhz dauert ein Taktzyklus ja 250ns, dh. ich muss bei einer 
Verzögerung von 50us 200 Taktzyklen abarbeiten !?

Ich hoffe einer kann mir das jetzt noch eindeutig erklären,

Danke,
Christian R.
Gast #504420
Lesenswert?
• ▲
▼
Hallo,

naja, warum selber rechnen, wenn es der Präprozessor des Assembler auch 
kann. ;)

XTAL ist 4 000 000 Hz, also 4 000 000 Schwingungen (damit auch Takte des 
AVR) pro Sekunde.
Das * 50 sind 200 000 000 Takte pro 50 Sekunden.
3 ist die Anzahl Taktzyklen für dec (1) und brne (2).
Also sind 200 000 000 / 3 =  66 666 666 Takte für 50 s mötig-
Die nun noch durch 1 000 000 geteilt macht 66 Schleifendurchläufe für 
50µs

Der Takt des ldi vor der Schleife wird am Schluß vom brne kompensiert, 
der braucht nur 1 Takt, wenn die Bedingung nicht erfüllt ist.

Für "normale" Genauigkeiten machen sich solche Rechnereien immer gut, 
weil man bei Änderung des Taktes nur eine Zuweisung anpassen muß.

Bei mir sieht das meist so aus:
.equ    F_CPU           = 8000000
.equ    CYCLES_PER_US   = (F_CPU/1000000)

.equ  IRQ_TIME  = 10  ; IRQ-Zeit in ms

.equ  VORTEILER    = 64
.equ  COUNT_IN    = F_CPU/VORTEILER  ; Vorteiler 64 - 125000Hz

.equ    TCONST_TIME     = COUNT_IN/(1000/IRQ_TIME)
.equ  COUNT_SEK    = 1000/IRQ_TIME  ; Wert für IRQ-Zähler

.equ  REPEAT_WAIT    = 1000/IRQ_TIME  ;1000ms
.equ  REPEAT_LOOP    =  100/IRQ_TIME  ;Wiederholzeit

.equ  I2C_FREQUENZ  = 100000
.equ  I2C_CLOCK    = ((F_CPU/I2C_FREQUENZ)-16)/2

Gruß aus Berlin
Michael

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.