Forum: Mikrocontroller und Digitale Elektronik Assembler Grundlagen


von O. A. (sokrates1989)


Angehängte Dateien:

Lesenswert?

Hallo, ich  habe das Fach Microcontroller im 4. Semester (Studiengang 
Elektrotechnik) und wir fangen jetzt an zu programmieren. ich  bin 
blutiger Anfänger in Assembler. Wir verwenden den ATmega8 von Atmel und 
das myAVRMK2

nachfolgend ist ein Auszug aus einer Aufgabe, bei der eine LED leuchten 
soll.

main:
ldi r16 , LOW(RAMEND) ; Init Stackpointer
Low out SPL , r16     ; init Stack
ldi r16 , HIGH(RAMEND) ; init Stackpointer High
out SPH , r16          ; init Stack
sbi DDRB , 0           ; PORT B.0 = 1 Ausgang

kann mir jemand grob schildern was hier vor sich geht? Ich weiß was LDI 
ist, und ich weiß ungefähr was ein Stackpointer ist (=ein 
Stapelspeicher) DDR ist das Register? und ich weiß das SBI bedeutet, es 
soll eine "1" ins Register für den Port B.0 gesetzt werden. Ich verstehe 
aber nicht was es mit dem Low(RAMEND) und dann High(RAMEND) auf sich 
hat. Ausserdem verstehe ich nicht was out SPL, r16 und out SPH, r16 
bedeuten soll. Danke!

von Löten macht Spaß (Gast)


Lesenswert?

Der Stack wird einfach auf das obere Ende des RAMs initialisiert. Da der 
Stack rückwärts in das RAM läuft, ist das die allgemeine Vorgehensweise. 
Neuere AVRs machen das automatisch beim RESET.

von fop (Gast)


Lesenswert?

DDRB ist ein sogenanntes "special function register", also keine 
gewöhnliche Speicherzelle, in die man einen Wert reinschreibt, und alles 
was passiert, ist dass der Wert auch beim Lesen wieder raus kommt. Der 
Wert, den Du auf DDRB schreibst wird vom Port B benutzt, um einzustellen 
welcher Pin Ausgang und welcher Eingang ist. Bei AVRs werden unter jeder 
Adresse 8 Bit adressiert. Da ein Bit pro Portpin ausreicht, passen also 
die Infos von 8 Portpins in das Register.
Es ist nicht gesagt, dass immer alle 8 benutzt sind, oft liest man auch 
nicht den Wert zurück, den man hinein geschrieben hat. Manchmal steht 
auch eine Warnung im Datenblatt, dass man unbedingt nur den Wert 0 in 
bestimmte Bits schreiben soll, weil das Bit entweder eine 
undokumentierte Funktion besitzt oder für spätere Erweiterungen genutzt 
werden soll.
Das ganze heißt memory mapped io. Im Gegensatz z.B. zum Z80, der eigene 
Bussteuerleitungen und Befehle hatte, um die Peripherie anzusprechen.
Memory maaped hat den Vorteil, dass Du eigentlich alle 
Adressierungsarten hast, die es auch für normalen Speicher gibt. 
Nachteil ist, dass Du gnadenlos mit dem Stackpointer auf so einen 
Bereich zeigen kannst, oder wenn nicht wie beim AVR getrennt (Buch 
aufschlagen bei Harvard vs. von Neumann Architektur) den Inhalt der 
Peripherieregister der CPU als Programm unterjubeln kannst.
Immer noch nicht verwirrt : Intel hat mit dem 8051 den Vogel 
abgeschossen und RAM mit memory mapped SFRs auf die selben Adressen 
gelegt. Ausgewählt wird durch die Adressierungsart.
Die out-Befehle zähle ich jetzt mal als Adressierungsart, Du sprichst 
damit auch nur Speicherstellen unter einer anderen Nummer an, an die Du 
auch mit anderen Befehlen zum Speicherzugriff dran kommst.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Zum Nachschlagen immer praktisch - der AVR Befehlssatz:
http://www.atmel.com/images/Atmel-0856-AVR-Instruction-Set-Manual.pdf

von Norbert T. (atos)


Lesenswert?

Zum Nachschlagen noch praktischer - der AVR Assembler Tutorial:
https://www.mikrocontroller.net/articles/AVR-Tutorial

und hier direkt zum Stack:
https://www.mikrocontroller.net/articles/AVR-Tutorial:_Stack

von paule (Gast)


Lesenswert?

Ostap A. schrieb:
> Stapelspeicher) DDR ist das Register? und ich weiß das SBI bedeutet, es
> soll eine "1" ins Register für den Port B.0 gesetzt werden. Ich verstehe

DDRB ist ein Register. Näheres dazu im Datenblatt für ATMega8


> aber nicht was es mit dem Low(RAMEND) und dann High(RAMEND) auf sich

RAMEND ist in der includierten Datei "m8def.inc" definiert. Ein 
Speicheradresse, deren Wert plausiebel wird, wenn man sich mit dem 
Speicheraufbau des Mega8 beschäftigt hat.

> hat. Ausserdem verstehe ich nicht was out SPL, r16 und out SPH, r16
> bedeuten soll. Danke!

SPL und SPH findet man auch in der "m8def.inc" definiert und im 
Datenblatt erklärt.

von Wahnwitz von Antenne (Gast)


Lesenswert?

Au backe ... und das nach vier Silvestern !!!

von paule (Gast)


Lesenswert?

Wahnwitz von Antenne schrieb:
> Au backe ... und das nach vier Silvestern !!!

Uiii, und welch ein Wortwitz! Silvester statt Semester. Ha ha ha. Das 
habe ich ja noch nie gehört.

von Didi (Gast)


Lesenswert?

Naja - unser Elektrotechnik Prof war ein alter Amateurfunkhase und 
konnte quasi in Wellen denken und war ein Experte in Analogtechnik.

Er gab aber offen zu keinen Schimmer von Digitaltechnik zu haben. 
Assembler konnte der garantiert nicht.

Darum ist es ok im 4 Semester keinen Schimmer von Assembler zu haben :-)

von Brumm (Gast)


Lesenswert?

Silvester sind geil, da kann man rumballern, saufen und dem Prof. ne 
explodierende Zigarre anbieten.

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Ostap A. schrieb:
> habe das Fach Microcontroller im 4. Semester (Studiengang
> Elektrotechnik) und wir fangen jetzt an zu programmieren.

Warum wurden Euch zuvor nicht ein oder zwei Informationen zu den 
benutzten Steinchen gegeben?
Da der µC in ASM programmiert werden soll, dürfte sich das Datenblatt 
zum µC für Dich/Euch bestens eignen - eigentlich werden Ihr Das bei 
jedem 2.ten Handgriff wieder wälzen.

Wie Dir schon gesagt wurde, ist das DDRB-Register das 
Daten-Richtungs-Register (Data Direction Register für Port B).
Somit hast Du den 'Pin' auf LOW (PortB wurde von Dir nicht 'angefasst' 
und sollte somit Null sein) geschaltet.
Eine LED würde gegen Vcc leuchten (sofern ein richtig dimensionierter 
Vorwiderstand genutzt wird, ist aber hoffentlich bekannt).
Wenn jetzt das PortB noch gesetzt wird, schaltest Du den Ausgang auf 
HIGH(=1) oder LOW(=0).
Wenn Das DDR-Register auf 0 steht, ist der entsprechende Pin ein IN und 
mit dem 'Port' wird der PullUP eingeschaltet, oder eben nicht.

Steht aber ALLES im Datenblatt des µC.

Selber habe ich mir die Befehle (beim ATtiny45 2 Seiten) und die 
Register (eine Seite) ausgedruckt und mit den einzigebenden Werten 
erweitert
so z.B., daß
SBI (set Bit I/O-Register) als erstes Argument einen Wert 0-31 wünscht 
und als 2.ten Wert 0-7, also die Bitposition.
Etwas anders dagegen
SBR (set Bit Register) als erstes Register einen Wert 16-31 (nur die 
hohen Register), als zweiten Wert das Bitmuster, also Wert 0-255, also 
alle Bits, die gesetzt werden sollen 'auf ein Mal' (entspricht auch ORI, 
gleiche OpCode)

Diese Listen wirst Du wirklich IMMER brauchen.

Hilfreich ist auch, das PDF des Datenblatt offen zu haben, um schnell 
ein Register oder ein Registerbit suchen zu können, oder welcher Wert 
welcher Teiler ist (CS-Register der Timer).

Wünsche Dir viel Erfolg und hoffe, daß auch Spaß dabei kommt.

MfG

von 6a66 (Gast)


Lesenswert?

Patrick J. schrieb:
> Warum wurden Euch zuvor nicht ein oder zwei Informationen zu den
> benutzten Steinchen gegeben?

Weil das normalerweise irgendwo in den Vorlesungen gesagt wird.
Oder irgendwo im Skript steht.
Oder weil es sich für eine Studenten des 4. Semesters vielleicht gehört, 
auch mal Google zu verwenden nicht um den nächsten Silverster zu finden 
sondern auch mal was zu dem System auf dem ich arbeite.
Und weil Digitaltechnik normalerweise im 4. Semester nicht einfach so 
beginnt sondern in den Semstern vorher das Thema schon eingeführt wird.
Und weil man den Praktikumstutor auch mal fragen kann.

rgds

von O. A. (sokrates1989)


Lesenswert?

Hallo, nochmal

danke für die zahlreichen antworten ich habe heute im labor erfahren 
dass wir diese "Sequenz" wohl einfach bei allen Programmen am Anfang 
verwenden. Es hat also nichts mit der eigentlichen Aufgabe zu tun.

Ich werde trotzdem alle Antworten lesen ..vielleicht verstehe ich es ...

Digitaltechnik hatten wir im 2. ten semester... Da haben wir 
KV-Diagramme gemacht..

Im 3. ten Semester haben wir in C/C++ programmiert. Ich muss ehrlich 
sagen, ich habe alles bestanden aber ich bin absolut kein Fan von 
Informatik.

Wenn ich Mathe 4 statt Microcontroller wählen dürfte...ich würde es ohne 
zu überlegen machen.

Ich hoffe ich kann mich öfter hier im Forum erkundigen, bei 
Verständnisfragen...da "Handbücher" etc am Anfang schon etwas 
überfordern.

Eine vom Menschen formulierte Aussage kann da schon um Lichtjahre nach 
vorne bringen.

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Ostap A. schrieb:
> Wenn ich Mathe 4 statt Microcontroller wählen dürfte...ich würde es ohne
> zu überlegen machen.

Verstehe ich nicht wirklich - Mathe ist 'rein logisch' - genau wie µC.
In meinen Augen ist Mathe um Welten schwerer (umfangreicher), als das 
bisschen µC-Logik.
Wenn gleich ich auch C++ (denke ich Mal) nicht viel abgewinnen kann, da 
erscheint mir Assembler 'sinniger' - muß aber Jeder für Sich selber 
ausmachen.
(wobei ich mir anmaße, daß man als ASM-Progger eher einem 
C-Listing-Problem behilflich sein kann, als anders herum)

Ostap A. schrieb:
> Ich hoffe ich kann mich öfter hier im Forum erkundigen, bei
> Verständnisfragen...da "Handbücher" etc am Anfang schon etwas
> überfordern.

;)
Da wir Dich da kaum dran hindern können, immer wieder gerne.
Wäre aber trotzdem schön, wenn Du Dir die Bücher zuvor angeschaut hast 
und wirklich ein Problem und nicht die Hausaufgabe zu Lösen ist.

MfG

von O. A. (sokrates1989)


Angehängte Dateien:

Lesenswert?

...

von Thomas (Gast)


Lesenswert?

Löten macht Spaß schrieb:
> Neuere AVRs machen das automatisch beim RESET.

Nur manchmal nicht im Datenblatt, vergl. Mega328/Mega328PB... Warum sich 
das nicht ordentlich dokumentieren lässt weiß der Geier.

von Lothar (Gast)


Lesenswert?

Ostap A. schrieb:
> Digitaltechnik hatten wir im 2. ten semester... Da haben wir
> KV-Diagramme gemacht..

> Wenn ich Mathe 4 statt Microcontroller wählen dürfte...ich würde es ohne
> zu überlegen machen.

Also nicht erkannt dass ein Zustandsübergang im KV-Diagramm dasselbe ist 
wie eine Bifurkation einer Parameterkurve im Phasenraum :-)

Und das Unrolling einer rekursiven Funktion im uC dasselbe wie die 
Lösung einer Differenzengleichung ...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.