Assembler-Befehle als Datenspeicher

Gast #3685540
Lesenswert?
• ▲
▼
Hi, ich suche eine Methode um möglichst schnell Daten Byteweise am Port 
eines Atmega Controllers (Atmega8/16/32/64/1280/2560) auszugeben. 
Gleichzeitig soll der Flash als Datenspeicher dienen.

Folgende Überlegung:
Statt mit Zeitverlust auf Variablen im Flash oder RAM zuzugreifen 
schreiben ich den c-Befehl:
1
PORTB=0b11110000;

Ich habe also Ausgabebefehl und Datenspeicherung in einer Zeile. Wie 
sieht das ganze in Assembler aus?
1
ldi r16, 0xF0
2
out PORTB, r16

Gibt es in Assembler auch einen Befehl wie in C oder ist dies die 
schnellste Umsetzung des genannten C-Befehls?

Kennt jemand eine schnellere Methode, um mit einem ATmega ein Byte an 
den Port zu bringen?

mfg, 006
#3685565
Lesenswert?
• ▲
▼
006 schrieb:
> Wie
> sieht das ganze in Assembler aus?

Du weißt aber schon, dass dein o.g. "C-Befehl" letztendlich auch in 
Assembler "umgeformt" wird. Das Listing kann man sich ansehen. Ein 
einzelner Befehl in C, kann durchaus in mehreren Assembler Instruktionen 
enden.

006 schrieb:
> Kennt jemand eine schnellere Methode, um mit einem ATmega ein Byte an
> den Port zu bringen?

Wenn das nicht reicht, würde es mich interessieren was genau du machst. 
Selbst mit Hardware (SPI & Co.) wird das Ganze kaum schneller gehen.

Mit freundlichen Grüßen,
Karol Babioch
Gast #3685580
Lesenswert?
• ▲
▼
out PORT,rn
benötigt einen Takt. Schneller geht es nicht.
Und rn muss vorher geladen werden:
ldi rn,const
Auch ein Takt.
Man kann also einen Konstantenblock mit maximal dem halben Systemtakt 
ausgeben.
Gast #3685597
Lesenswert?
• ▲
▼
006 schrieb:

> Gibt es in Assembler auch einen Befehl wie in C oder ist dies die
> schnellste Umsetzung des genannten C-Befehls?

Es ist die schnellste.

> Kennt jemand eine schnellere Methode, um mit einem ATmega ein Byte an
> den Port zu bringen?

Noch schneller geht nur, wenn man die Zahl der verschiedenen Werte für 
die Ausgabe auf 32 begrenzen kann.

Der Trick ist dabei einfach, die 32 verfügbaren Register mit eben diesen 
32 Werten vorzuladen und dann während der eigentlichen Ausgabe immer nur 
"out Port,Register" zu machen.

Das ist dann aber wirklich das endgültige Ende der Fahnenstange, mehr 
als eine Ausgabe pro Takt geht nun wirklich absolut nicht.
#3686049
Lesenswert?
• ▲
▼
spontan schrieb:
> Falscher Ansatz??
>
> Nimm die Anforderung, setz dann eine Sicherheitsmarge drauf.
> Such Dir einen schnellen Prozessor. Einen wirklich schnellen. Keine
> Krückenkonstrucktion.

Einmal den Tread komplett durchlesen und deine Antwort hätte sich 
erübrigt. TO Schrieb:

006 schrieb:
> Ist nur eine Theoretische Überlegung, welche Datenraten ein Atmega in
> der Ausgabe schaffen kann.

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.