Bits setzen und löschen

Gast #140029
Lesenswert?

Halli hallo, hab da eine Frage...

Ich lasse in meinem Programm ein Register immer aufwärts bis 0xFF und
dann abwärts bis 0x00 zählen....usw.. Damit ich weiss, daß das Register
jetzt den Wert 0xFF erreicht hat, habe ich bei den I/O Registern bei der
Adresse 0x00 das bit 0 gesetzt. Wenn das Register auf 0x00 war, dann
habe ich das bit im I/O Register wieder gelöscht. Hat leider nicht
funktioniert. Warum nicht? Kann ich die I/O Register für solche Zwecke
nicht nehmen? Werden die von anderen Anwendungen benutzt?

Habe dann einfach ein Register genommen, und da dann das 0'te Bit
gesetzt oder gelöscht. Aber ich denke, das ein Register sehr teuer ist
für solche Anwendungen, da ein Register ja viel mehr kann... (und man
hat ja nicht soviele)
Gast #140030
Lesenswert?

"hat nicht funktioniert" ist meine Lieblingsfehlerbeschreibung.

Was für einen Controller verwendest Du, was für ein "I/O-Register"
(was auch immer von Dir dafür gehalten werden mag) verwendest Du?

Was mag für Dich der Unterschied zwischen "I/O-Register" und
"Register" sein?

Quelltext?
Gast #140031
Lesenswert?

Opfere ein "oberes" Register und nenne es "mode" oder "flags".
Darin kannst du einzelne Bits nach Belieben setzen und löschen und dein
Programm in Abhängigkeit der Bits verzweigen.

Willst du aber nur hochzählen und wieder runter (und wieder hoch usw.),
dann zähle doch durch Addition mit einem Register, das beim Hochzählen
den Wert 1 enthält und beim Runterzählen den Wert -1.

Register sind zwar "kostbar", aber ich habe am Ende fast immer noch
einige übrig.

...
Gast #140036
Lesenswert?

ja, das mach ich ja, und dann will ich ein Bit setzen, damit das
Register wieder weiter raufzählen kann, und ich dann weiß, daß das
Register schon einmal bei 0xFF war..... Ist ein bisschen blöd zum
erklären....


Es gibt ja fünf memory beim AVR Studio. EEprom, Register, I/O, Programm
und Data...

Kann man in diesen Bereichen kein Bit setzen?
Gast #140037
Lesenswert?

Aha. Also ein Überlaufbit ...

Dann nimm Dir ...HanneS... Vorschlag zu Herzen. Ein Register (oder
Data-SRAM-Platz) mußte opfern. EEprom ist langsam und von den
Schreibzyklen her begrenzt. 'Programm' ebenso (Flash), I/O ist dann
etwas vergewaltigt. Je nach AVR kann es aber auch sein, daß Du kein
Data hast. Nimm ein Register (wie ...HanneS... sagte). Ist das Beste.

Grüße,
André
Gast #140041
Lesenswert?

Reichen dir denn im Statusregister die "Zero"- und "Carry"-Flagge
nicht? Es gibt da auch noch das "T"-Bit.
"Z" zeigt an, ob ein Byte "Null" geworden ist.
"C" zeigt einen Überlauf an. D.h. das Byte war vorher "FF".
Für das "T"-Bit gibt's sogar Befehle:
BST speichert ein Bit aus einem Register.
BLD lädt das Bit in ein Register.
Gast #140042
Lesenswert?

nehmen wir an, ich drücke einen Taster. Wenn der Taster gedrückt ist,
dann sollte er eine Schleife einmal durchlaufen. Am ende der schleife
setze ich dann ein Bit. Wenn das Bit gesetzt und der Taster gedrückt
ist, dann sollte das Programm nicht mehr in diese Schleife springen.
Und damit das Programm dann auch nichtmehr dorthin springt, setze ich
das Bit.

Verstehst du?
Gast #140043
Lesenswert?

Dann nimm doch lieber eine professionelle Entprellrputine, die macht
genau das und noch mehr...

Und dann solltest du dir mal Gedanken über die verschiedenen
Speicherarten und Adressbereiche machen, denn du würfelst da allerhand
durcheinander. Schau dir mal die memorymapped Adressen der Register,
des I/O-Bereichs und des SRAM an. Da gibt es etliche Besonderheiten.
Was ist I/O?? - Wie arbeitest du mit Timern, Ports, INT's und der
gesamten Peripherie??

Einen speziellen Bitbereich brauchst du nicht, die 16 oberen Register
sind bitorientiert ansprechbar. SBR und CBR sind deine Freunde, zum
Auswerten SBRS und SBRC. Über das T-Flag und die T-Copy-Befehle kannst
du auch untere Register bitweise nutzen.

Auch die untere Hälfte des I/O-Bereichs kann bitweise angesprochen
werden, SBI, CBI, SBIS und CBIS sind deine Freunde. Der obere
I/O-Bereich ist nur byteweise erreichbar, genau wie das SRAM.

...

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