Hallo,
ich bin gerade dabei mir Timer-Routinen (ohne ASF) selbst zu schreiben.
Dabei sind jetzt - mir unerklärliche - Compilerfehler aufgetreten:
void TcTimerStop(const Tc* tctimer)
{
TC_CTRLBSET_Type tc_ctrlbs;
// folgende Zeilen sind OK
tc_ctrlbs.reg= tctimer->COUNT8.CTRLBSET.reg;
tc_ctrlbs.bit= TC_CTRLBSET_CMD_STOP_Val;
// folgende Zeile liefert Err.:
// "assignment of member 'CTRLBSET' in read-only object
tctimer->COUNT8.CTRLBSET.reg= tc_ctrlbs.reg;
// direkter Bit-Zugriff: Folgende Zeile liefert Err.:
// "assignment of member 'CMD' in read-only object
tctimer->COUNT8.CTRLBSET.bit.CMD= TC_CTRLBSET_CMD_STOP_Val;
}
Ich habe keine Ahnung, warum die Register read-only sein sollen.
Im Datenblatt (und in tc.h) sind sie als R/W deklariert.
Weis jemand die richtige Syntax? Wo liegt mein Fehler?
Oh mann, ich habe den Fehler jetzt selbst gefunden: Meine const-Definition war falsch! Richtig: void TcTimerStop(Tc* const tctimer). Konstanter Pointer auf nicht const-Regs
Schau Dir mal den Funktionskopf an.
1 | void TcTimerStop(const Tc* tctimer) |
Zeiger auf konstantes Objekt? Nö, passt nich. Konstanter Zeiger auf variables Objekt passt besser:
1 | void TcTimerStop(Tc* const tctimer) |
Allerdings macht der Compiler bei Bitfields gerne mal Dinge die man nicht haben will und unerwünschte Nebenwirkungen erzeugen könnten (Read-Modify-Write). Registerzugriffe sind mit expliziten Bitmasken besser bedient, und ich habe bei Peripherial->Set =(Wert << Bitpos) & Mask; am Ende auch nur einen Schreibzugriff auf die Hardware.
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.