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

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