Forum: Mikrocontroller und Digitale Elektronik anderen PIC gewählt


von Siegfried S. (dieleena)


Lesenswert?

Hallo,
Habe mein Projekt ursprünglich mit einem 18F4550 angelegt.
Die USB Zeilen wurden noch nicht geschrieben.
Da jetzt eine Erweiterung erfolgt soll das Projekt mit einem 18F4680 
erfolgen.
Die Umstellung ist auch erfolgreich erledigt.
Habe aber ein Problem.

In der *.c habe ich eine Variable deklariert
unsigned int ServiceCount_1;

dies ist meine Zeilen

void InitSpiService(void)
{
for (ServiceCount_1 = 0; ServiceCount_1 < 100);ServiceCount_1 ++)
{
SpiServiceIn[ServiceCount_1] = 0x00;
}

ServiceCount_1 ist als "Restricted Memory" an Adresse 0DAC angelegt

Das Programm hängt sich in der for Schleife auf!!

Was muß ich noch ändern?

Gruß Siegfried

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> for (ServiceCount_1 = 0; ServiceCount_1 < 100);ServiceCount_1 ++)
Mal abgesehen von der Klammer hier   ----------^
sieht das eigentlich ok aus.

Aaaaaber: fehlt in dem Code nicht noch was?
Wie groß ist das Array SpiServiceIn[]?

von Siegfried S. (dieleena)


Lesenswert?

Hallo,
"ServiceCount_1 < 100);" Klammer hier im Forum ist ein Schreibfehler.
"Array SpiServiceIn[]?" ist entsprechend groß.
Der Fehler taucht über das gesamte Projekt auf. Hat nichts mit einem 
Array zu tun.
Was soll dieses ""Restricted Memory"" sein ?
in den File Register wird ein interger, wenn er in einer *.h steht so 
wieder gegeben.
Adress Hex   Dezimal Symbol
200    0x01  1       xyz

wenn der interger im Kopf einer *.c steht
Adress Hex   Dezimal Symbol
220    --    --      bvf

Gruß Siegfried

von Dieter W. (dds5)


Lesenswert?

Die Adresse 0DAC ist im Bereich der CAN-SFR reserviert, enthält aber 
keine Speicherzelle (Datenblatt, RAM-Belegung).

Jetzt wäre es wohl nötig, herauszufinden wer dem Compiler ausgerechnet 
diese Adresse vorschreibt.

von Peter D. (peda)


Lesenswert?

Siegfried Saueressig wrote:
> Was soll dieses ""Restricted Memory"" sein ?

Wenn Du nicht weißt, was das bedeutet, warum verwendest Du es dann.
Ein standard C-Statement ist das jedenfalls nicht.

Wenn man Variablen an feste Adressen bindet, dann nur, wenn es wirklich 
nicht anders geht und wenn man auch ganz genau weiß, was man tut.

Es ist nämlich ein schwerer Eingriff in die Hoheit des Compilers, der 
möchte lieber alles selber verwalten (und kann das auch viel besser).


Peter

von Timmo H. (masterfx)


Lesenswert?

>;ServiceCount_1 ++)
Also ich würde einfach mal das Leerzeichen zwischen Variable und ++ 
wegmachen

von Siegfried S. (dieleena)


Lesenswert?

Hallo schönen Abend,
Ber Begriff "Restricted Memory" kannte ich nicht. Auch nichts im Buch 
K&R zu finden, oder ich habe es übersehen. "Restricted Memory" würde ich 
als reservierter Speicher bezeichnen.

In den Bereichen
"Wenn man Variablen an feste Adressen bindet, dann nur, wenn es wirklich
nicht anders geht und wenn man auch ganz genau weiß, was man tut.

Es ist nämlich ein schwerer Eingriff in die Hoheit des Compilers, der
möchte lieber alles selber verwalten (und kann das auch viel besser).
"
möchte ich es zu Zeit lieber dem Compilers überlassen.

Das ganze hat mich aufs Eis gezogen.

Diese Zeilen beziehen sich auf einen 18F4680
Es findet nur statt, wenn die Variable in der *.c sich befindet.
Verlagere ich sie in eine *.h mit einschließlich mit include der *.h in 
der *.c , funktioniert es.
Beim 18F4550 funktioniert es so wie ursprünglich angelegt wurde. 
"Variable in der *.c"

Werde aber trotzdem dem Problem nachgehen.

Kann doch nicht sein, das der Compiler mit einem gleichem Quellcode für 
ein 18F4550 anderst verhält als bei einem 18F4680

Gruß Siegfried

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.