Hilfe bei 8051

Gast #530128
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
Angehängte Dateien:
Gast #530135
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
#530161
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
#530164
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.
Gast #530170
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
Gast #530174
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!
Gast #530213
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.
#530234
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)
Persönliche Seite #530410
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 ;)
Gast #530423
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
#530536
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.
#531485
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
Gast #531838
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
#532264
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

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