WinAVR: warning: assignment discards qualifiers

Gast #285170
Lesenswert?

Hallo,

ich habe hier eine Compilerwarnung:

warning: assignment discards qualifiers from pointer target type

Beispielquelltext siehe weiter unten.
1
uint8_t *motor_1;
2
-> motor_1 = &OCR0A;

Kann mir mal jemand bitte die Warnung näher erläutern? Wenn ich das
richtig verstehe ist durch die Zuweisung der Ziel-Pointer-Typ verworfen
worden. Welchen Typ müsste der Ziel-Pointer dann haben? Mit uint16_t
*motor_1 geht es auch nicht, da meckert der Compiler über inkomptible
Pointer-Typen.

Danke im Voraus,

Willi
Gast #285172
Lesenswert?

Danke für die schnelle Antwort.

Also so geht es nicht. Ich möchte das OCRxA und OCRxB Register der 3
verfügbaren Timer in Abhängigkeit von einer Variable beschreiben. D.h.
Variable == 0 dann OCR0A und OCR0B, Variable == 1 dann OCR1A und OCR1B
etc. Im Anhang hab ich einen Beispiel-Code reingestellt (der nicht
funktioniert, siehe Beitrag von The Daz), um es etwas zu verdeutlichen.
Wenn jemand eine Idee hat, wie man es lösen könnte, dann immer her
damit. Ich bin für jeden Tip dankbar.

Gruß,

Willi
Gast #285175
Lesenswert?

Ich sehe gerade, dass ich den Quelltext nicht vernüftig eingerückt habe.
Es sind zwei if-Abfragen hintereinander, im Prinzip sind es eigentlich
mehr, aber der Einfachheit halber habe ich sie weggelassen. Switch case
wird in diesem Fall nichts bringen, da die If-Abfragen auf verschiedenen
Variablen beruhen und ich keine Möglichkeit habe, diese in eine zu
packen. Außerdem habe ich noch zusätzlich if-Abfragen, die Bereiche
(z.B. < 0) abfragen: mit switch also nicht möglich.
Gast #285178
Lesenswert?

Nope, OldBug liegt da schon richtig: Die Ports sind wohlweislich als
"volatile" deklariert. Steuerregister und Ports müssen das sein,
sonst sorgt der Optimizer des Compilers für unliebsame Überraschungen.

Also beispielsweise
  volatile uint8_t *motor_1 = &OCR0A;
#285180
Lesenswert?

Ist eigentlich garantiert, dass comm immer im erlaubten
Bereich liegt?

Wenn ja, koenntest Du mal ueberlegen, die erste if-then-else
Leiter (oder den switch) durch einen Array Zugriff zu ersetzen.

  limitswitch = limitswitches[comm];
  motor_1 = motors_1[comm];
  motor_2 = motors_2[comm];


mit geeignet initialisierten Arrays

  volatile uint8_t* motors_1[] = { 0, &OCR0A, &OCR1A, &OCR2A };
  volatile uint8_t* motors_2[] = { 0, &OCR0B, &OCR1B, &OCR1B };
  unsigned char limitiswitsches[] = { 0, END_1, END_2, END_3 };

Oder man koennte eine struct, bestehend aus motor_1, motor_2 und
limitswitch machen und davon wieder ein Array, ...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren