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
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
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
Das würd ich gerne machen, aber wie??? Ich bin in der Microcontroller-Technik neu, sorry!!!! Thomas
nix wie ungut, aber ws hat das mit kikrocontroller-technik zu tun? QuellText ins Wordpad kopieren und bei "Speichern als"->".txt" wählen?
Das hat nix mit Microcontroller zu tun, sondern nur mit dem Programm, mit dem du dein Quellcode schreibst.
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
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.
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
Die "0000" usw. hast Du doch nicht eingetippt, die hat der Debugger hinzugefügt. Ich geb auf. Peter
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.
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!
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???
Hi $0108 ist die Adresse nach dem 'acall'. Diese wird bei acall auf dem Stack gespeichert und mit ret angesprungen. MfG Spess
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.
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???
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)
Bedeutet folgender Befehl das ich mich in einer Endlosschlefe befinde??? M1: LJMP M1
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 ;)
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
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.
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
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
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
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
Und, ehm... Ja: Du bist wieder in der Endlosschleife. Solange Du nichts am Stack in der Interrupt-routine schraubst. Hend
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.