Forum: Mikrocontroller und Digitale Elektronik PIC16F690 Array als LONG deklarieren


von aerodactyl (Gast)


Lesenswert?

Moin zusammen,

ich bin mal wieder ein wenig mit meinem PIC 16F690 am experimentieren 
und bekomme eine Sache nicht hin. CCS C-Compiler, PCM 5.027

Ich habe ein DatenARRAY mit 128 Zellen als Konstante im Programm 
hinterlegt.
1
const char array [] = {1,2,3,4,5, usw};

Im Programm greife ich darauf zu und rechne mit diesem Wert. Alle 
Variablen in der Rechnung sind vom Typ LONG und es wird kein Wert über 
30000 erreicht.

Alles Funktioniert so weit.

Nun wollte ich Werte im ARRAY > 255 pro Zelle hinterlegen und habe das 
ARRAY als LONG deklariert und nicht als CHAR.

Es funktioniert nicht. Sobald ich einer Variablen vom Typ LONG den Wert 
aus dem ARRAY zuweise, z.B. 311, dann bekomme ich als Wert der Variablen 
55 angezeigt, also 311 - 256:

Wo liegt der Fehler? kann man als CONST keine LONG im ARRAY ablegen oder 
was mache ich falsch?

Gruß

Uwe

von Hias (Gast)


Lesenswert?

aerodactyl schrieb:
> Es funktioniert nicht. Sobald ich einer Variablen vom Typ LONG den Wert
> aus dem ARRAY zuweise, z.B. 311, dann bekomme ich als Wert der Variablen
> 55 angezeigt, also 311 - 256:
Mich wundert schon, dass sich eine const Variable überhaupt zuweisen 
lässt.

von Falk B. (falk)


Lesenswert?

@ aerodactyl (Gast)

>Ich habe ein DatenARRAY mit 128 Zellen

Elementen.

>als Konstante im Programm hinterlegt.

>const char array [] = {1,2,3,4,5, usw};

>Im Programm greife ich darauf zu und rechne mit diesem Wert. Alle
>Variablen in der Rechnung sind vom Typ LONG und es wird kein Wert über
>30000 erreicht.

Warum dann long? long sind auf fast allen Compilern 32 bit. Ein int 
würde reichen, der hat hier 16 Bit.

>Nun wollte ich Werte im ARRAY > 255 pro Zelle hinterlegen und habe das
>ARRAY als LONG deklariert und nicht als CHAR.

int reicht, ggf. aogar unsigned int.

>Es funktioniert nicht. Sobald ich einer Variablen vom Typ LONG den Wert
>aus dem ARRAY zuweise, z.B. 311, dann bekomme ich als Wert der Variablen
>55 angezeigt, also 311 - 256:

>Wo liegt der Fehler?

An deiner Rechnung. Wahrscheinlich gibt es dort ein Problem.

>kann man als CONST keine LONG im ARRAY ablegen oder
>was mache ich falsch?

Du zeigst uns nicht deinen Quelltext.

von aerodactyl (Gast)


Lesenswert?

Bitte seid gnädig, dass ich die Elemente als Zellen beschrieben habe.

Im CCS PCM sind int Variablen 8 bit breit, long Variablen 16 Bit. Ist 
so.
int16 = long = 16 Bit.

Rechnen brauchst du nicht. Wenn ich
1
test = ARRAY [27];
 zuweise und ich statt der 311, die im ARRAY steht 55 in test stehen 
habe, ist noch nichts gerechnet worden.

Also kann es nicht an der nachfolgenden Rechnung liegen.

Gruß

Uwe

von Max H. (hartl192)


Lesenswert?

aerodactyl schrieb:
> test = ARRAY [27];
Ist ARRAY gleich array aus dem Eröffnungspost? was verbirgt sich hinter 
'test'?

Rück besser den ganzen Code raus als alles nur scheibchenweise.

: Bearbeitet durch User
von aerodactyl (Gast)


Lesenswert?

Hallo Max,

du hast recht ARRAY ist der Name des Arrays und test ist nur eine 16 Bit 
variable vom Typ LONG der dem selektierten Element des Arrays zugewiesen 
wird.

Werte <= 255 werden einwandfrei 1:1 zugewiesen. Werte > 255 nicht.


Gruß

Uwe

von Max H. (hartl192)


Lesenswert?

aerodactyl schrieb:
> Werte <= 255 werden einwandfrei 1:1 zugewiesen. Werte > 255 nicht.
Wie hast du das überprüft?

P.S: Wenn jetzt nicht bald dein Quellcode kommt bin ich raus...

: Bearbeitet durch User
von aerodactyl (Gast)


Lesenswert?

Lieber Max,

ich bin sicher nicht der Oberschlauberger, sonst würde ich nicht diese 
Frage stellen. Aber wie ich den Wert einer Variablen überprüfen kann, 
weiß ich schon. In meinem schlaues MPLAB kann ich bei einem "mouse-over" 
über einer Variablen deren Wert anzeigen lassen und im Watch-Window 
ebenfalls.

Salut

Uwe

von Karl H. (kbuchegg)


Lesenswert?

aerodactyl schrieb:
> Lieber Max,
>
> ich bin sicher nicht der Oberschlauberger, sonst würde ich nicht diese
> Frage stellen. Aber wie ich den Wert einer Variablen überprüfen kann,
> weiß ich schon.

Schön für dich.
In 60 von 100 Fällen liegt der Fehler nämlich nicht in der 
Variablendefinition oder sonstwo, sondern genau in der Anzeigefunktion, 
die den Wert ausgeben soll. Die Variable wurde auf einen höheren 
Datentyp geändert und auf die Anzeigefunktion wurde vergessen. Die gibt 
dann nach wie vor einen 8-Bit int aus.

Daher die Nachfrage.

Im übrigen ist an dem was du gezeigt hast, nichts falsch.
Wenn es also ein reales Problem gibt, dann in dem Teil den du nicht 
gezeigt hast.

> In meinem schlaues MPLAB kann ich bei einem "mouse-over"
> über einer Variablen deren Wert anzeigen lassen und im Watch-Window
> ebenfalls.

Es soll auch schon Debugger gegeben haben, die Probleme hatten.

: Bearbeitet durch User
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.