www.mikrocontroller.net

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


Autor: Björn B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Schnellschuss aus der Hüfte: 'volatile' vergessen.

Autor: T. Stütz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Björn B. (Gast)
Datum:
Angehängte Dateien:

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

Autor: T. Stütz (Gast)
Datum:

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

Gruss

Autor: Max Murks (Gast)
Datum:

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

Autor: Henry Brennig (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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... ;)

Autor: Henry Brennig (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: T.Stütz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Henry Brennig (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Henry Brennig (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: T.Stütz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Henry Brennig (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.