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?
Vielleicht ein Bug? https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69330 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67839
Welchen Wert hat denn PRTIM1 ? Oliver
Scheint ein Bug zu sein? Versuch mal diese Krücke:
1 | volatile uint8_t Temp = (1<<PRTIM1); |
2 | PRR |= Temp; |
dieses "_BV" habe ich lange nicht gesehen. Was obsolete? StromTuner
_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).
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
Bin jetzt erst wieder am richtigen Rechner. /* avr/iotnx5.h - definitions for ATtiny25, ATtiny45 and ATtiny85 */ [...] #define PRTIM1 3
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.