Forum: Mikrocontroller und Digitale Elektronik Seltsames Verhalten eines AT89S51


von Ralph H. (Firma: KFP) (hempfer)


Lesenswert?

Ja, ich habe mal an den Anfängen gerührt und einen alten (aber neuen) 
AT89S51 zum Leben erwecken versucht. Der Erfolg leider mäßig. Inzwischen 
ist die Experimentierschaltung soweit reduziert:

-  Spannungsversorgung
-  ISP – Connector
-  8 x LED + Vorwiderstand (zu +5V) an Port 2.0 bis 2.7
-  8 x Pull-Up-Widerstand (10KOhm) an Port 0.0 bis 0.7
-  8 x Dil - Schalter gegen Masse ebenfalls an Port 0.0 bis 0.7
-  und natürlich der Quarz (12 MHz) mit den beiden Kondensatoren
-  /EA liegt an „H“ (+5V)

Versuche ich nun ein einfaches Programm zu laden und auszuführen, zB. 
eines, das ein Bitmuster an Port 2 ausgibt dann funktioniert das nur, 
wenn Port 0.6 (exklusiv)ODER Port 0.5 auf „L“ – Pegel gesetzt werden. 
Tue ich das nicht flackern die LEDs nach einem nicht zu ergründenden 
Muster recht schnell.

Mini – „Programm“:

  org 00h
  ajmp 100h

  org 100h

  mov p0,#0FFH
  mov p1,#0FFH
  mov p2,#0FFH
  mov p3,#0FFH

  mov p2,#0FCH
END

Zum editieren (Assembler) verwende ich µVision2 und zum Übertragen die 
ISP – Software von Atmel + den zugehörigen Adapter (Parallelport).

Ich vermute, dass ich beim Initialisieren der Ports einen Fehler mache, 
weiß aber nicht welchen.

Vielleicht kann mir ein erfahrener User hier behilflich sein?

LG und vielen Dank

hempfer

von nur mal so (Gast)


Lesenswert?

Was macht dein Programm nach dem END?

Lass ihn auf der Stelle treten -> Endlosschleife!

von Ralph H. (Firma: KFP) (hempfer)


Lesenswert?

Vielen Dank an "nur mal so"!

- Das hätte ich nicht gedacht!
Tatsächlich war das die Ursache.
Am Ende einen Sprung nach 100h eingebaut und es läuft so wie erwartet.

Machen die Prozessoren, wenn man sie ohne weitere Aufgabe lässt, was sie 
wollen?

Auf alle Fälle nochmals vielen Dank an den Gast!
- Wieder habe ich was dazu gelernt

Freundliche Grüße Ralph

von Ralf (Gast)


Lesenswert?

> Machen die Prozessoren, wenn man sie ohne weitere Aufgabe lässt, was sie
> wollen?
Nein, sie machen das, was im Programmspeicher steht - kleiner aber 
feiner Unterschied...

Ralf

von Ralph H. (Firma: KFP) (hempfer)


Lesenswert?

Ralf schrieb:
>> Machen die Prozessoren, wenn man sie ohne weitere Aufgabe lässt, was sie
>> wollen?
> Nein, sie machen das, was im Programmspeicher steht - kleiner aber
> feiner Unterschied...
>
> Ralf

Ja klar, nur stehen nach dem Ende des geladenen Mini - "Programm" bis 
zum Speicherende nur "FF"!
Keinerlei Anweisungen irgendetwas auf dem Port 2 auszugeben.

Ralph

von Ralf (Gast)


Lesenswert?

> Ja klar, nur stehen nach dem Ende des geladenen Mini - "Programm" bis
> zum Speicherende nur "FF"!
> Keinerlei Anweisungen irgendetwas auf dem Port 2 auszugeben.
Ja, bis zum Speicherende... und was kommt nach dem Ende? Richtig! Dein 
Programm geht wieder von vorne los ;)

Wenn ein Befehl an der letzten Speicheradresse abgearbeitet wurde, zeigt 
der Programmcounter wieder auf den Anfang des Programmspeichers, also 
0x0000.

Ralf

von Stefan (Gast)


Lesenswert?

> Wenn ein Befehl an der letzten Speicheradresse abgearbeitet wurde,
> zeigt der Programmcounter wieder auf den Anfang des Programmspeichers
> , also 0x0000.

Sicher? Oder zeigt er auf einen Speicherbereich, der gar nicht 
existiert, so dass der Prozessor zufällige Befehle vorfindet?

von Peter D. (peda)


Lesenswert?

0xFF = "MOV R7, A"
Er macht also ~65000 mal "MOV R7, A" und dann läuft Dein Programm wieder 
von vorne los.

von Ralph (Gast)


Lesenswert?

Ralf schrieb:
>> Ja klar, nur stehen nach dem Ende des geladenen Mini - "Programm" bis
>> zum Speicherende nur "FF"!
>> Keinerlei Anweisungen irgendetwas auf dem Port 2 auszugeben.
> Ja, bis zum Speicherende... und was kommt nach dem Ende? Richtig! Dein
> Programm geht wieder von vorne los ;)
>
> Wenn ein Befehl an der letzten Speicheradresse abgearbeitet wurde, zeigt
> der Programmcounter wieder auf den Anfang des Programmspeichers, also
> 0x0000.
>
> Ralf

Das würde ja bedeuten, dass ich mir den Sprung am Ende nach 100h auch 
sparen könnte. Der Effekt wäre dann der gleiche!

Das kann die Ursache doch nicht sein!?

Gruß Ralph

von Peter D. (peda)


Lesenswert?

Stefan schrieb:
> Sicher? Oder zeigt er auf einen Speicherbereich, der gar nicht
> existiert, so dass der Prozessor zufällige Befehle vorfindet?

Konkret beim AT89S51 greift er nach den internen 4kB auf den externen 
Bus zu (P0, P2).

Ralph H. schrieb:
> -  8 x Pull-Up-Widerstand (10KOhm) an Port 0.0 bis 0.7

Was dann auch als 0xFF dekodiert wird bis zur Adresse 0xFFFF.

Beim AT89S2051 ist der Adreßpointer aber nur 11Bit groß, da kommt schon 
nach der Adresse 0x07FF die 0x0000.

von Peter D. (peda)


Lesenswert?

Ralph schrieb:
> Das würde ja bedeuten, dass ich mir den Sprung am Ende nach 100h auch
> sparen könnte. Der Effekt wäre dann der gleiche!

Nö, Du hast ein Delay von ~65000 Zyklen.

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.