hab ne frage, wie bekomme ich es hin beim c167 Controller mit globalen variablen rechenoperationen auszuführen (ganz egal zb. int a; a++;) in der simulation funktioniert es, nur auf dem controller nicht. mit lokalen variablen läuft es auch auf dem Controller...
Zeig mal ein vollständiges Program das 'nicht läuft'.
Ein Schnellschuss aus der Hüfte: 'volatile' vergessen.
Vermutlich hast du ein RAM am CS1/ angeschloßen ? Ich vermute stark das du das zugehörige BUSCON1 und ADRSEL1 nicht korrekt vorbelegt hast => Zugriffe werden auf CS0/ gemacht => fehlerhafte+falsche Werte (ist eigentlich dein Maschinencode) lokale Daten werden meist in Register oder auf dem Stack gelegt deswegen funktioniert das. Versuch mal die globale Variable als "sdata" zu deklarieren. Gruss
hier mal das programm. es geht eigentlich nur darum Port2 mit hilfe des timeroverflow_interrupts ein und aus zu schalten.
Was auch noch sein kann ist, das du Programmdaten zund interruptvektortabelle überlagerst => *.M66 anschauen!! Gruss
Dein Compiler hat wohl das meiste rausoptimiert, will sagen die Variable a gibt es gar nicht! Verwende volatile!
Hi Community! Ein ähnliches (wenn nicht gar das gleiche) Problem habe ich auch. Eine global deklarierte und in der main() definierte Varibale ist in einer Interrupt Service Routine nicht mit dem korrekten Wert sichtbar. Der anhängende Beispielcode soll eine LED mittels Timer0-Interrupt an Port-Pin 2.0 blinken lassen. Ich kann mir leider nicht erklären, warum er dies nicht tut. Hat jemand eine Erklärung dafür? Das würde mir wirklich sehr weiterhelfen. Vielen Dank schonmal! PS: Die LED ist elektrisch korrekt angeschlossen... ;)
Ach ja, noch etwas: Nutze ich statt der Variable flag die variable led in der if-Bedingung, dann funktioniert es einwandfrei. Ich benötige aber (für eine andere Anwendung) unbedingt eine globale Variable wie flag um einen Zustand abzufragen.
Gleiches Problem wie oben schon beschrieben, Das RAM ist ja sicher an CS1/ angeschloßen. Dann muß auch die zugehörige Konfiguration in "start167.a66" rein (und zum projekt hinzugefügt werden) ADRSEL1/BUSCON1 richtig vorbelegen beim Linken den richtigen Adressbereich angeben für RAM dann klappt es auch mit globalen Daten. Gruss
Ich nutze ein miniMODUL von Phytec, auf dem ein C167CR-LM werkelt. Leider weiß ich nicht genau, wie die externen RAMs an den uC angeschlossen sind, aber an sich nutze ich doch sowieso bloß den internen RAM des Controllers... Ich meine... dieses winzige Schnipsel Code sollte doch auch auf Controllern ohne externem RAM laufen, oder? Werd aber mal schauen was ich zum extrenen RAM so herausfinde.
Hm... Ich muss zugeben dass ich keine Ahnung von den Start-up Code-, Compiler- und Linker-Einstellungen habe. Das Ganze scheint mir auch recht komplex zu sein. Aber eins hab ich herausgefunden (puh... war das ein Gefiddel...!) Scheinbar hat es etwas mit den speziellen Memory Types des C167 zu tun und wo die Variablen gespeichert werden. Wenn ich in µVision ein neues Projekt anlege, den angebotenen Start-up Code annehme und die globale Variable wie folgt deklariere: int idata flag; dann funktioniert der Code so wie er soll. flag wird nun wohl im On-chip RAM abgelegt. Keine Ahnung warum es mit den anderen Types wie near, sdata, huge usw nicht funktioniert bzw. welchen Typ der Compiler benutzt und wo er flag ablegt wenn ich keins dieser Schlüsselworte angebe. Außerdem bekomme ich folgende Warnung: *** WARNING L22: CLASS RANGE NOT GIVEN IN INVOCATION LINE CLASS: NCODE Vielleicht hat jemand von euch eine Idee, was sie bedeutet und wie ich sie beseitige? Jedenfalls nehme ich das jetzt erstmal so hin, denn ich bin verdammt froh, dass es auf diese Weise scheinbar funktioniert.
@Henry "Leider weiß ich nicht genau, wie die externen RAMs an den uC angeschlossen sind, aber an sich nutze ich doch sowieso bloß den internen RAM des Controllers" Dann wird es aber höchste Zeit, sich endlich mal das Manual zu dem Board reinzuziehen ! Und außerdem das Manual des Compilers und des Linkers. In der Regel gibt es nämlich verschiedene Compilermodelle, mit denen man einstellt, ob man internen oder externen SRAM verwendet. Und dann muß man noch dem Linker sagen, ab welcher Adresse und wieviel externer SRAM angeschlossen ist. Eventuell muß auch der Startup-Code angepaßt werden, wenn man den externen SRAM nach dem Reset enabled und vorinitialisiert haben will. Der Compiler kann schließlich nicht hellsehen, wie Dein Board verschaltet ist. Peter
Zur Warning: in den Linkereinstellungen fehlt die angabe WO der Near Code (NCODE) im Adressraum liegt. Wenn du die Standarteinstellungen übernommen hast so ist dein RAM per CS1 angeschloßen. Im Startup-Code wird dem C165 eine Konfiguration verpaßt. Lies dir das Datenblatt zum C165 mal von Anfang bis Ende durch (Ich WEISS das ist ein riesiger Schmöcker) aber da steht genau drin was mann alles machen kann. zu deiner "verwirrung" der Datentypen betreffend: - lokale Variablen (innerhalb einer Funktion defniert) werden wenn möglich in Register oder auf dem Stack erzeugt - sdata,idata,register werden webenfalls im interenn RAM des C165 gespeichert => es wird kein externes RAM dafür benötigt, schneller Zugriff - huge,near,far Variablen müßen im EXTERNEN RAM liegen welches meist an CS1 angeschloßen ist. => dafür muß der Linker/Prozessor wisssen wann er CS1 schalten soll dies wird per BUSCON1/ADRSEL1 mitgeteilt der Prozessor arbeitet Memory-Mapped, das heißt die Peripherie ist einem Speicherbereich zugeordnet. Wenn es noch Fragen gibt melde dich einfach nochmal Gruss
Vielen Dank Euch erstmal für die Antworten! Da werde ich wohl um eine genauere Durchforstung des Datasheets nich drum herum kommen... ächz Grüsse!
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.