Forum: Mikrocontroller und Digitale Elektronik Bits setzen und löschen


von avusgalaxy (Gast)


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)

von Rufus T. Firefly (Gast)


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?

von ...HanneS... (Gast)


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.

...

von avusgalaxy (Gast)


Lesenswert?

Danke Hannes, verstehe, was du meinst.

Aber für was sind die I/O's?

von Wolle (Gast)


Lesenswert?

Das sind Spiegel- oder Abbilder der I/O-PINs und mit denen direkt
verknüpft.
Das Handling übernimmt dabei der µC.
D.h. du behandelst ein I/O-Register und der µC werkelt dann an den
PINs.

von avusgalaxy (Gast)


Lesenswert?

Verstehe..

Gibt es den bei den AVR's keinen Bitadressierbaren Bereich?

Beim 8051'er hat man da mehr als genug.

von André Kronfeldt (Gast)


Lesenswert?

Hallo,

wäre es nicht einfacher anstelle eines Extra-Bits das jeweilige
Register auf 0xff zu prüfen? Sowas wie cpi Reg,0xff ?

Grüße,
André

von avusgalaxy (Gast)


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?

von André Kronfeldt (Gast)


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é

von avusgalaxy (Gast)


Lesenswert?

Also Data kann ich nehmen. super. Also beim Debugger zeigt er schon an,
das ich Data beim 2313 habe. Stimmt schon, oder? Ach, ja, Data wird
sonst von nichts anderem verwendet?

von André Kronfeldt (Gast)


Lesenswert?

Doch. Vom Stack. Ist halt SRAM.

Grüße,
André

von Hubert (Gast)


Lesenswert?

Hast du schon mal da nach gesehen unter Bitfelder?
www.mikrocontroller.net/wiki/AVR-GCC-Tutorial#Allgemeiner_Zugriff_auf_Re 
gister
Ist denke ich ganz gut beschrieben und platzsparend.

von Wolle (Gast)


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.

von avusgalaxy (Gast)


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?

von ...HanneS... (Gast)


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.

...

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.