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
Das Problem ist in Zeile 42! Gruss Chregu
Du wirst kaum weiterkommen, wenn Du Deinen Quälcode nicht herzeigst.
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
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. 🙈
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.
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
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
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
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)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.