Forum: Compiler & IDEs Komisches Verhalten


von Dirk (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

Ich trau mich nu mal und setzte mein Programm hier herein.

Ich programmier noch nicht so lange und hab nun mein erstes größeres
Projekt in Angriff genommen.
Kurze Beschreibung:
Im Hauptprogramm wird die Funktion Konfiguration aufgerufen.
Hier wird entschieden ob Einstellungsdaten aus dem eeprom geladen
werden (muß noch programmiert werden) oder ob das Gerät neu eingestellt
wird.
Wenn zweiteres der Fall ist werden nacheinander die Menüs Luftdruck,
Alarmgrenzen und Setpoint aufgerufen.
Als letzte wird das Menü bzw. Unterprogramm Sensor_kallibrieren
aufgeufen. Ist noch nicht ganz fertig, weil ich eben hier nicht mehr
weiterkomme.
In der Version oben, maht das Programm das was es soll.
Füge ich aber die Zeile 482 wieder ein kommt nur noch Unsinn raus.
Für die AD Wandler Werte werden dann so Sachen wie H322 oder
irgendwelche sonderzeichen ausgegeben.
In den anderen Unterprogrammen kan man weder den Setpoint noch die
Alarmgrenzen einstellen. Einzelen Programmteile werden sogar
schlichtweg unterschlagen. Einzig die Funktion Luft_druck scheint dem
Chaos zu trotzen.

Ich hab WinAVR04042004 und Ponyprog. Dazu die Platine der
Mikrokonrollergruppe und einen AT90S8535.

Woran kann es liegen, daß durch Einfügen dieser einzelnen Zeile so ein
Chaos entsteht.
Ich komme halt so nicht weiter. Mit jeder Veränderung, gerade in den
put_string Anweisungen ist irgendwie neues Chaos vorprogrammiert.


Danke Dirk

von Malte Marwedel (Gast)


Lesenswert?

Mir scheint es so, als ob die ganzen Texte, die auf dem LCD ausgegeben
werden sollen im RAM liegen. Das geht so lange gut, bis die 512 Byte
voll sind. Versuche immer nur den gerade benötigten String aus dem
Flash oder EEProm in den RAM zu kopieren.
Hir läuft gerade ein Thread der zeigt, wie man Strings im Flash lässt:
http://www.mikrocontroller.net/forum/read-2-94515.html

Ich würde übrigens versuchen lcd_putnumber3 und lcd_puntnumber4
zusammenzufügen. Vielleicht hilft dir auf folgende Funktion dabei ein
wenig weiter:

void wordtostr(u32 nummer, u08 digits, u08 strposition) {
while (digits > 0) {
digits--;
rs232rausstring[strposition+digits] = nummer%10+48;
nummer = nummer / 10;
}
}

von Dirk (Gast)


Lesenswert?

Hallo Malte

Vielen Dank. Sowas hatte ich schon fast geahnt.
Hab aber keine Ahnung wie ich sowas ändern kann.
Habs wie beschrieben geändert. Programm läuft jetzt tadellos.

Ich hab festgestellt, daß die Probleme immer bei Überschreitung von 480
Byte im RAM auftreten. Das  wird ja beim compilieren unter data
ausgegeben. Bis 512 fehlen da aber noch 32 Byte. Was passier mit den
restlichen 32 Byte? Oder sind die noch irgendwo anders versteckt?

Noch ne Frage (will ja mal schlau werden):
Was, und warum schreibt der Compiler denn überhaupt ins RAM?
Dann könnte ich das nächste Mal solche Fehler umgehen.

Danke
Dirk

von Malte Marwedel (Gast)


Lesenswert?

Der Compiler schreibt alle Variablen in den RAM, sofern sie nicht in den
Registern gehalten werden können. Hinzu kommen nur die
Rücksprungadressen von Unterprogrammen und eventuell eine Sicherung der
Register (pus, pop Befehle in Assembler) - falls diese gerade
anderweitig benötigt werden (z.B. für einen Interrupt). Dies könnte
ziemlich gut die 32 Byte RAM belegen, wieviel genau ist aber nicht
immer vorhersehbar.

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.