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)
"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?
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.
...
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.
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?
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é
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?
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.
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.
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?
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.
...