Forum: Mikrocontroller und Digitale Elektronik Hilfe bei 8051


von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

Hallo, mache gerade eine kleine Weiterbildung, und habe da ein Problem 
bei einem Programm, welches ihr im Dateianhang findet.

Meine Frage, wie kommt man darauf, das die Adressen und der Inhalt des 
Stack
ADR31H=08H und ADR32=01H ist????????

Habe keine Ahnung!!!

Ich hoffe es kann mir jemand weiterhelfen, Danke schon mal!

Thomas

von Michael U. (Gast)


Lesenswert?

Hallo,

das Risiko ist recht groß, daß nur wenige helfen.

Programmbeispiele als Excel, Word, PDF, JPG sind schon deshalb wöllig 
sinnfrei, weil man sie nicht mal schnell durch einen Assembler und 
Simulator schicken kann.

Wie kommt man nur auf solche Ideen? Sind Textdateien wirklich schon 
ausgestorben???

Sorry, daß ich Dir bei Deinem Problem nicht weiter helfen kann.

PS: Ja, ich hätte auch die Klappe halten können... SCNR

Gruß aus Berlin
Michael

von Peter D. (peda)


Lesenswert?

Thomas wrote:

> Ich hoffe es kann mir jemand weiterhelfen

Ja.

Aber nur dann, wenn Du den Quelltext im Original postest, also als 
*.ASM. *.C oder wie es heißt.

Quelltexte in ein *.XLS, *.DOC, *.PDF zu verwursten, das ist 
ober-Bääähhh.


Peter

von Thomas (Gast)


Lesenswert?

Das würd ich gerne machen, aber wie???

Ich bin in der Microcontroller-Technik neu, sorry!!!!

Thomas

von Linuxhippy (Gast)


Lesenswert?

nix wie ungut, aber ws hat das mit kikrocontroller-technik zu tun?
QuellText ins Wordpad kopieren und bei "Speichern als"->".txt" wählen?

von Obelix (Gast)


Lesenswert?

Das hat nix mit Microcontroller zu tun, sondern nur mit dem Programm, 
mit dem du dein Quellcode schreibst.

von Peter D. (peda)


Lesenswert?

Linuxhippy wrote:
> nix wie ungut, aber ws hat das mit kikrocontroller-technik zu tun?
> QuellText ins Wordpad kopieren und bei "Speichern als"->".txt" wählen?

Viel zu kompliziert.

In der Statuszeile des Editors ablesen, wie das Quelltextfile heißt und 
dann genau dieses posten.


Peter

von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

Ist es so besser?

Kann mir jetzt jemand sagen wie man auf das Ergebnis kommt?

von Peter D. (peda)


Lesenswert?

Thomas wrote:
> Ist es so besser?

Nein, das ist das Debugfenster.

Du mußt das File nehmen, welches Du eingetippt hast.



Peter


P.S.:
Lernt man heute wirklich nicht mehr, daß alles auf einem PC in Dateien 
organisiert ist ?

Und das es ausführbare Dateien gibt und (Quell-)Textdateien, die z.B. 
der Assembler verarbeitet.

Schalte mal im Explorer die Option "Dateierweiterungen ausblenden" aus.

von Thomas (Gast)


Lesenswert?

  DAUER    EQU 0AH

0000      ORG 0000H
0000      LJMP BEGIN
0100      ORG 0100H
0100  BEGIN:    MOV SP,#2FH
0103      MOV P1,#01H
0106  SCHLEIF:  ACALL ZEIT
0108      CPL 90H
010A      LJMP SCHLEIF

0200      ORG 0200H
0200  ZEIT:    MOV R0,#DAUER
0202  PAUSE:    DJNZ R0, PAUSE
0204      NOP
0205      RET

von Peter D. (peda)


Lesenswert?

Die "0000" usw. hast Du doch nicht eingetippt, die hat der Debugger 
hinzugefügt.

Ich geb auf.


Peter

von Gargamel (Gast)


Lesenswert?

Ich bin zwar zur Zeit fit in 8051'er Assembler, aber deine Frage ist 
völlig unverständlich!

Bitte nochmal genau formulieren, sonst kann dir keiner weiterhelfen.

von Thomas (Gast)


Lesenswert?

Nein, ich hab das im Word Pad eingetippt, und nichts anderes gemacht.

Kann man den hier nicht normal mit einem umgehen?

Wollte nur eine "für euch" kleine hilfe, aber das ist ja anscheinend 
nicht möglich!

von Thomas (Gast)


Lesenswert?

Bei dem oben eingetippten Programm, muss ich folgende Frage beantworten:

Geben sie Adressen und Inhalt des Stack an!!!

Lösung: ADR30H = 08 und ADR31H = 01H

Wie kommt man da drauf???

von spess53 (Gast)


Lesenswert?

Hi

$0108 ist die Adresse nach dem 'acall'. Diese wird bei acall auf dem 
Stack gespeichert und mit ret angesprungen.

MfG Spess

von Dieter Werner (Gast)


Lesenswert?

Hallo Thomas,

jetzt ist das Ganze schon etwas klarer.

Mit MOV SP,#2FH wird der Stackpointer (SP) auf die Adresse 2FH 
initialisiert.
Wie spess53 schon sagte wird auf Adresse 0106 ein acall ausgeführt und 
das führt dazu, dass auf dem Stack die Rückkehradresse 0108 abgelegt 
wird.

Beim 8051 wird vor dem Ablegen von Werten auf dem Stack dieser 
inkrementiert.
Also landet auf Adresse 30 das low Byte der Rückkehradresse 0108, also 
die 08 und auf der nächsthöheren Adresse 31 findet sich das high Byte 
01.

von Thomas (Gast)


Lesenswert?

Hallo Dieter!

Danke, jetzt hab ich es verstanden!!! Super!

Da bleibt nur noch eine Frag: Warum wird das ganze auf Adresse 30 und 
Adresse 31 abgelegt???

von Dirk H. (arm-dran)


Lesenswert?

Thomas wrote:
>   DAUER    EQU 0AH
>
> 0000      ORG 0000H
> 0000      LJMP BEGIN

ResetVector Sprungasdresse nach "BEGIN" Dieser Befehl ist der erste nach 
dem Reset

> 0100      ORG 0100H

Ab Adresse 0100H beginnt das eigentlich Programm

> 0100  BEGIN:    MOV SP,#2FH

Stackpointer auf 2Fh - erstes Byte was in den Stack geschrieben wird 
SP+1
also in 30h

> 0103      MOV P1,#01H

Port1 Bit 0 auf 1 , man könnte auch schreiben "setb P1.0"

> 0106  SCHLEIF:  ACALL ZEIT

Unterprogrammroutine für eine kleine Zeitschleife aufrufen

> 0108      CPL 90H

Blöd geschrieben, bedeutet Port1 Bit 0 wird invertiert
besser geschrieben cpl P1.0
complement = invertieren  0=1 und 1=0

> 010A      LJMP SCHLEIF

Nach "SCHLEIF" springen

>
> 0200      ORG 0200H

Ab Adresse 0200h kommt die Routine zur Zeitverzögerung

> 0200  ZEIT:    MOV R0,#DAUER
> 0202  PAUSE:    DJNZ R0, PAUSE
> 0204      NOP
> 0205      RET

Die Dauer des Durchlaufs dieser Routine ist vom µC Typ und Taktfrequent 
abhängig

Somit wechselt der Zustand von PORT1 Bit0 in regelmäßigen Abständen
eine bestimmte Frequenz wird an PortPin 1.0 erzeugt (blinken)

von Thomas (Gast)


Lesenswert?

Bedeutet folgender Befehl das ich mich in einer Endlosschlefe befinde???

M1: LJMP M1

von Dirk H. (arm-dran)


Lesenswert?

ja! in einer endlosen Endlosschleife ;-)

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

1
Das folgende Programm gibt eine Pulsolge am Port P1.0 aus. Es wurde gegenüber dem Programm Rechteckgenerator optimiert      
2
      
3
  DAUER  EQU 0AH  
4
0000    Org 0000H  Hauptrogramm
5
0000    LJMP BEGIN  
6
0100    ORG 0100H  Beginn des Hauptprogramms
7
0100  BEGIN:  MOV SP,#2FH  SP=2FH
8
0103    MOV P1,#01H  P1.0= "1"                            WARUM MACHT MAN DIESEN BEFEHL??
9
0106  SCHLEIF:  ACALL ZEIT  Aufruf Unterprogramm Zeit
10
0108    CPL 90H  P1.0= "0"                            WARUM MACHT MAN DIESEN BEFEHL??
11
010A    LJMP SCHLEIF  Rücksprung, (Endlosschleife)
12
      
13
      
14
0200    ORG 0200H  Beginn des Unterprogramms)
15
0200  ZEIT:  MOV R0,#DAUER  Zeitdauer -->R0
16
0202  PAUSE:  DJNZ R0,PAUSE  (R0-1); wenn nicht 0, Sprung nach Pause
17
0204    NOP  keine Operation
18
0205    RET  sonst zum HP zurück
Inhalt des XML-Files, wozu gibts C&P ;)

von Thomas (Gast)


Lesenswert?

Ich weis ich bin lästig, aber kann mir vielleicht jemand folgendes 
Programm erklären???

Am Anfang springe ich ja gleich mit LJMP 0400H, und später befinde ich 
mich in der Endlosschleife M1, aber wie bitte komm ich in die 
Interruptroutine???
Der Sprung LJMP 0600H wird doch nicht ausgeführt, da ich ja am Anfang 
nach 0400H springe!!!

0000    ORG 0000H
0000    LJMP 0400H  Programm springt zu Adress 0400, und lässt
0003    ORG 0003H  ORG 0003H und LJMP 0600H ja aus,oder???
0003    LJMP 0600H

0400    ORG 0400
0400    SETB P3.2
0402    MOV TCON,#00H
0405    SETB EX0
0407    SETB EA
0409    MOV P1,#00H
040C    SETB P1.0
040E  M1:  LJMP M1

0600    ORG 0600H  Wie komme ich zu dieser Adresse,da LJMP 0600
0600    CPL P2.0  am Anfang ja ausgelassen wird und ich mich
0602    MOV R3,#0FFH  später ja in der
0604  M3:  MOV R4,#0FFH  Endlosschleife M1 befinde???
0606  M4:  DJNZ R4,M4
0608    DJNZ R3,M3
060A    RETI

von Dirk H. (arm-dran)


Lesenswert?

Indem Du am µC PIN für dem External Interrupt 0 einen auslöst.
siehe Datenblatt.

von Thomas (Gast)


Lesenswert?

Bedeutet das das ich mit SET P3.2 zur LJMP 0600H gelang???

von Dirk H. (arm-dran)


Lesenswert?

Thomas wrote:
> Bedeutet das das ich mit SET P3.2 zur LJMP 0600H gelang???

Mit setb P3.2 wird der Port auf "1" gesetzt also als Eingang geschaltet.
Nimm meinetwegen einen Taster, schließe Ihn auf der einen Seite an P3.2 
an
auf der anderen Seite an Masse. Dann betätige Ihn und Dein Programm 
springt nach 0600H.

von Andreas K. (oldcoolman)


Lesenswert?

Hallo Thomas,

falls du da noch weiterliest,

ORG ist KEIN Befehl der vom Prozessor ausgeführt wird,
sondern eine Anweisung an das Übersetzungsprogramm,dem Assembler,
den nachfolgenden Code ab der nachfolgenden Adresse zu schreiben

org 03 -> code ab jetzt ab adresse 03 (einsprungadresse für int 0)
LJMP 600

das heißt, daß der befehl ljmp600 auf adresse 03 steht

siehe adressangaben links.

Gruß

ANdreas

von Thomas (Gast)


Lesenswert?

Hallo!

Habe jetzt soweit alles verstanden!

Eine frage hätte ich noch. Wenn ich in einer Endlosschleife bin, und 
dann ein Interrupt kommt, befinde ich mich in einer 
Interruptroutine...wenn ich dann durch RETI wieder ins Hauptprogramm 
gelang, befinde ich mich dann wieder in der Endlosschleife???

P.s Hat jemand einen Emulator in dem ich solche kleinen Programme mal 
schritt für schritt simulieren kann??? Ein deutscher wäre nicht 
schlecht!

Danke schon mal

von Andreas K. (oldcoolman)


Lesenswert?

hallo,
ich denke schon, sonst würde der prozessor anderst auch mal eben
einen Befehl auslassen. das darf nicht sein.

google mal nach nem debugger/simulator.

gruß

ANdreas

von Dirk H. (arm-dran)


Lesenswert?

Hallo Thomas,

nimm doch die kostenlose Entwicklungsumgebung bestehend aus:

MIDE51

+

Self-Executable file setup. Packed with
ASEM-51 V1.3 MCU file Jul 17, 2005,
SDCC 2.6.1 (snapshot and document 060914)
Simulator : TS Control Emulator 8051 v1.0 (evaluation 2KB simulator 
limited)
and another simulator: JSIM-51 v4.05
download packed file size: 4,772 KB.

benutzte folgendenen Link:

http://www.opcube.com/home.html

Inbegriffen sind hier Assembler, IDE, GNU C-Compiler, Simulator für 
8051.

Gruß

Dirk

von Henk (Gast)


Lesenswert?

Und, ehm... Ja: Du bist wieder in der Endlosschleife. Solange Du nichts 
am Stack in der Interrupt-routine schraubst.

Hend

von Dirk H. (arm-dran)


Lesenswert?

Endlosschleife ist eigentlich nicht korrekt.

Denn selbst wenn Du Dein System Tag und Nacht laufen lässt,
werden die Bauteile irgendwann mal das zeitliche Segnen oder
der Strom wird abgeschafft.

Spätestens dann ist es zu Ende mit der Endlosschleife ;-)

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.