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
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
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.
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
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
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
.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:
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
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
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
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