Inline Assembler

Hallo,
ich wollte fragen ob es Inline-Assembler für den Arduino gibt
und wo es ein passendes Tutorial dazu gibt.

Addi

Grüße Uwe

Und gibt es auch ein passendes Tutorial?

Addi

Ein Tutorial zum programieren von AVR in Assembler?

http://www.avr-asm-tutorial.net/avr_de/index.html
http://www.avr-asm-download.de/beginner_de.pdf

oder einfach nach "atmel assembler tutorial" in einer Suchmaschiene suchen.

Auf alle Fälle ist das ein lern- und arbeitsintensives Vorhaben den Controller in Assembler zu programmieren.

Grüße Uwe

Ich versuche nun folgenden Code auszuführen, erhalte dann aber einen Fehler:

void setup() {
  asm("out	DDRB,R16");
}
void loop() {}

Und folgenden Fehler:

C:\Users\Addi\AppData\Local\Temp/ccxlcYaN.s: Assembler messages:
C:\Users\Addi\AppData\Local\Temp/ccxlcYaN.s:29: Error: constant value required

Addi

Weiß jemand wo das Problem liegt?

Addi

Der Assembler-Befehl macht so auch keinen Sinn. Du schreibst ein Register auf einen Port, hast aber keine Ahnung, was im Register drin steht. Zudem ist die Register-Verwendung innerhalb von C-Code nicht so einfach, da der C-Code ja auch von diesen Registern Gebrauch macht und sich bei Überschneidungen unvorhersehbare Zustände ergeben können. Worauf willst Du denn raus? Was ist der Zweck der Assembler-Anweisungen?

Das ist ein Teil von diesem Code.
Ich wollte nur mit einem Befehl testen ob die IDE den Code compilieren kann.

Addi

Der Assembler "constant value required".

DDRB ist keine Konstante. Ansonsten würde der C Compiler bei Zuweisungen DDRB = ... meckern.

Wie kann ich dann DDRB zu einem konstanten Wert ändern?

Addi

Schau mal hier:

unter Punkt 8.1 "Using Constants".

Die Syntax der asm-Anweisung mit Parametern ist schon etwas gewöhnungsbedürftig.

Wenn du es trotzdem versuchen willst, hilft dir Google bei der Suchge nach Tutorials: http://lmgtfy.com/?q=avr gcc inline asm.

Kann man das vermeiden, wenn man die Datei m328Pdef.inc includiert? Wenn ich das
versuche erhalte ich den Fehler dass die Datei nicht gefunden wurde. Egal ob sie im tmp-Verzeichniss
oder im Projektverzeichniss liegt.

void setup() {
  asm(".INCLUDE \"m238Pdef.inc\"");
  asm("out	DDRB,R16");
}
void loop() {}

Addi

Du weisst, dass du keinen Assembler brauchst, um z.B. die atmega328 ports ( DDRB in deinem Beispiel ) direkt in c anzusprechen?
Was der avr-gcc daraus macht, ist nicht wirklich schlechter als eigene asm Kunststückchen.

c --> asm

DDRB = 0xFF;  --> ldi	R16,0b11111111
                  out	DDRB,R16
PORTB = 0;        ldi	R16,0
                  out	PORTB,R16

Ich möchte dies zum lernen von Avr-Assembler machen. Hätte ich einen Programmer würde
ich Atmel Studio verwenden, da ich keinen habe, will ich dies mit der Arduino IDE machen.

Addi

Addi:
Ich möchte dies zum lernen von Avr-Assembler machen.

Dafür ist das Einbinden von "Inline-Assembler" in eine fremde Entwicklungssoftware nicht geeignet.

Per "Inline-Assembler" bindet man in sein Programm allenfalls anderweitig entwickelte, debuggte und getestete Software ein.

Besorge Dir am besten Atmel Studio und einen Programmer, wenn Du selbst in Assembler was für den Arduino programmieren möchtest, dann hast Du was zum Entwickeln, Debuggen und Testen und nicht nur zum Einbinden.

Code per Inline-Assembler einbinden um etwas über Assembler-Programmierung zu lernen ist so wie eine Fertigpizza in den Backofen zu schieben um was über Pizzamachen zu lernen.

Welche Programmer sind mit dem Atmel Studio kompatibel? Evtl. Usbasp ?

Addi

Per "Inline-Assembler" bindet man in sein Programm allenfalls anderweitig entwickelte, debuggte und getestete Software ein.

Besorge Dir am besten Atmel Studio und einen Programmer, wenn Du selbst in Assembler was für den Arduino programmieren möchtest, dann hast Du was zum Entwickeln, Debuggen und Testen und nicht nur zum Einbinden.

Code per Inline-Assembler einbinden um etwas über Assembler-Programmierung zu lernen ist so wie eine Fertigpizza in den Backofen zu schieben um was über Pizzamachen zu lernen

Einspruch Euer Ehren. Normalerweise schreibt man den größten Teil seiner Programme in C/C++ und nur die wirklich kritischen Stellen in Assembler. Und wenn die kurz sind, dann ist Inline Assembler das richtige Mittel. Fertig entwickelte, debuggte udn geteste Teile werden normalerweise als Bibliotheken verschalt und gerade nicht inline eingebunden.

Hier ein Inline Beispiel welches der Pizza Theorie widerspricht: Faster Counter | Blinkenlight

Was die Frage nach einem Programmer angeht: nimm einen AVRISP mk II. Der funktioniert garantiert mit dem Studio. Wenn Du erfahrerner bist kannst Du auch andere nehmen, mir wäre das aber die geringe Ersparnis den Ärger nicht wert (ich habe 2 MK II Programmer und ein No Name Teil hier).

Ich kann hier Udo nur zustimmen. Ich selbst verwende den AVRISP mk II mit dem Atmel Studio 6.0 (allerdings nur für die C/C++-Entwicklung). Ist sehr gut in das Atmel-Studio integriert. Direktes Flashen des Controllers und Starten des übersetzten Programms mit einem Maus-Klick (Menüpunkt Debug->Start without Debugging). Auslesen und Setzen der Fuses, Auslesen des Flash aus dem Controller, Löschen des Speichers, usw.

Und wenn du Assembler lernen willst (und zum Debuggen), brauchst du teilweise eigentlich noch nicht einmal einen Controller und einen Programmer, denn du kannst das Programm stattdessen im Simulator des Atmel Studio laufen lassen. Schritt für Schritt oder bis zu einem Breakpoint, du kannst die Prozessor- und I/O-Register anzeigen lassen und setzen, Speicherbereiche anzeigen lassen, usw.

Wie wird das dann gemacht? Einen ISP werde ich mir dann auch noch kaufen.

Addi

Wie wird das dann gemacht?

Indem Du die Assembler-Befehle mit asm() in the C-Code einbaust. Du hast aber keine Symbole zur Verfügung, DDRB wird dann zu 0x24, das Datenblatt hilft hier weiter.