Forum: Mikrocontroller und Digitale Elektronik Registerbit setzen


von Michael H. (h_m)


Angehängte Dateien:

Lesenswert?

Guten Abend,


ich möchte gerne ein Regidsterbit (Bilder OBEN) im CHnCTRL setzen. Und 
zwar DIGIFILT[2:0] das mit 011 4 samples. Aber ich verstehe das mit den 
2:0 immer wieder nicht.


die samples in der Spalte DIGIFILT[2;0] werden die samples ja binär 000 
bis 111 (0-7) hochgezählt. Wie kann ich das jetzt setzen , könnte mir 
das bitte jemand erklären ?

1
CH0CTRL |= (1<<DIGIFILT) // so geht es nicht

von R. M. (Gast)


Lesenswert?

Dadurch das Du den neuen Wert veroderst, bleiben vorher gesetzte Bits 
von DIGFLT weiter gesetzt.
So sollte es gehen:
CH0CTRL =(CH0CTRL & ~7) | (1<<DIGIFILT);

Wobei ich davon ausgehe, das die "1" der neue Inhalt der drei Bits sein 
soll, und der Wert von "DIGFLT" irgendwo als 0 definiert ist.

von Theor (Gast)


Lesenswert?

> Aber ich verstehe das mit den 2:0 immer wieder nicht.

Was genau verstehst Du denn nicht? Womit hast Du ein Problem? Mit den 
Zahlen oder mit dem Doppelpunkt?

von Theor (Gast)


Lesenswert?


von Michael H. (h_m)


Lesenswert?

Theor schrieb:
>> Aber ich verstehe das mit den 2:0 immer wieder nicht.
>
> Was genau verstehst Du denn nicht? Womit hast Du ein Problem? Mit den
> Zahlen oder mit dem Doppelpunkt?

eigentlich was das jetzt genau bedeutet bzw. wie ich davon ableite 
welches bit ich in der Tabelle setzen muß.

ich kann nur mutmaßen das das die Bits vom Register CH0CTRL  0-2 gemeint 
sind (ich sehe es ja im Register oben 0-2 für DIGIFILT), aber letzten 
Endes habe ich ja 7 samples zur Auswahl.

CH0CTRL |= (1<<DIGIFILT0)|(1<<DIGIFILT1); oder könnte man das dann auch 
so  sehen für 4 samples 011 ?

: Bearbeitet durch User
von Theor (Gast)


Lesenswert?

Michael H. schrieb:
> Theor schrieb:
>>> Aber ich verstehe das mit den 2:0 immer wieder nicht.
>>
>> Was genau verstehst Du denn nicht? Womit hast Du ein Problem? Mit den
>> Zahlen oder mit dem Doppelpunkt?
>
> eigentlich was das jetzt genau bedeutet bzw. wie ich davon ableite
> welches bit ich in der Tabelle setzen muß.

Hm. Irgendwie hast Du gleich mehrere Probleme.

1. Drücke Dich exakt aus oder jedenfalls so prägnant wie möglich. Das 
ermöglicht auch präzises Denken und das wiederum hilft bei vielen 
Problemen weiter.

Du "setzt keine Bits in der Tabelle". Wie sollte das auch gehen?
Eine Tabelle ist eine graphische und textuelle Darstellung. Sie besteht 
aus Pixeln auf dem Monitor oder Punkten (Linien etc.) auf einem Stück 
Papier. Das ergibt einen visuellen Eindruck, der wiederum bestimmte 
Gedanken und Vorstellungen hervorruft.
An keiner Stelle tritt hier ein physikalisches Merkmal auf, das man als 
"Bit" bezeichnet und das Du "setzen" kannst.
Wie willst Du also in einer Tabelle ein Bit setzen?

2. Der Text "2:0" bedeutet einen Vektor, eine Folge von Bits mit den 
Nummern 2, 1 und 0. Es handelt sich um 3 Bits. Es bedeutet auch, dass 
die Bits in dem Vektor von links nach rechts absteigend nummeriert 
werden.

> ich kann nur mutmaßen das das die Bits vom Register CH0CTRL  0-2 gemeint
> sind (ich sehe es ja im Register oben 0-2 für DIGIFILT), ...

3. OK. Das "vermutest" Du. Die Vermutung ist richtig. Das kann ich 
zunächst mal bestätigen.
Die Anordnung der Texte in Datenblättern ist allerdings nicht 
willkürlich. Es ist vielmehr so, dass fast alle visuellen Darstellungen 
von "Beziehungen" zwischen Dingen, auf der Konvention beruhen, dass 
horizontal bzw. vertikal gleichen Positionen von Dingen eine Beziehung 
dieser Dinge untereinander bedeuten.
In der Regel lernt man das irgendwann ohne ausdrückliche Erklärung. Ein 
Stockwerk ist "über" oder "unter" dem anderen. Ein Nachbar wohnt "neben" 
einem anderen. Etcpp. Bei gleichem Wohnungsschnitt, ist die Küche der 
Wohnung über einer anderen in der unteren an genau der gleichen Stelle. 
Uswusf.

> ... aber letzten
> Endes habe ich ja 7 samples zur Auswahl.

4. Leider falsch. Und zwar in zweierlei Hinsicht. a) Es sind ACHT Zeilen 
in der Tabelle. Und b) hast Du keine Samples zur Auswahl sondern etwas 
Anderes. Nämlich die Anzahl der Samples, die in dem Digitalfilter 
verrechnet werden. Ein Sample ist ein Wert - das Ergebnis einer 
A/D-Wandlung. Anzahl bzw. ein Satz von mehreren Samples sind eben das: 
"(zeitlich) geordnete Mengen von Samples" Das ist wieder so ein Fall, 
bei dem präziser Ausdruck das Denken vereinfacht.


Nun, schau Dir das mal an: Du hast auf der einen Seite 3 Bits (nämlich 
Bit Nr. 2, Bit Nr. 1 und Bit Nr. 0. Und auf der anderen Seite ACHT 
Möglichkeiten die Anzahl der Samples zu bestimmen. Interessant, nicht 
wahr?
Wieviele Möglichkeiten gibt es z.B. 4 Bits mit Werte zu belegen, ohne 
das eine Kombination doppelt auftritt?


>
> CH0CTRL |= (1<<DIGIFILT0)|(1<<DIGIFILT1); oder könnte man das dann auch
> so  sehen für 4 samples 011 ?

Das kann ich so nicht, oder nur teilweise beantworten. Ist denn 
DIGIFILT0 z.B. irgendwo definiert?
Aber jedenfalls überlege Dir mal, was geschieht, wenn das Bit Nr. 2 auf 
'1' gesetzt ist, wenn der Prozessor den obigen Befehl ausführt. Ich sage 
mal, Du erhälst nicht das erwartete "011" sondern ein "111". Aber warum 
ist das so?

Ich verweise Dich zunächst nochmal auf die beiden Links oben zu den 
logischen Verknüpfungen und der Bitmanipulation. Dann formuliere die 
Frage nochmal neu, bitte.

Viel Erfolg.

von Michael H. (h_m)


Lesenswert?

Also Danke für die Mühe DANKE.

Das heisst ich habe in diesem Fall nur zwei Möglichkeiten 
Bzw.Schreibweisen.
1
CH0CTRL = 0b00000011 // 4 samples
1
CH0CTRL = 0x03     // 4 samples


und für 8 samples dann

1
CH0CTRL = 0b00000111 // 8 samples
1
CH0CTRL = 0x07      // 8 samples

und wollte ich das BIT QEN

1
CH0CTRL = 0b00001000 // QEN
1
CH0CTRL = 0x08 // QEN

ansonten muss ich nocheinmal im link schauen.

: Bearbeitet durch User
von fop (Gast)


Lesenswert?

Das mit dem 2:0 würden wir in Deutschland wohl eher als 0...2 schreiben. 
Es geht um die Bitnummern, wie sie in Deinem Bild digifilt1.jpg in der 
2. Reihe zu sehen sind. Das man beim Numerieren mit 0 anfängt ist halt 
so eine Informatikermarotte. Also mit 2:0 ist kein Spielergebnis der 
Fussballweltmeisterschaft gemeint, sondern die Bits mit den Nummern 2 
bis 0.

Wenn Du
1
CH0CTRL = 0x03     // 4 samples
schreibst, dann bedeutet das, dass alle Bits im Register CH0CTRL 
geschrieben werden. Wobei die, auf die Du jetzt nicht so geachtet hast 
mit Nullen beschrieben werden. Das kann richtig sein, muss es aber 
nicht.
Dir bleiben zwei Möglichkeiten :
entweder Du schaust nach, was die anderen Bits bedeuten und setzt sie 
so, wie Du es brauchst
oder Du liest den bisherigen Zustand aus, änderst an dem Wert die 3 Bit, 
um die es Dir momentan geht und schreibst den ganzen Plunder wieder 
zurück.
>
1
CH0CTRL =(CH0CTRL & ~7) | (1<<DIGIFILT);
macht das Zweite.

von dummschwaezer (Gast)


Lesenswert?

unsigned char merker

merker=CHnCTRL
merker&=~0x03;//erstmal alle bits löschen
merker|=0x0deinWert;//deinWert: 0..7
CHnCTRL=merker;//ab ins register

von hskrvvkelbk (Gast)


Lesenswert?

Michael H. schrieb:
> Also Danke für die Mühe DANKE.
>
> Das heisst ich habe in diesem Fall nur zwei Möglichkeiten
> Bzw.Schreibweisen.
> CH0CTRL = 0b00000011 // 4 samplesCH0CTRL = 0x03     // 4 samples

Das setzt aber die Bits 3-7 gnadenlos auf 0.
Willst Du das?

hskrvvkelbk

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.