Forum: Mikrocontroller und Digitale Elektronik AT89S52 (8051) Entwicklungsboard – Programm-Upload / einfache Ein-/Ausgabe funktioniert nicht


von Daniel D. (Firma: Robotic Engineer) (daniel_dsouza)


Lesenswert?

Hallo zusammen,

ich arbeite gerade mit einem AT89S52 (8051) 
Mikrocontroller-Entwicklungsboard und habe Probleme beim Ausführen eines 
einfachen Programms. Ich beschäftige mich nach längerer Zeit wieder mit 
dem 8051, daher könnte mir etwas Grundlegendes entgangen sein.

Verwendetes Board: 
https://robocraze.com/products/smartelex-aryabhatta-8051-microcontroller-at89s52-development-board

Bisherige Versuche:

Ein einfaches LED-Blinkprogramm (Port 1 Ausgang) geschrieben

Code mit Keil kompiliert

HEX-Datei über einen externen Programmer geflasht

Stromversorgung und Taktquarz auf dem Board überprüft

Problem:

Das Programm wird erfolgreich hochgeladen, aber die Ausgänge verhalten 
sich nicht wie erwartet.

Die LED blinkt nicht, obwohl der Code sehr einfach ist.

Ich bräuchte Hilfe bei folgenden Punkten:

Häufige Fehler beim Programmieren von AT89S52/8051-Boards

Überprüfe ich Fuses, Taktgeber oder Reset-Funktionen?

Ist eine zusätzliche Initialisierung der GPIO-Ports erforderlich?

Ich möchte herausfinden, ob es sich um ein Softwareproblem oder eine 
übersehene Hardwarekonfiguration handelt.

Vielen Dank im Voraus für Ihre Hilfe.

https://www.mikrocontroller.net/articles/Spezial:Allpages

von Christian M. (christian_m280)


Lesenswert?

Das Problem ist in Zeile 42!

Gruss Chregu

von H. H. (Gast)


Lesenswert?

Daniel D. schrieb:
> Fuses

Gibts beim AT89S52 nur für den Ausleseschutz.

von Nick (b620ys)


Lesenswert?

Du wirst kaum weiterkommen, wenn Du Deinen Quälcode nicht herzeigst.

von Karl B. (gustav)


Lesenswert?

Mein Programm begann nicht bei Adresse 0 sondern 1.
So kann es auch bei Deinem sein.
00    ³00]------NOP              ³Keine Operation
01    ³75¿-STARTMOV  SCON,#50Hex³Initialisierung serielle
02    ³98³                      ³Schnittstelle Datenein-/ausgabe
03    ³50Ù                      ³Mode 1,(8 Bit, Receive Enable)
04    ³75¿------MOV  TMOD,#10Hex³Timer 0 keine Funktion,
05    ³89³                      ³Timer 1 Mode 2 C/T=0, Gate=0
06    ³20Ù                      ³
07    ³75¿------MOV  PCON,#00Hex³SMOD=0, Teiler /2
08    ³87³                      ³
09    ³00Ù                      ³

ciao
gustav

von Mario M. (thelonging)


Lesenswert?

Karl B. schrieb:
> 00    ³00]------NOP              ³Keine Operation
> 01    ³75¿-STARTMOV  SCON,#50Hex³Initialisierung serielle
> 02    ³98³                      ³Schnittstelle Datenein-/ausgabe
> 03    ³50Ù                      ³Mode 1,(8 Bit, Receive Enable)
> 04    ³75¿------MOV  TMOD,#10Hex³Timer 0 keine Funktion,
> 05    ³89³                      ³Timer 1 Mode 2 C/T=0, Gate=0
> 06    ³20Ù                      ³
> 07    ³75¿------MOV  PCON,#00Hex³SMOD=0, Teiler /2
> 08    ³87³                      ³
> 09    ³00Ù                      ³
Dann lieber einen Screenshot. 🙈

von Thilo L. (bc107)


Lesenswert?

Karl B. schrieb:
> Mein Programm begann nicht bei Adresse 0 sondern 1.
> So kann es auch bei Deinem sein.
> 00    ³00]------NOP              ³Keine Operation

Hmmm... ich sehe hier ein Programm, welches sehr wohl ab Adresse 0 
startet, halt nur mit einem NOP als erstem Befehl. Aber ich kann mir 
beim besten Willen nicht vorstellen, dass ein NOP hier ein Problem 
machen sollte.

von Karl B. (gustav)


Angehängte Dateien:

Lesenswert?

Thilo L. schrieb:
> dass ein NOP hier ein Problem
> machen sollte.

...ist bewusst dort eingefügt worden.
Vielleicht ein Denkanstoß für den TO.
Echoprogramm auf EPROM als serielle Schnittstelle:

Das Programm war für eine 8051 gedacht, der noch nach einem Eprom 
verlangte.
Selbiges Programm ist dann auf ebendem Eprom.

Sein Controller ist da schon komfortabler. Hat aber eventuell auch 
"timing"-Probleme, die sich durch Einfügen von "NOP" an der richtigen 
Stelle beheben lassen.

ciao
gustav

: Bearbeitet durch User
von Andreas (andreas6)


Lesenswert?

Befasse Dich bitte mit der Dokumentation des benutzten Controllers. Kein 
Programm fängt bei Null an, denn dort liegen dicht an dicht die 
Interrupteinsprünge, welche hardwaremäßig angelegt sind. Allein auf Null 
gehört ein Sprung an Deinen Programmanfang, der gern oberhalb 0x30 
liegen darf.

MfG. Andreas

von Karl B. (gustav)


Lesenswert?

Daniel D. schrieb:
> Ein einfaches LED-Blinkprogramm (Port 1 Ausgang) geschrieben
>
> Code mit Keil kompiliert

Und Geheimwissenschaft, dass er es hier nicht als Code präsentiert?
Evtl. kleine Unsauberkeiten drin, die übersehen worden sind.

ciao
gustav

von Harald K. (kirnbichler)


Lesenswert?

Andreas schrieb:
> Kein Programm fängt bei Null an, denn dort liegen dicht an dicht die
> Interrupteinsprünge, welche hardwaremäßig angelegt sind.

Beim 8051 und vielen anderen Architekturen, aber nicht bei allen.

Andere Architekturen haben die Interruptvektoren am oberen Ende des 
Adressraums angeordnet ... so z.B. der Klassiker 6502 ...

(Bei dem ist es allerdings trotzdem unüblich, Programme bei 0 beginnen 
zu lassen, aber das hat einen komplett anderen Grund. Möglich ist es 
jedenfalls)

von Jobst M. (jobstens-de)


Angehängte Dateien:

Lesenswert?

Wenn man keinen der IRQs nutzen möchte, kann man natürlich auch direkt 
bei Adresse 0 anfangen. Habe ich schon mehrfach so gemacht. (Wie auch 
beim angehängten file)

Der AT89S52 hat übrigens (wie alle Standard 8051er) keine 
Push-Pull-Ausgänge, sondern nur Open-Drain, an den Ports 1,2 und 3 mit 
Pullup die max. 50µA liefern können, Port 0 ist offen - liefert also gar 
keinen Strom bei H.
Gegen GND können sie auf L geschaltet etwas mehr:
max. 10mA per Portpin
Summe Port 0 max. 26mA
Summe der restlichen Ports jeweils max. 15mA
(Also insgesamt max. 71mA)
Du kannst also LEDs direkt mit max. 1,875mA am AT89S52 an allen Pins 
betreiben.

D.h. auch, dass Du den Vorwiderstand der LED korrekt berechnen musst.
Ansonsten geht mit 2.2kΩ nichts schief. Die LED hängt dann natürlich an 
5V.

Schickst Du mehr Strom in einen Pin der auf L ist, flüchtet der FET in 
den Transistorhimmel und der Pin ist nur noch als Eingang zu gebrauchen.

Wenn Du mehr Strom für Deine LEDs benötigst, musst Du einen Treiber 
(Transistor, FET, Gatter, ...) anschließen.

Anbei noch ein HEX-file, welches ein Lauflicht an Port 1 erzeugt.
Mit 18MHz sind das jeweils 100ms Periodendauer.

Gruß
Jobst

: Bearbeitet durch User
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.