mikrocontroller.net

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


Autor: avusgalaxy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: avusgalaxy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Hannes, verstehe, was du meinst.

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

Autor: Wolle (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: avusgalaxy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Verstehe..

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

Beim 8051'er hat man da mehr als genug.

Autor: André Kronfeldt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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é

Autor: avusgalaxy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: André Kronfeldt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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é

Autor: avusgalaxy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: André Kronfeldt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Doch. Vom Stack. Ist halt SRAM.

Grüße,
André

Autor: Hubert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Wolle (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: avusgalaxy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.