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.
Verstehe.. Gibt es den bei den AVR's keinen Bitadressierbaren Bereich? Beim 8051'er hat man da mehr als genug.
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é
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. ...
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.