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
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; } }
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.