Forum: Compiler & IDEs PRR |= _BV(PRTIM1) führt zu "Error: operand out of range: 32"


von Hans (Gast)


Lesenswert?

Ich schalte über das PRR-Register selektiv Komponenten ab und an, um 
bestmöglich Energie zu sparen. Meine CPU ist ein ATTiny25 und ich 
verwende avr-gcc 5.2.1.

Sobald ich nun die Zeile

PRR |= _BV(PRTIM1);

verwende, um Timer1 selektiv abzuschalten, bekomme ich beim Kompilieren 
den Fehler:

Error: operand out of range: 32

Ich bin schon längere Zeit am Überlegen. Was mache ich falsch?

von Md M. (Firma: Potilatormanufaktur) (mdma)


Lesenswert?


von Oliver S. (oliverso)


Lesenswert?

Welchen Wert hat denn PRTIM1 ?

Oliver

von Ingo L. (corrtexx)


Lesenswert?

Scheint ein Bug zu sein?
Versuch mal diese Krücke:
1
volatile uint8_t Temp = (1<<PRTIM1);
2
PRR |= Temp;

von Axel R. (Gast)


Lesenswert?

dieses "_BV" habe ich lange nicht gesehen. Was obsolete?

StromTuner

von Hans (Gast)


Lesenswert?

_BV(x) ist identisch mit (1<<x). Ein Makro, dass es schon ewig gibt.

PRTIM1 sollte beim ATTiny25 gleich 3 sein (ist laut Datenblatt Bit 3).

von Oliver S. (oliverso)


Lesenswert?

Hans schrieb:

> PRTIM1 sollte beim ATTiny25 gleich 3 sein (ist laut Datenblatt Bit 3).

Je nun, es sollte da auch keine Fehlermeldung geben. Gibt es aber.
Also, welchen Wert hat PRTIM1 denn nun tatsächlich? Diese denkbare 
Fehlerursache in der avrlibc würde ich zumindest mal überprüfen.

Oliver

von Hans (Gast)


Lesenswert?

Bin jetzt erst wieder am richtigen Rechner.

/* avr/iotnx5.h - definitions for ATtiny25, ATtiny45 and ATtiny85 */
[...]
#define PRTIM1  3

von Timo (Gast)


Lesenswert?

Das ist der oben schon genannte Bug!
gcc 5.2.1 ist davon betroffen.

PRR ist genau das kritische Register 0x20. Die betroffenen gcc Versionen 
verwenden fälschlicherweise die Instruktionen SBI/CBI mit diesem 
Register.

Lösung: gcc updaten

oder der oben schon genannte workaround mit volatile variable: Dann muss 
wegen volatile zwischen den Registern kopiert werden.

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.