www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Simulation einer Ampel


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Muss beim 8051 kein Stackpointer initialisiert werden?

MfG Spess

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Stefan schrieb:
        MOV P1,#51h     ; = 0101 0001  --> es wird eine stramme '0' auf P1.5 ausgegeben
        LCALL eingabe
:
eingabe:
        MOV A,P1         ; wenn da jetzt eine '1' reinkommen soll... :-o
        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:

Autor: Stefan (Gast)
Datum:

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

Autor: MaWin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich kenn 8051 Assembler ganz anders:

$include (reg51.INC)
CSEG at 0100h

aber vielleicht ist deiner einfach anders.

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das

Stefan schrieb:
> code at 0

vs

MaWin schrieb:
> CSEG at 0100h

sieht auf jeden Fall verdächtig aus

Autor: Martin (Gast)
Datum:

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

Ein Screenshot könnte helfen.

Autor: Stefan (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
also die fehlermeldung kommt nciht mehr aber das programm funkt noch 
nciht richtig

wenn ich auf den taster drücke passiert nichts

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jobst M. (jobstens-de)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan schrieb:
include reg51.inc

code at 0

MOV R0,#90h      ;Adr.von Port-1
Wozu? Die letzte Zeile ist unnötig.
;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
MaSkieren?
       CJNE A,#20h,eingabe
       MOV P1,#11h     ; Ruf-Speicher löschen

     RET

     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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jobst M. (jobstens-de)
Datum:

Bewertung
0 lesenswert
nicht 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!

include reg51.inc   ;benötigst Du, damit der Kompiler z.B. weiß, welchen SFR-Namen er welcher Adresse zuordnen muss.

code at 0   ;Bedeutet, daß Dein Code bei Adresse 0x0000 beginnt.


MOV R0,#90h      ;Adr.von Port-1
;Wozu benötigst Du in Register 0 die Adresse von Port 1?
;Du rufst Register 0 ja nie wieder ab!
;Zumal Du statt #90h auch P1 schreiben kannst. (Was Du unten ja auch tust)


;Hauptprogramm

schleife:
         MOV P1,#51h        ; hier gibst Du ein Muster für die Ampel vor
         LCALL eingabe      ; hier springst Du nach unten. Die Adresse HIER wird auf den Stack geschoben (2 Byte)
         MOV P1,#52h        ; Weitere Muster in Abfolge
         MOV P1,#54h        ; (Ampel wird rot, Fussgänger bekommen grün
         MOV P1,#5Ch        ; ... und zurück)
         MOV P1,#54h
         MOV P1,#56h
        LJMP schleife       ; wieder oben anfangen



        ;Unterprogramm für Ruftaste eingabe;

       eingabe:
       MOV A,P1             ; P1 abfragen.
       ANL A,#20h           ; Taste maskieren (ist immer 0, weil P1.5 in Deinen Mustern schon auf Masse liegt)
       CJNE A,#20h,eingabe  ; Wenn P1.5 nicht gesetzt ist, dann zu eingabe springen (also immer!)
       MOV P1,#11h          ; Ruf-Speicher löschen
; 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.

     RET                    ; Auf dem Stack abgelegte Adresse zurück holen und dort weiter machen.

     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:
include reg51.inc

code at 0

;MOV R0,#90h      ;Adr.von Port-1 (unnötig)

MOV SP, #40h      ; Stackpointer mitten in die 128Byte Ram

;Hauptprogramm

...




Mein Vorschlag für dieses Problem:
include reg51.inc
code at 0


schleife:
         MOV P1,#F1h ; Auto grün
eingabe: JB P1.5, eingabe  ; auf den Knopf (gegen Masse) warten
         MOV P1,#F2h ; Auto gelb
         MOV P1,#F4h ; Auto rot
         MOV P1,#FCh ; Auto rot + Fussgänger grün (P1.3 = 1)
         MOV P1,#F4h ; Auto rot + Fussgänger rot (P1.3 = 0)
         MOV P1,#F6h ; Auto rot+gelb
        LJMP schleife


     end

... sollte exakt das selbe bewirken



Gruß

Jobst

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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:
rot     equ     p1.0    ; symbole definieren
gelb    equ     p1.1
gruen   equ     p1.2

        setb    rot     ; rot aus (low active)
        clr     gelb    ; gelb an
        call    pause
        setb    gelb    ; gelb aus
        clr     gruen   ; gruen an
        call    pause
                        ; usw.
pause:
                        ; hier wartezeit einfügen
        ret


Peter

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jasper (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jobst M. (jobstens-de)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.