PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LPC1768 RSID-Register



Siro
11.01.2013, 14:59
Ursprunglicher Title war : Bit setzen wenn es gesetzt ist um es zu löschen ?

Wer sich diesen Code ohne Hintergrundwissen ansieht, wird wahrscheinlich denken, der Programmierer tickte nicht mehr richtig.



if (LPC_RSID.bits.POR == 1) /* wenn das Bit High ist */
{
LPC_RSID.bits.POR = 1; /* dann setze das Bit High ?????? */
set_standby(); /* Gerät nun in den Standbymode setzen */
}


Nun die Erklärung:
Wenn das Netzkabel in das Gerät gesteckt wird, soll es noch nicht eingeschaltet werden sondern zunächst in den Standbymodus gehen.
Erst durch Drücken einer Taste soll es anlaufen. Normalerweise lief mein Gerät gleich an, wenn man das Netkabel steckte.
Dies war aber vom Kunden unewünscht. Also benötigte ich eine Information, ob das Gerät das erste mal mit Spannung versorgt wurde.
Dafür stellt der Controller LPC1768 ein Register zur Verfügung, das RSID-Register. Hier kann ermittelt werden,
wer der Verursacher des Resets war. Wenn das Bit "POR" im RSID-Register High ist, gab es einen PowerOn-Reset.
Die Software sollte dieses Bit nun löschen, damit bei einem nächsten Reset erkannt werden kann, dass es kein PowerOn Reset war.
Zunächst setzte ich also das Bit auf 0, leider ohne Erfolg. Wenn man das Datenblatt "genauer" liest ;), steht dort,
dass dieses Bit auf "1" gesetzt werden muss um es zu löschen. Daraus resultiert dann der etwas merkwürdig aussehende Code.

Damit hat sich meine Frage zwar erledig, aber ich fand es dennoch würdig mal hier zu offenbaren.
Nicht immer ist augenscheinlich, blödsinniger Code wirklich so unsinnig....
Ein schönes Wochenende
Siro

Siro
11.01.2013, 18:40
Jetzt fällt mir aber doch noch eine hoffentlich sinnvolle Frage zu diesem Thema ein:
Dürfte der Comp0iler das eigentlich wegoptimieren ? Wenn das Bit schon gesetzt ist, braucht er es doch nicht nochmal zu setzen....
natürlich nur wenn ich vergessen würde die Register als "volatile" zu declarieren.
Siro