Ansprechen eines PLLs (LM7001)

Hi!

Zu 1: Super, na dann mal los :p

Zu 2: JA! Schau Dir hierzu mal den befehl "shift" in der BASCOM Hilfe an. Du kannst angeben ob links/rechts geschoben werden soll und wie mit Vorzeichen umgegangen wird. Probiers aus :D

Grüße,
Markus
 
Menno, das kann doch alles nicht so schwer sein :mad:

Ich habe nun mit Shiftout experimentiert, aber den LM7001 habe ich nicht angesprochen bekommen.

Da der Markus mir aber ein funktionierendes Programm für den SAA geschrieben hat, dachte ich mir, versuchste Shiftout nun auch mal am SAA.

Nix! Wieso bekomme ich weder den SAA noch den LM mit Shiftout angesprochen?

Hier ein Auszug vom Code zum SAA:
Code:
Worda_frequency = 15000
Wordb_config = &H8150

Reset Dlen
Reset Clb
Reset Dat

For A = 1 To 15                                             
   Set Clb
   Waitus 10
   Reset Clb
   Waitus 10
Next A

Dlen = 1
Shiftout Dat , Clb , Wordb_config , 1 , 16 , 1000
Shiftout Dat , Clb , Worda_frequency , 1 , 16 , 1000
Reset Dlen

Habe ich etwas verdreht, total übersehen oder ist das ganz einfach Mumpitz ?
 
Hallo Michael,

mumpitz is es nich, aber vielleicht hast Du etwas übersehen. Also, den Beispielcode habe Dich Dir schon vor ner ganzen Weile geschrieben und das meiste davon habe ich verdrängt aber an einige Grundregel kann ich mich noch erinnern.

Diese lauten:
- toggeln um wach zu werden :D
- für Busruhe sorgen
- Startbit senden
- Word rausschaufeln
- Start-Ende-Sequenz senden

Vielleicht schaust Du Dir meinen Original-Code nochmals an, dann wirst Du die einzelnen Elemente wiederfinden.

Wenn ich mir Deinen Code-Schnipsel ansehe so fallen mir folgende Dinge auf:
- Die Wartezeiten zwischen den Bits entsprechen nicht meinen damals ausprobierten Werten von 10 µs. Du verwendest entweder keine Wartezeit oder beim Shiften 1000, das ist Faktor 100 mehr. Weiß nicht ob das funktioniert. Du kannst ja mal meinen Originalcoder hernehmen und bei Bit_wait_time = 1000 eintragen anstelle von 10. Wenn es immer noch tut kannst Du es so lassen aber meiner Meinung nach werden die Bits zu langsam rausgeshiftet.

Aber es kommt noch besser::eek:

- Zwischen dem Toggeln und dem Startbit sollte Busruhe herrschen. Das erreichst Du indirekt dadurch, dass das letzte Kommando in Deiner For-Schleife ein Reset mit Wait ist. Müsste also reichen.

- Aber WO bitte ist das Senden des Startbits. Das vermisse ich schon sehr! Du beginnst sofort mit dem Rausshiften der Daten. Schau Dir das mal an, ob das so korrekt ist. Ggf. werfe nochmal ein Blick in das Datenblatt. Ich meine mich erinnern zu können dass Du auf jeden Fall noch vor den Datenbits ein StartBit benötigst. Auch hier musst Du zwischen den zuständen eine bestimme Zeit x die ich damals auf 10 µs festgelegt habe warten.

- Der ShiftOut selbst sieht ok aus bis auf die große Wartezeit die ich nicht mit 1000 sondern mit 10 oder vielleicht mit 15 oder 20 parametrieren würden. Prinzipiell sollte es aber so funktionieren.

- Aber dann: WO bitte ist die Daten-Ende-Sequenz. Hast Du das Bitgezappel mir in Deinem Code-Ausschnitt nur verschwiegen oder übersehen.

Irgendwie finde ich nur die Hälfte der notwendigen Schritte in Deinem Code. Die Hälfte fehlt. Schaus Dir an und geb mir Bescheid.
Wenn's dann immer noch nicht richtig funzt dann hänge am besten mal Deinen ganzen Code-Teil dran damit ich den Komplett-Überblick über Deinen Code bekomme. Aktuell vermisse ich halt die Hälfte.

Würde mich freuen wenn ich Dir damit weiterhelfen konnte.

Grüße,
Markus

PS: Ja stimmt, hatte Dir ja damals den Codeteil aus dem Bauch heraus geschrieben und gesendet. Kann mich noch gut erinnern. War zu diesem Zeitpunkt krank, hatte Fieber, lag im Bett und hatte ausnahmsweise mal viel zeit :p
 
Ich bewundere immer wieder deine Geduld und deine ausführlichen Erklärungen! Ich hoffe nicht dass du wieder Krank bist und Fieber hast ;)

Ich habe getoggelt und für Busruhe gesorgt, aber das Startbit ???? Das ist ein Low-Signal auf der Datenleitung, ja ?! Wie ist es mit dem Clock-Signal wärend dem Low-Signal? Ich glaub da sitzt noch nen Fehler!

In deinem Programm hast du WordB vor WordA geschickt. Ist das so richtig in meinem Code? Auch die Richtung der Daten richtig?

Die Wartezeit habe ich wieder auf 10uS gesetzt. Geht übrigens mit deinem alten Code auch so langsam, dass man mitzählen könnte ;)

Datenendsequenz hab ich nun auch angehangen.

Hier nun mal der ganze Code:
Code:
$regfile = "m8515.dat"
$crystal = 1000000
$baud = 300

Dim A As Byte
Dim B As Byte
Dim C As Word
Dim Wordb_config As Word
Dim Worda_frequency As Word

Config Portb = Output
Config Portd = Input
Portd = &B11111111

Clb Alias Portb.1                                           '14  weiß
Dat Alias Portb.2                                           '12  rosa
Dlen Alias Portb.0                                          '13  gelb

Worda_frequency = 15000
Wordb_config = &H8150
Waitms 500

   ' Ruhe
Reset Dlen
Reset Clb
Reset Dat

   ' toggeln

For A = 1 To 16
   Set Clb
   Waitus 10
   Reset Clb
   Waitus 10
Next A

    ' Nochmal Ruhe
Reset Dlen
Reset Clb
Reset Dat
Waitus 10


   ' Out Schiften ;-)
Dlen = 1

   'leading zero, startbit wordb
Reset Dat
Waitus 10
Shiftout Dat , Clb , Wordb_config , 1 , 16 , 10

   'leading zero, startbit worda
Reset Dat
Waitus 10
Shiftout Dat , Clb , Worda_frequency , 1 , 16 , 10


   ' Endsequenz

   Reset Dlen
   Waitus 10
   Set Clb
   Waitus 10
   Reset Clb
   Waitus 10
   Set Dlen
   Reset Dat
   Reset Clb
   Waitms 100

End

Ich hab nochmal einen Ausschnitt vom Datenblatt angehängt (Saa).
 

Anhänge

  • saa1.jpg
    saa1.jpg
    61 KB · Aufrufe: 13
Hab da mal noch was einfacheres gefunden.
Aber es funktioniert Nicht. Ob es nun wirklich am Code liegt, oder doch meine Hardware nicht passt, habe ich noch nicht raus bekommen:

Code:
'UKW-Frequenz in 100kHz ist Übergabeparameter => 103,5MHz = 1035

'Port Pins: CE    Pb.0  (Output)
'           Clock Pb.1  (Output)
'           Data  Pb.2  (Output)

$regfile = "m8515.dat"                                      ' specify the used micro
$crystal = 1000000                                          ' used crystal frequency
$baud = 19200                                               ' use baud rate

Const Lm7001steuerwort = &B00000000100000000000000000000000

Lm7001_ce Alias Portb.0
Lm7001_clock Alias Portb.1
Lm7001_data Alias Portb.2

Declare Sub Radiofrequenz(byval Rfreq As Long)

Dim L As Long

Config Portb = Output
Portb = &b00000000

Waitms 100

Call Radiofrequenz(1035)
Do : Loop

Sub Radiofrequenz(rfreq)
   Rfreq = Rfreq + 107                                      'ZF 10,7MHz
   Rfreq = Rfreq Or Lm7001steuerwort
   Lm7001_ce = 1                                            'CE = Aktiv
   Waitus 2
   Shiftout Lm7001_data , Lm7001_clock , Rfreq , 3 , 24 , 2
   Waitus 2
   Lm7001_ce = 0
End Sub

Wenn Euch der Code für Richtig erscheint, vermute ich dass das VCO-Signal zu schwach für den LM ist, oder aber das STK500 komische Dinge macht, zB wegen den Pullup-Widerständen ?! :confused:
 
Hmmmm, Michael,

ich kann zunächst keine Auffälligkeiten finden. Habe mir den Code nun zum 2. Mal angesehen und bin der Meinung, dass er eigentlich funktionieren müsste.

Vielleicht übersehe ich auch noch etwas, vieleicht auch etwas simples aber ohne probieren komme ich da aktuell auch nicht drauf.

Ich würde hier jetzt auch als nächstes mal ein Oszi bemühen und wirklich ausprobieren und anschauen was passiert. oft liegt der Teufel im Detail.

Komische Dinge des STK500 kannst Du dann ausschießen wenn Du Dir die Beschaltung der Leitungen im STK500 mal angesehen hast. Wenn ich morgen dazu komme werfe ich mal einen Blick in die Beschaltung. Es reicht, wenn Du die Signalpfade verfolgst welche für Dich relevant sind. Ausschließen würd eich es zunächst nicht aber mehr siehst Du erst auf dem Oszi oder im Schaltplan.

Ich krieg aber noch einen kleinen Knoten ins Hirn. Vrsuchst Du nun den SAA oder den LM7001 zu steuern.

Irgendwas ist faul. Schick mir doch bitte nochmals das Datenblatt zum LM7001. Das vom SAA müsste ich noch von damals haben. Ich glaueb ich muss mal einen Blick in das Datenblatt werfen.

Grüße,
Ma
 
Es funktioniert .......
Ich hatte den Entstörkondensator falsch gewählt, das kommt davon wenn man die Zahlen nicht richtig lesen kann, und dann hab ich langsamer gesendet: 5uS statt 2uS .....

Ansteuern mag ich den LM, denn für den SAA hab ich ja einen funktionierenden Code von dir :rolleyes:

Im gegensatz zu Markus seinem SAA-Code versteh ich diesen hier schon etwas besser, bis auf die OR Zeile. Da brauch ich wohl nochmal eine Erklärung zu.

Datasheet : http://datasheet.digchip.com/413/413-08976-0-LM7001.pdf


Auf FM bekomme ich die Geschichte ans laufen, aber AM will noch nicht.
Wenn ich nun "Lm7001steuerwort = &B00000000100000000000000000000000"
komplett auf 0 setze, habe ich doch AM mit 100kHz Teilung? Oder habe ich jetzt was übersehen? Ich bin mir nicht sicher ob im AM-Bereich 100khz überhaupt gehen, aber auch eine 5er 9er oder 10er Teilung will nicht.
Die Steuerbits sind doch von rechts nach links, das 15. bis 24, 1 bis 14 sind die Frequenz, wobei auf AM die ersten 4 mit Nullen gefüllt sind?
Die hinzu addierten 107 hab ich natürlich auch weg gelassen.

Sind nach der OR-Verknüpfung mit zB 500 wirklich die ersten (von rechts) 4 Bits low?
 
Freut mich das es funktioniert und der Fehler mal nicht sw-technischer Natur sondern eher HW war :)

Die OR-Zeile mit der Du noch Probleme hast ist nicht schwer zu verstehen. Es handelt sich hier um eine binäre ODER-Funktion. Was bassier mit ODER?
Schauen wir uns das mal mit zwei einzelnen Bits an. Argument 1 soll mit Argument 2 verodert werden:

A1 ODER A2 = Ergebnis
---------------------
0 0 = 0
0 1 = 1
1 0 = 1
1 1 = 1

Reine Binäre Operation. Du kannst auch Byte und Word und Double miteinander "verodern" dabei werden ganz einfach Bit für Bit miteinander verodert, die 1ner, die 2er, die 4rer, die 8ter,.....

Verstanden? Was bedeutet das für Dich und Deinen Code?
Die Bitsequenz welche die Du zum SAA oder LM senden möchtest besteht aus festen Steuer-Bits und einem variablen Anteil für die Frequenz.
Du berechnest erstmal Deine Frequenz und damit den variablen Anteil und legst mit der OR Operation das Steuerwort drüber so dass Du ein einziges bitmuster hast was Du zur PLL übertragen kannst.

ACHTUNG: Steht "Schmutz" im Bitmuster weil Du falsch rechnest so kann es passieren, dass Du zwar im Steuerword eine 0 schreiben möchtest, diese 0 auch brauchst aber weil vorher das Bit schon wegen falscher implementierung auf 1 gestanden ist bleibt es 1.

Also, was tun: Üblicher Weise geht man zu beginn von Operationen hin un initialisiert notwendige Varaiblen mit NULL. Kann hier entfallen wenn man bei der Berechnung aufpasst, dass bestimmte Bitgrenzen nicht überschritten werden.
Um ganz ganz sicher zu gehen dass man nicht bei Berechnungen in Steuercode-Teilen des Longs herumpfuscht empfehle ich in der Regel die Steuercode-Teile vor der OR-Operation mit NULL zu maskieren.

Ja, ich sehe jetzt Dein Gesicht :p

Schau Dir mal AND an:

A1 AND A2 = Ergebnis
---------------------
0 0 = 0
0 1 = 0
1 0 = 0
1 1 = 1


Mit AND 0 kannst Du ein einzelnes BIT auf jeden Fall zur 0 zwingen. Was bedeutet dies für Dich konkret?
Beispiel: Du hast ein Byte x in dem das low Nibbel (4-Bit) Deine Daten und das high Nibbel Einen Steuercode beinhaltet den Du in einer Variable y gespeichert hast. Damit x dein y nicht beeinflusst und dein y dein x nicht kannst Du folgendes machen:
Code:
y = y AND &B11110000 ' Sicherstellen das Steuerbits nur im high nibble (ungewünschte Bits auf NULL setzen)
x = x AND &B00001111 ' Sicherstellen das Datenbits nur im low nibble (ungewünschte Bits auf NULL setzen)
x = x OR y ' Steuerbits in Bytevariable einbauen
' Bytevariable x übertragen

Es gibt für die OR-Operation in Deinem Beispiel auch eine andere Lösung: Wenn Du sicherstellen kannst (z.B. mit AND-Maske) dass der Bit-Bereich Deines LONG im Bereich Seteuerbits "sauber" ist dann kannst Du auch mit einer normalen Addition die Steuerbits in Deine Frequenzbits einbauen und hast damit das gleiche Ergebnis.

Deine Frage
Sind nach der OR-Verknüpfung mit zB 500 wirklich die ersten (von rechts) 4 Bits low?
solltest Du nun selbst beantworten können.

Bevor ich mir nun das Datenblatt ansehe lass ich Dich jetzt erstmal nochmals selbst rennen. Schau ob Du es hinbekommst. Mit Frequenzen habe ich es nicht so aber die prinzipielle Vorgehensweise müsste klar sein.

Halt mich auf dem Laufenden ob Du weiter gekommen bist oder ob ich mir das Datenblatt mal ansehen sollte weil Du hängen bleibst. Ich helfe dann gerne weiter.

So und nun werde ich auch noch etwas arbeiten :D
 
Aha :flute:

Irgendwas versteh ich noch nicht richtig, machen wir nochmal Grundlagenforschung:

Wertigkeit der Bits:
128 64 32 16 8 4 2 1 , ja?
MSB = 128, LSB = 1, ja?


Wenn ich nun zu &B00000000100000000000000000000000 (dez)1023 hinzu "ORdere" kommt doch &B00000000100000000000001111111111 bei raus?

Da doch die ersten 4 Bits für den LM auf AM egal sind, habe ich als frequenz ja nur 111111 (dez 63) übertragen :eek:
Auch das AND-ieren mit 0000 bringt hier doch den selben Misserfolg?

Da ich die Gesetze der Bits wohl immer noch nicht recht verstanden habe, habe ich das obrige Beispiel ins Programm übernommen :
- Frequenz 1023
- zuzählen von 107 ausgeschlossen
- übertragung gaaaaaaaaaaaaaanz langsam gestellt
- LEDs an die Pins
und hab mir das ganze angeguckt:

Als erstes werden nicht 4 Nullen übertragen, sondern gleich 6 Einsen und irgendwann noch mal ne Eins ........


Wo steckt der Denkfehler ?
Wie bekomme ich zb 8 Bit in einen 14Bit breiten Bereich, wo 4 Bit egal (auf 0) sind?

Nun bin ich nochmal totaler durcheinander:
Windoofs Taschenrechner (Wissenschaftlich):
Als Beispiel für die Frequenz im Datasheet wird 14853 angegeben.
laut Datenblatt : 10100000010111
laut t. Rechner : 11101000000101

Ist für Euch bestimmt das einfachste der Welt, aber ich bin (hoffentlich nur noch heute) damit total überfordert :(
 
Also bei der letzten Frage kann ich schon mal weiterhelfen, bei den anderen Fragen, da kuck ich später nochmal nach :hmmmm:

Nun bin ich nochmal totaler durcheinander:
Windoofs Taschenrechner (Wissenschaftlich):
Als Beispiel für die Frequenz im Datasheet wird 14853 angegeben.
laut Datenblatt : 10100000010111
laut t. Rechner : 11101000000101

Im Datenblatt steht LSB links und MSB rechts. Dreh mal oben die erste Zeile ("laut Datenblatt") um und vergleiche die dann mit der unteren Zeile :lollypop:

Grüße,
Dirk
 
Hallo Dirk,
ja das eine ist von links nach rechts, das andere von rechts nach links.
Puh, das ganze umdenken ..... das ist noch nix für mich :eek:

Nochmal zu den Bits die für AM übertragen werden müssen:
Die ersten 4 Bits sind in diesem Fall ja die niederwertigen, die ich aber unbedingt brauche, werden aber laut Datenblatt auf 0 gesetzt und ignoriert. Würden nun die 4 höherwertigen Bits fehlen, könnte ich immerhin noch kleinere Zahlen übertragen.
Das erste Bit, also das LSB (was heisst LSB und MSB überhaupt ausgeschrieben?) steht an 5. Stelle.
Ich muss also vorne 4 mal 0 setzen, bevor die nächsten 10 Bit für die Frequenz folgen.
Und das kann doch garnicht mit der "verORderung" funktionieren?
Im Gegensatz zur FM Steuerung, da die Frequenz gleich ab dem ersten Bit (lsb) gesteuert wird.

Es sind diese verflixten ersten 4Bits, die hier alles durcheinander bringen ...
 
So, nun nochmal etwas Code. Was meint ihr? Sieht das brauchbar aus?

Code:
$regfile = "m8515.dat"                                      
$crystal = 1000000                                          ' used crystal frequency
$baud = 19200                                               ' use baud rate

Lm7001_ce Alias Portb.0
Lm7001_clock Alias Portb.1
Lm7001_data Alias Portb.2

Dim Vorlauf As Byte
Vorlauf = &B00000000 '4 Nullen
Dim Frequenz As Word
Frequenz = 513 ' 1. und 10. Bit = 1  (513kHz)
Dim Steuer As Word
Steuer = &B0000000011000000  ' 1kHz Schrittweite, AM-Bereich

Config Portb = Output
Portb = 0

Waitms 100
Gosub Ausgabe

Main:
Do
Loop

Ausgabe:
   Lm7001_ce = 1                                      'CE = Aktiv
   Waitus 20
   Shiftout Lm7001_data , Lm7001_clock , Vorlauf , 3 , 4 , 20

   Shiftout Lm7001_data , Lm7001_clock , Frequenz , 3 , 10 , 20

   Shiftout Lm7001_data , Lm7001_clock , Steuer , 3 , 10 , 20
   Waitus 20
   Lm7001_ce = 0

Return
End
 
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
 

Anhänge

  • lm7001.gif
    lm7001.gif
    16 KB · Aufrufe: 13
Hallo Markus,

LSB und MSB versteh ich nun, nur ich verwechsel die beiden gerne mal. Drum die Frage nach der Bedeutung des L und des M, um mir eine Brücke zu machen.
Genauso wie vor 30 Jahren mit AM und FM, oder vor 20 Jahren UHF und VHF, ich wußte zwar was es ist, verwechselte es halt gern mal.

Der Trick, bei dem ich absolut nicht hinterkam, lag bei den "verschobenen" 4 Bits. Nun hast du mir den Anhaltspunkt gegeben :
Code:
' bla bla bla, wir rechnen die AM frequenz
Shift frequenz, LEFT. 4
frequenz = freqzuenz AND &B0011111111110000
datavar = datavar OR frequenz

So langsam löst sich der Knoten im Hirn. Ich werde nun damit aber erst einmal experimentieren, so dass es tief im Kopf verankert wird.


Danke dir für diese ausführliche Erklärung !

Damit ich mir die die Ergbnisse der Operationen ansehen zu können, wie kann ich mir das anzeigen lassen?
Ich dachte ne Anzeige auf dem LCD wär nicht blöd, aber ungeschickt weil mein Display nur 16 Stellig ist.
Wie kann ich mir die Geschichte denn binär angucken? ZB mit dem Terminal?
 
Indem Du Dir einfach eine kleine Trace-Ausgabe schreibst. Die kannst Du auch mit einem Schalter versehen und ein- oder ausschalten. Z.B. so:

Code:
Const Main_testmodus = 1

' Trace ausgeben
#if Main_testmodus
   Print "** Trace **"
#endif

Damit kannst Du sehr schön auf RS232 Daten rausschreiben.

So, und binäre Ausgabe erzeugst Du mit dem Befehlt BIN(). Das ganze sieht dann so aus:

Code:
Print Bin(blablabla)
Blablabla ist natürlich die Variable welche Du ausgeben möchtest.

Grüße,
Ma
 
Ha, der Knoten ist gelöst :D

Code:
$regfile = "m8515.dat"
$crystal = 4000000
$baud = 19200

DIM datavar AS LONG
Datavar = &B00000000010000000000000000000000                '10kH Step

Dim Frequenz As Word
Frequenz = 513

Shift Frequenz , Left , 4
Frequenz = Frequenz And &B0011111111110000
Datavar = Datavar Or Frequenz

Print Bin(datavar)
End

Somit kann ich gleich gucken was passiert.
Aber was passiert mit den ersten 4 Bits, die ich verschoben habe?
Also wenn ich "frequenz = &b1000000000000000" ist das gesetzte Bit ja verschwunden. Ist das für immer Verloren, oder macht es sich noch wo anders breit?

Was passiert in dieser Zeile:
Const Main_testmodus = 1

Const = Konstante ?
 
Hallo Micha,

mit "CONST konstante = x" legst Du einfach eine Konstante mit dem Namen "konstante" und dem Inhalt 1 an. Du kannst der Konstante auch 2 o der 3 oder ..... geben.

In der IF-Abfrage schaust Du dann nach ob die Konstante "gesetzt" ist wobei der Inhalt 0 als "nicht gesetzt" betrachtet wird.
In der Programmiersprache C gibt es ähnliche Konstrukte über #define und #ifdef. Das was Du hier siehst ist etwas gleichwertiges unter BASCOM.

Weiter:
Also wenn ich "frequenz = &b1000000000000000" ist das gesetzte Bit ja verschwunden. Ist das für immer Verloren, oder macht es sich noch wo anders breit?

Verstehe ich nicht. Was machst Du mit frequenz? Ja, wenn Du wie unten in Deinem Code frequenz "verundest" dann ist die ursprüngliche Information futsch weil Du schreibst ja "frequenz = frequenz AND irgendwas". Die BitOperation wird direkt auf der Variable Frequenz durchgeführt und ist nicht reversibel! War das Deine Frage?
 
Ups, ja, etwas unglücklich geschrieben:

Wenn ich 100000000 gesetzt habe, und den ganzen Spass um 1 (oder 4) Stellen nach links schiebe (Shift Frequenz , Left , 4), was passiert dann mit dem Bit, welches 4Stellen weiter nach links ist ? Das ist ja zu groß für die Variable.

Wird das in irgendein "Überlaufregister" geschrieben?
Aber ich denke da nichts vorher festgelegt wurde, sind die Bits weg, verloren.
 
Uffff, Du kannst Fragen stellen :p

Ich spreche jetzt nur erstmal aus meiner Erfahrung bzgl. Assembler Programiererei. Ich hab den AVR noch nicht viel in Assembler programmiert abe rich gehe davon aus, dass hier die grundlegenden Methoden der Digital- und Mikroprozessortechnik auch greifen.

Also, was weiß ich zu Deiner Frage:

Es ist üblicher Weise so, dass Du bei Shift-Operationen die Bits "oben" jeweils in Schieberichtung ins Nirvana schiebst. Von unten werden in der Regel Nullen nachgeschoben. Aber, Nirvana ist keineswegs Nirvana denn da gibt es in den Prozessoren das schöne und geschätzte Carry-Flag oder Carry-Bit, egal wie Du es nennen magst. Carry auf jeden Fall.
Carry zeigt an, was aus dem Register gerade ins Nirvana geschoben wurde. Carry wird bei vorzeichenbehafteten Operationen in der Regel dann weiter dazu verwendet um Vorzeichenkorrekturen bei Umrechungen / Operationen durchzuführen. Das geht dann in Richtung Einerkomplement und Zweierkomplement und ist nackte Binärarithmetik.
Du kannst Dir merken dass das "weggeschobene" Bit bei Shift-Operationen im Carry landet. Schiebst Du nochmal geht der alte Inhalt für immer verloren und das neue geschobene Bit landet wieder im Carry-Flag.

Verstanden?

Nun verwendest Du zum Schieben ja BASCOM und Du schiebst nicht nur einmal sondern 4x, ja und da würde ich sagen futsch is futsch :D
Soweit mir bekannt hat BASCOM kein Carry implementiert in dem Du das letzte geschobene Bit wieder abholen kannst. Ich kann Dir jetzt auch aus dem Stand icht genau sagen was BASCOM exakt aus dem Shift-Statement in Assembler nachbastelt. Das könnte ich mir mal in einer ruhigen Minute ansehen. Einfach mal das Shift-Statement auf eine Variable ansetzen und den erzeugten Code nach dem compilieren (HEX-File) mal in das AVR-Studio laden und disassemblen. Dann kannst Du Dir das ansehen. Wenn BASCOM sauber bei 4x linksshift hier wirklich saubere 4 Assembler-Befehle auf ein Register erzeugt so kannst Du direkt nach dem BASCOM-Shift-Befehl den Inhalt des Carry auslesen und schauen was wensigstens das letzte Bit war. Dazu wirst Du aber auf Assembler Ebene ausweichen müssen da BASCOM sicherlich keine entsprechenden Funktionen zur Verfügung stellt.

Ich bin mir auch nicht sicher ob man auf das Carry direkt zugreifen kann. Normaler Weise kann man Carry nur setzen und löschen oder in eine Variable schieben. Du wirst also den Umweg gehen müssen und zur Auswertung des Carry dieses zuerst in eine Variable schieben.

Lange Rede kurzer Sinn - Fazit also:

Aus BASCOM BASIC Sicht ist Deine Frage mit NEIN zu beantworten. Wenn Du allerdings in BASCOm Inline-Assembler verwenden möchtest so kannst Du Deine Shift-Operationen selbst durchführen, Carry-Flag abhängig irgendwo hinspringen oder nach Shift das Carry in ein anderes Register schieben.

Oh jeeeeeeh, ich sehe schon wieder Deine Augen :meeting: Harter Tobak, gell.
Hilft nix, Du hast gefragt und jetzt musst Du durch :)

Wenn Du mehr zu Carry wissen magst dann geh mal in die BASCOM-Hilfe und gebe Carry ein. Dir wird dann die gesamte Mnemonic gezeigt be der Carry eine Rolle spielt. Es gibt bei den AVR's auch den Rotate-Befehl. Der funktioniert auch über Carry usw...... ja schon gut, ich halte die Klappe .... schaus Dir einfach selbst an .

Liebe Grüßle und schönen Abend,
Ma
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)