Hallo Leute! Programmiere gerade einen AT89C51RC2 mit Keil. Beim Debuggen ist mir aufgefallen, dass die globalen Variablen, die ich schon vordefiniert habe, nicht immer richtig initialisiert werden. Liegen die Variablen am Anfang des XDATA Bereichs, dann funktioniert die Initialisierung. Liegen sie weiter hinten, so stehen irgendwelche falschen Werte drin. Habe aus dem Programmcode alle Schleifen etc. auskommentiert, damit ich sichergehen kann, dass der Fehler nicht von meinem Programm kommt. Der XDATA Bereich ist auch bei weitem nicht voll und den XBPSTACK habe ich auch deaktiviert, da ich keine reentrant funktionen benötige. Woher kann dieser Fehler kommen? Kann da was am STARTUP.A1 oder am INIT.A51 file faul sein? Vielleicht kann mir ja jemand einen Tip geben? mfg Josef
Wie sieht denn das mit der Definition der RAM-Größe aus? Ich meine die Datei START.A51.
Habe die XRAM Größe am Beginn meines C Programms auf 1024 Byte gestellt, also mittels Befehl: AUXR = AUXR | 0xC0; und das scheint irgendwie den Fehler auszulösen. mfg Josef
Hast du in der Datei START.A51 in der Sektion "Power-On Initialization of Memory" die Startadresse sowie die Größe des Xdata Bereichs korrekt eingestellt? Denn nur diese Einstellung führt dazu, dass zu Beginn des Programms der Bereich vollständig mit 0x00 Initialisiert wird. Andernfalls hast du nach dem Einschalten zufällige Werte drin. Ohne diese Initialisierung musst du eben nur sichergehen, dass du deine Variablen vor der ersten Verwendung immer vorbelegt hast. Ciao, Rainer
Ja, das Verändern der Konstante XDATALEN habe ich auch schon probiert, das hat aber keine Besserung gebracht, jetzt habe ich direkt im Assembler die XRAM Größe eingegeben MOV 0x8E,#0x0C So scheint es zu funktionieren, aber das sollte eigentlich doch auch irgendwie funktionieren, ohne dass man direkt in den Assembler Code eingreift, oder? mfg Josef
Josef schrieb: > Habe die XRAM Größe am Beginn meines C Programms auf 1024 Byte gestellt, > also mittels Befehl: > > AUXR = AUXR | 0xC0; > > und das scheint irgendwie den Fehler auszulösen. Also falls das kein Schreibfehler war, dann funktioniert es so nicht. Es muss 0x0C lauten, wie bei deiner Assembler Variante. Wenn du wirklich 0xC0 reinschreibst ist das Verhalten undefiniert, da du ein reserviertes Bit setzen würdest. Ciao, Rainer
> So scheint es zu funktionieren, aber das sollte eigentlich doch auch > irgendwie funktionieren, ohne dass man direkt in den Assembler Code > eingreift, oder? Öffne die Startup.a51 im Editor. Unterhalb des Fensters sollte "config wizard" o.ä. stehen. DA STELLT MAN DANN DIE SACHEN EIN :) Ralf
sorry, du hast natürlich recht: der wert war 0x0c hab das auf die schnelle verwechselt ... mfg josef
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.