Hi guten Morgen,
einen Teil Deiner Frage kann ich Dir schon sehr schnell beantworten:
MSB bedeutet "most significant bit"
Die Wiki sagt dazu folgendes:
Das höchstwertige Bit ist das Bit, das innerhalb der Zahl an der Stelle mit dem höchsten Stellenwert steht. Bei einer n-stelligen Binärzahl ist also dasjenige Bit das höchstwertige Bit, das an der n-ten Stelle steht (Multiplikation mit 2n − 1). Häufig wird für das höchstwertige Bit die Abkürzung MSB (aus dem Englischen für most significant bit) verwendet.
Kurz gesagt, es geht um das höchswertigste Bit einer Variable oder eines Ausdrucks. Bei Byte ist es das Bit 2^7, also das Bit 8 und damit der Bit-Wert 128. Bei Word ist es das Bit 2^15, also das Bit 16 und damit der Bit-Wert 32768.
LSB bedeutet "least significant bit"
Die Wiki sagt dazu folgendes:
Analog dem MSB besitzt das niedrigstwertige Bit den niedrigsten Stellenwert 1 (Multiplikation mit 2^0 = 1). Im Englischen wird für das geringwertigste Bit die Abkürzung LSB (engl. für least significant bit) verwendet.
Auch hier kurz gesagt bei 2^0 ist es immer Bit 0 und damit der Bit-Wert 1.
OK?
Dann zu Deinen Bits und Bitwerten und veroderungen und verundungen und und und. Ich glaube Du hast so langsam von den vielen Bit-Operationen einen Knoten im "Hirn"
den ich versuchen möchte gemeinsam mt Dir zu lösen. OK?
Also, prinzipiell gilt:
- ODER verwendet man um Bits in Variablen auf HIGH und damit "1" zu setzen.
- Um Bits wie in Deinem Fall auf LOW und damit auf "0" zu setzen benötigst Du UND.
Das Grundprinzip hatte ich Dir ja in diesem Thread schon mal kurz erläutert.
Und weiter:
Du möchtest / must insgesamt 24 Bit vom Mega zum LM7001 übertragen. Eine Variable mit 24 Bit gibt es nicht, aus diesem grund nehmen wir LONG, der hat 32 Bit. Das sind zwar 8 Bit zuviel aber das ist egal.
So, nun kannst Du Dir überlegen wie Du den LONG befüllen möchtest. Um beim Beispiel aus dem Daten-Blatt (siehe auch Bild im Anhang) zu bleiben kann man die Daten linksbündig in die Variable einbauen (Variante 1) da der ganze Code so besser lesbar ist. Die Daten müssen dann mit Shiftout und dem Parameter "1 – MSB shifted out first when clock goes high" weil Du willst ja die Bits links (MSB) in genau dieser Richtung zum LM schieben.
Man kann die Daten auch spiegeln (Variate 2), dazu musst Du die Hirnwindungen umdrehen und alles gespiegelt in der Varible ablegen und mit Shiftout und dem Parameter "3 – LSB shifted out first when clock goes high" ausgeben. Bedeutet aber nicht grade eine Verbesserung der lesbarkeit Deines Programms. Aber........
Zu allem Leid ist hier das Datenblatt sehr unleserlich und man muss sehr sehr aufpassen was man treibt da immer LSB und MSB gegenüber dem normalen Menschenverstand gedreht sind.
Zurück zum Aber....... eigentlich würde ich Variante 1 bevorzugen, da man jedoch die Frequnz berechnen kann, eine Formel und Mathematik dahinter steckt welche es ggf. notwendig macht (wenn man nicht gerade wieder mit Tabellen arbeiten möchte sondern wie in einem Beispiel von Dir rechnen möchte) so würde ich versuchen mit Vrainte 2 zurecht zu kommen.
Also los:
Nun legen wir eine Variable mit 32 Bit an und belegen sie mit NULL vor:
Code:
DIM datavar AS LONG
datavar = 0
Zugegeben, die Varibale ist zu groß und Du benöigst nur 24 Bit. Ich werde dies im Weiteren mit einem x für die nicht benötigten Bits darstellen.
Ergebnis ist also "datavar = &Bxxxxxxxx000000000000000000000000
In Bit D0 bis D13 liegen die Divisor-Daten. Achtung! D0 ist in diesem Beispiel Bit 0 und D13 ist Bit 13. Verstanden? Wir fangen ja gespiegelt von rechts an!
Nun kannst Du gemäß Beispiel aus dem Datenblatt rechnen:
FM 100 kHz steps (fref = 100 kHz)
FM VCO = 100.7 MHz (FM RF = 90.0 MHz, IF = 10.7 MHz)
Divisor = 100.7 MHz (FM VCO) ÷ 100 kHz (fref) = 1007 ® 3EF(HEX)
Das Rechnen überlasse ich Dir. Egal ob Du ein Word oder Long oder was auch immer nimmst. Dann würde das ganze so aussehen:
Code:
' bla bla bla, wir rechnen die frequenz
frequenz = freqzuenz AND &B0011111111111111
Ich habe mit der AND-Operation noch zur Sicherheit die nicht benötigten Bits ausgeblendet. Nun kann die Freqzenz auf die Variable datavar verodert werden:
Code:
datavar = datavar OR frequenz
Zugegeben, dieses Beispiel gilt nur für FM und sieht bei AM anders aus. Bei AM hast Du 4 Bits weniger, die Bits 0-3 sind auf NULL gesetzt aber das ist auch kein Problem, schau her:
Code:
' bla bla bla, wir rechnen die AM frequenz
Shift frequenz, LEFT. 4
frequenz = freqzuenz AND &B0011111111110000
datavar = datavar OR frequenz
Damit hast Du schon die halbe Miete. Es ist nun Philosopie ob Du für das Steuerword eine LONG-Variable anlegst und diese vorbelegst oder ob Du mit SET datavar.x oder RESET datavar.x einzelne Bits zur Laufzeit je nach Einstellung die Du vornehmen möchtest setzt oder zurücksetzt.
Bleiben wir im Beispiel von Dir bei einer eigenen Variable steuervar die ich aber als LONG und nicht als WORD auslegen möchte.
Für den Inhalt und die genaue Funktion bis auch Du zustädnig da ich kein Funker bin, ich übernehme also keine Garantier für die Richtigkeit der einzelnen Bits. Aber, T0 ist auf Bit 0 und T1 ist auf Bit 1 usw.
Also weiter:
Code:
DIM steuervar AS long.
steuervar = &B0011000000
Nun liegt das Ding aber noch auf Bit 0 bis Bit 9. Es muss ja nach oben auf Bit 14 bis Bit 23. Das erledigt für uns die Shift-Operation. Wir schieben also um 14 Bits (über die frequenz hinweg) nach oben, maskieren zur Sicherheit und verodern.
Code:
Shift steuervar, LEFT, 14
Steuervar = Steuervar AND &B111111111100000000000000
datavar = datavar OR steuervar
So, nun hast Du frequenz mit steurword in datavar verheiratet und nun kannst Du Datavar rausschieben.
Code:
Shiftout Lm7001_data , Lm7001_clock , datavar , 3 , 24 , 20
Gemäß Datenblatt müsste es auch mit einer Delay-Zeit von 2µs funktionieren.
So, das müsste es, wenn ich nichts vergessen habe eigentliche sein.
Aber im grund genommen sieht Dein Code unten auch ganz brauchbar aus. Habe ihn kurz überflogen und denke, dass es funktionieren können.
So, nun halt ich mal wieder die Klappe, ist schon genug geworden. Hoffe es hilft Dir weiter!
Grüße,
Markus