Forum: Mikrocontroller und Digitale Elektronik rechnen mit globalen Variablen beim c167 controller


von Björn B. (Gast)


Lesenswert?

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...

von Karl H. (kbuchegg)


Lesenswert?

Zeig mal ein vollständiges Program das 'nicht läuft'.

von Karl H. (kbuchegg)


Lesenswert?

Ein Schnellschuss aus der Hüfte: 'volatile' vergessen.

von T. Stütz (Gast)


Lesenswert?

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

von Björn B. (Gast)


Angehängte Dateien:

Lesenswert?

hier mal das programm. es geht eigentlich nur darum Port2 mit hilfe des
timeroverflow_interrupts ein und aus zu schalten.

von T. Stütz (Gast)


Lesenswert?

Was auch noch sein kann ist, das du Programmdaten zund
interruptvektortabelle überlagerst
=> *.M66 anschauen!!

Gruss

von Max Murks (Gast)


Lesenswert?

Dein Compiler hat wohl das meiste rausoptimiert, will sagen die Variable
a gibt es gar nicht! Verwende volatile!

von Henry Brennig (Gast)


Angehängte Dateien:

Lesenswert?

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... ;)

von Henry Brennig (Gast)


Lesenswert?

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.

von T.Stütz (Gast)


Lesenswert?

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

von Henry Brennig (Gast)


Lesenswert?

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.

von Henry Brennig (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

@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

von T.Stütz (Gast)


Lesenswert?

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

von Henry Brennig (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.