Forum: Mikrocontroller und Digitale Elektronik Simulation einer Ampel


von Stefan (Gast)


Lesenswert?

Hallo ,

habe ein Problem mir der Simulation dieses Programms über 8051win,
es kommt ständig die Fehlermeldung "Sprung in undefinierten Speicher ,PC 
wird zurückgesetzt"

würde mich freuen wenn ihr mir helfen könntet

include reg51.inc

code at 0

MOV R0,#90h      ;Adr.von Port-1

;Hauptprogramm

schleife:
         MOV P1,#51h
         LCALL eingabe
         MOV P1,#52h
         MOV P1,#54h
         MOV P1,#5Ch
         MOV P1,#54h
         MOV P1,#56h
        LJMP schleife

        ;Unterprogramm für Ruftaste eingabe;

       eingabe:
       MOV A,P1
       ANL A,#20h       ;D5 Markieren
       CJNE A,#20h,eingabe
       MOV P1,#11h     ; Ruf-Speicher löschen

     RET

     end

von spess53 (Gast)


Lesenswert?

Hi

Muss beim 8051 kein Stackpointer initialisiert werden?

MfG Spess

von Peter D. (peda)


Lesenswert?

Stefan schrieb:
> es kommt ständig die Fehlermeldung "Sprung in undefinierten Speicher ,PC
> wird zurückgesetzt"

Mach mal Einzelschritt und dann erzähl mal, an welcher Zeile diese 
Meldung kommt.

spess53 schrieb:
> Muss beim 8051 kein Stackpointer initialisiert werden?

Ja (muß nicht).


Peter

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Peter Dannegger schrieb:
> spess53 schrieb:
>> Muss beim 8051 kein Stackpointer initialisiert werden?
> Ja (muß nicht).
1
By default, the 8051 initializes the Stack Pointer (SP) to 07h when the 
2
microcontroller is booted.

Stefan schrieb:
1
        MOV P1,#51h     ; = 0101 0001  --> es wird eine stramme '0' auf P1.5 ausgegeben
2
        LCALL eingabe
3
:
4
eingabe:
5
        MOV A,P1         ; wenn da jetzt eine '1' reinkommen soll... :-o
6
        ANL A,#20h       ; ... dann hat der Porttreiber was zu tun

BTW:
Probiers mal mit dem Label
        eingabe:
Ganz vorn in der Zeile (wie "schleife:")
eingabe:

von Stefan (Gast)


Lesenswert?

also habs probiert hat nicht geklappt, die fehlermeldung kommt sofort 
wenn ich das programm starte

von MaWin (Gast)


Lesenswert?

Also ich kenn 8051 Assembler ganz anders:

$include (reg51.INC)
CSEG at 0100h

aber vielleicht ist deiner einfach anders.

von Vlad T. (vlad_tepesch)


Lesenswert?

das

Stefan schrieb:
> code at 0

vs

MaWin schrieb:
> CSEG at 0100h

sieht auf jeden Fall verdächtig aus

von Martin (Gast)


Lesenswert?

.. also habs probiert hat nicht geklappt, die fehlermeldung kommt sofort
wenn ich das programm starte ...

Ein Screenshot könnte helfen.

von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

also die fehlermeldung kommt nciht mehr aber das programm funkt noch 
nciht richtig

wenn ich auf den taster drücke passiert nichts

von Karl H. (kbuchegg)


Lesenswert?

Stefan schrieb:
> also die fehlermeldung kommt nciht mehr aber das programm funkt noch
> nciht richtig
>
> wenn ich auf den taster drücke passiert nichts

Willkommen in der Programmierung.
Das was du jetzt vor dir hast, nennt man Debuggen.

Wenn also Programmieren das 'Einbauen' von Fehlern bedeutet, dann ist 
debuggen das finden und Ausbauen von Fehlern.

Da musst du durch. Du wirst in Zukunft die meiste Zeit in der 
Projektentwicklung mit debuggen verbringen. Besser du fängst gleich 
damit an, die Techniken dazu zu lernen.

Und eine davon ist: Programm in Einzelschritten durchgehen und sich alle 
Registerinhalte ansehen. Das ein Programm, das du schreibst auf Anhieb 
korrekt läuft, das ist die große Ausnahme.

von Jobst M. (jobstens-de)


Lesenswert?

Stefan schrieb:
1
include reg51.inc
2
3
code at 0
4
5
MOV R0,#90h      ;Adr.von Port-1
Wozu? Die letzte Zeile ist unnötig.
1
;Hauptprogramm
2
3
schleife:
4
         MOV P1,#51h
5
         LCALL eingabe
6
         MOV P1,#52h
7
         MOV P1,#54h
8
         MOV P1,#5Ch
9
         MOV P1,#54h
10
         MOV P1,#56h
11
        LJMP schleife
12
13
        ;Unterprogramm für Ruftaste eingabe;
14
15
       eingabe:
16
       MOV A,P1
17
       ANL A,#20h       ;D5 Markieren
MaSkieren?
1
       CJNE A,#20h,eingabe
2
       MOV P1,#11h     ; Ruf-Speicher löschen
3
4
     RET
5
6
     end

Das Unterprogramm macht hier eigentlich gar keinen Sinn, da nur von 
einer Stelle dort hin gesprungen wird. Es kann also auch gleich dort hin 
geschrieben werden. Stack wird dann zumindest gar nicht mehr benötigt.

Die Ampelphasen sind recht kurz ;-)

Deinen Knopf wirst Du nie abfragen können, da Du das maSkierte Bit auf 0 
setzt. Eingänge müssen beim 8051 auf 1 gesetzt werden. Wenn Du 
versuchst, einen auf 0 gesetzten Ausgang mit +5V auf 1 zu setzen, 
zerstörst Du den Ausgang. Also Taster gegen Masse.

Irgendwie spielt sich bei Dir alles an Port 1 ab. Das mit dem 
Rufspeicher habe ich allerdings nicht so recht verstanden.


P1.0 = grün
P1.1 = gelb
P1.2 = rot
P1.3 = Fussgänger grün
P1.4 = immer 1 ?
P1.5 = Knopf für Fussgänger
P1.6 = Ruf-Speicher ... ?
P1.7 = immer 0 ?


Gruß

Jobst

von Stefan (Gast)


Lesenswert?

das programm ist schon so vorgegeben ich hab echt keine ahnung wieso das 
nciht funkt hab schon genung probiert echt keine nerven mehr dafür das 
wars mit mikrocontroller

trozdem danke

@karl heinz sowas zu schreiben ist unnötig sry

von Jobst M. (jobstens-de)


Lesenswert?

Stefan schrieb:
> das programm ist schon so vorgegeben ich hab echt keine ahnung wieso das
> nciht funkt

Weil es so schlicht nicht richtig funktionieren kann.
Die Vorgabe ist Müll.


> hab schon genung probiert echt keine nerven mehr dafür das
> wars mit mikrocontroller

Hmmm, wenn die Vorgaben schon Müll sind, kann dabei natürlich kein Spaß 
aufkommen. Das ist echt schade.


> @karl heinz sowas zu schreiben ist unnötig sry

Was er damit sagen wollte war, daß Du das Programm Schritt für Schritt 
durchgehen solltest und dabei zusiehst, was Dein Programm macht und wie 
es darauf auch reagiert - wo macht es auf einmal etwas, was Du Dir nicht 
so vorgestellt hast?

Gib nicht so schnell auf, später wirst Du darüber lachen!

1
include reg51.inc   ;benötigst Du, damit der Kompiler z.B. weiß, welchen SFR-Namen er welcher Adresse zuordnen muss.
2
3
code at 0   ;Bedeutet, daß Dein Code bei Adresse 0x0000 beginnt.
4
5
6
MOV R0,#90h      ;Adr.von Port-1
7
;Wozu benötigst Du in Register 0 die Adresse von Port 1?
8
;Du rufst Register 0 ja nie wieder ab!
9
;Zumal Du statt #90h auch P1 schreiben kannst. (Was Du unten ja auch tust)
10
11
12
;Hauptprogramm
13
14
schleife:
15
         MOV P1,#51h        ; hier gibst Du ein Muster für die Ampel vor
16
         LCALL eingabe      ; hier springst Du nach unten. Die Adresse HIER wird auf den Stack geschoben (2 Byte)
17
         MOV P1,#52h        ; Weitere Muster in Abfolge
18
         MOV P1,#54h        ; (Ampel wird rot, Fussgänger bekommen grün
19
         MOV P1,#5Ch        ; ... und zurück)
20
         MOV P1,#54h
21
         MOV P1,#56h
22
        LJMP schleife       ; wieder oben anfangen
23
24
25
26
        ;Unterprogramm für Ruftaste eingabe;
27
28
       eingabe:
29
       MOV A,P1             ; P1 abfragen.
30
       ANL A,#20h           ; Taste maskieren (ist immer 0, weil P1.5 in Deinen Mustern schon auf Masse liegt)
31
       CJNE A,#20h,eingabe  ; Wenn P1.5 nicht gesetzt ist, dann zu eingabe springen (also immer!)
32
       MOV P1,#11h          ; Ruf-Speicher löschen
33
; der Sinn und die Funktion des Rufspeichers ist mir immer noch ein Rätsel, da er auch nie wieder abgefragt wird und direkt nach der Rückkehr überschrieben wird.
34
35
     RET                    ; Auf dem Stack abgelegte Adresse zurück holen und dort weiter machen.
36
37
     end                    ; Dem Kompiler sagen, daß hier Ende ist.

Warum dort allerdings diese Fehlermeldung kommt, weiß ich nicht.
Versuch einfach mal den Stack nach oben zu legen:
1
include reg51.inc
2
3
code at 0
4
5
;MOV R0,#90h      ;Adr.von Port-1 (unnötig)
6
7
MOV SP, #40h      ; Stackpointer mitten in die 128Byte Ram
8
9
;Hauptprogramm
10
11
...




Mein Vorschlag für dieses Problem:
1
include reg51.inc
2
code at 0
3
4
5
schleife:
6
         MOV P1,#F1h ; Auto grün
7
eingabe: JB P1.5, eingabe  ; auf den Knopf (gegen Masse) warten
8
         MOV P1,#F2h ; Auto gelb
9
         MOV P1,#F4h ; Auto rot
10
         MOV P1,#FCh ; Auto rot + Fussgänger grün (P1.3 = 1)
11
         MOV P1,#F4h ; Auto rot + Fussgänger rot (P1.3 = 0)
12
         MOV P1,#F6h ; Auto rot+gelb
13
        LJMP schleife
14
15
16
     end

... sollte exakt das selbe bewirken



Gruß

Jobst

von Peter D. (peda)


Lesenswert?

.1
Stefan schrieb:
> MOV R0,#90h      ;Adr.von Port-1

Auch wenn es den OP nicht mehr interessiert, das ist Quatsch mit Soße.

Die SFRs lassen sich nicht indirekt adressieren !!!

2.
Stefan schrieb:
> schleife:
>          MOV P1,#51h
>          LCALL eingabe
>          MOV P1,#52h
>          MOV P1,#54h
>          MOV P1,#5Ch
>          MOV P1,#54h
>          MOV P1,#56h

Warum müssen immer Lehrer Programmieren lehren, die selber nicht 
programmieren können. Wie soll der Schüler erkennen, daß er zeigt, wie 
man es nicht machen darf?

Man schreibt keine kryptischen Hexwerte in ein Programm und man schreibt 
auch keine Programme ohne Kommentar.
Das Definieren von Symbolen und das Schreiben von Kommentaren muß zuerst 
gelehrt werden. Sonst ist es klar, daß nichts dabei rauskommen kann und 
die Schüler die Lust verlieren.

3.
Der 8051 hat wunderschöne Bitbefehle, damit ist ne Ampel popeleinfach:
1
rot     equ     p1.0    ; symbole definieren
2
gelb    equ     p1.1
3
gruen   equ     p1.2
4
5
        setb    rot     ; rot aus (low active)
6
        clr     gelb    ; gelb an
7
        call    pause
8
        setb    gelb    ; gelb aus
9
        clr     gruen   ; gruen an
10
        call    pause
11
                        ; usw.
12
pause:
13
                        ; hier wartezeit einfügen
14
        ret


Peter

von Stefan (Gast)


Lesenswert?

also hab heute vom lehrer erfahren ,dass das Programm nciht 
funktionieren kann und sollte das so umändern

>          MOV P1,#31h
>          LCALL eingabe
>          MOV P1,#12h
>          MOV P1,#14h
>          MOV P1,#1Ch
>          MOV P1,#14h
>          MOV P1,#16h


wir hatten das alte RIDE mit dem neuen RIDE7 kann ich das irgendwie 
nciht als a 51 datei abspeichern gibts da ne alternative zu  ??

mfg

von Jasper (Gast)


Lesenswert?

Hi

ich glaube um in Ride7 mit a51 Dateien arbeiten zu können, muss man sich 
das RKit-Eval51 runterladen und zusätzlich installieren.

Auf der Homepage von Raisonance rechts auf Downloads klicken, und dann 
die Datei "RKit-51_6.08.10.0309_eval.exe" downloaden.

Gruß
Jasper

von Jobst M. (jobstens-de)


Lesenswert?

Peter Dannegger schrieb:
> Der 8051 hat wunderschöne Bitbefehle, damit ist ne Ampel popeleinfach:

Ist aber im Einzelschrittmodus in der Simulation nicht besonders 
anschaulich.
Ebenso wie das Abarbeiten einer Zeitschleife.


Stefan schrieb:
> also hab heute vom lehrer erfahren ,dass das Programm nciht
> funktionieren kann und sollte das so umändern

Damit wird sich aber die Fehlermeldung nicht ändern.



Gruß

Jobst

von Peter D. (peda)


Lesenswert?

Jobst M. schrieb:
> Peter Dannegger schrieb:
>> Der 8051 hat wunderschöne Bitbefehle, damit ist ne Ampel popeleinfach:
>
> Ist aber im Einzelschrittmodus in der Simulation nicht besonders
> anschaulich.
> Ebenso wie das Abarbeiten einer Zeitschleife.

Ich hätte eigentlich erwartet, daß man in jedem Simulator auch 
Breakpoints setzen kann.
Man muß sich dafür dann nicht irgendwelche Hex-Werte ausdenken, sondern 
kann im Simulator sehen, wie das Setzen von Bits den Bytewert des Ports 
ändert und das auch erklären.

Vielleicht denke ich zu praktisch, aber ich würde in der Schule 
Beispiele vorziehen, die auch wirklich funktionieren können.

So ein echter MC aufm Steckbrett mit ein paar LEDs vertieft den Stoff 
meiner Meinung nach viel nachhaltiger, als das nur theoretische 
Durchklappern im Simulator.


Peter

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.