Hallo, ich will mit einem Mega 8 eine PLL mit SPI Interface Programmieren. Dazu muss ich nacheinander vier 24Bit Lateches über die SPI Schnittstelle laden. Die SPI-Schnittstelle konnte ich soweit zum Laufen bringen. Es tritt jedoch das Problem auf, dass scheinbar nur ein Bit der 24Bit Folge gesendet wird. Hier mein Testcode: ... Dim S As String * 24 s="101010101010101010101010" spiout s , 24 ... Ich habe den Inhalt von s auch auf einem LCD ausgegeben, der String müsste also korrekt sein. Kann mir jemand helfen? Gruß Malte
Das SPI ist byte orientiert. Dein String braucht also nur 3 (in Worten "drei") Bytes lang sein.
Hallo, ich habe mit BasCom nichts am Hut, aber SPI sendet Bytes, keine Bits. Ein String mit Nullen und Einsen ist eine ASCII-Darstellung von Text, 24Byte sind 24*8 Bit, also 192 Bit. Eine 1 als ASCII-Interpretation ist 0b00110001, welches Bit soll SPI da also senden? Benutzt Du Hard- oder Software-SPI? Stimmt der SPI-Mode, den der PLL-Chip benutzt, mit dem des Mega8 überein? Fragen über Fragen... PS: ich schaue bei solchen Fragen ganz gern mal ins BasCom-Handbuch, auch wenn ich es nicht benutze. Ich habe selten ein so unsysthematisches und unvollständiges Handbuch gesehen, wie das von BasCom. Gruß aus Berlin Michael
Hallo, vielen Dank für die Antworten! Ich benutze die Soft SPI Funktion von Bascom. Ich habe mein Programm jetzt umgeändert und sende nacheinander drei Bytes. Nun scheint die Übertragung zu funktionieren. Leider lockt die PLL noch nicht. Ich muss nun wieder checken, ob ich die richtige Bitfolge aus dem Datenblatt gewählt habe, denn die Einstellmöglichkeiten sind sehr umfangreich. Weiterhin muss ich noch abklären wie die Bits mit der SPIOUT Funktion herausgeklockt werden. Laut Datenblatt muss ich mit dem MSB des 24Bit Lateches anfangen. (PLL: adf4112) Gruß Malte
Hallo nochmal, ich habe leider keinen Logic Analyzer o.Ä. da. Ich bin mir jedoch nicht sicher wie ein Byte auf den Bus übertragen wird. Momentan lade ich ich die benötigten Bits für das Latch der PLL in drei Bytes: Dim A(1) as Byte Dim B(1) as Byte Dim C(1) as Byte A(1) = &b10100001 ... spiout A(1),1 ... Soweit ich beurteilen kann wird zuerst das höchstwertige Bit auf den Bus gelegt. Kann mir das jemand bestätigen? Gruß Malte
Hallo, woher sollen wir das wissen??? Sie werden so rausgeschoben, wie Du es mit CONFIGSPI festgelegt hast. BasCom-Handbuch Seite 353. Wie Hardware-SPI funktioniert steht ab Seite 113 des BasCom-Handbuchs und im Datenblatt des Mega8. Fragen ist offenbar merklich einfacher, als lesen... Gruß aus Berlin Michael
Hallo, ich wundere mich immer wieder über den Umgangston. Es gibt nicht immer nur Profis, sondern auch Anfgänger. Un wenn die BASCOM Hilfe richtig liest wird man feststellen, dass man im Softmode nicht einstellen kann ob zuerst das MSB oder das LSB herausgeklockt wird. Diese Einstellung funktioniert nur im Hardware-Mode. Ich suche leider schon den ganzen Tag warum die PLL nicht lockt. Gibt es jemanden der sich mit dem Baustein auskennt? Die Probleme mit dem SPI Interface müssten gelöst sein. Jetzt muss es an den Latch-Einstellungen liegen. Gruß Malte
Hallo, Deine erste Freagestellung hinterlässt nunmal den Eindruck, als ob Du Dich garnicht erst mit Funktion und Ablauf von SPI und BasCom auseinandergesetzt hast... Im Datenblatt der PLL steht nichts von SPI (wenn ich es auf die Schnelle nicht übersehen habe), nur von seriellem Interface. Die PLL übernimmt laut Timing-Diagramm mit der steigenden Flange von Clock. Solche ICs takte ich normalerweise lieber zu Fuß, bevor ich ewig damit zubringe, einen evtl. passenden SPI-Mode zu finden. In Assembler wäre es mit wenigen Zeilen erschlage, wie es in BasCom mit Bit-Schiebereien aussieht, weiß ich nicht.
1 | ;*************************************************************************** |
2 | ; Sendet 32 Bit aus PLL_DATA_0...PLL_DATA_3 an die PLL |
3 | ; |
4 | ; Scratch-Reg: ZH, ZL, YH, YL |
5 | ;*************************************************************************** |
6 | |
7 | send_pll_daten: |
8 | lds PLL_DATA_3,PLL_CTRL |
9 | lds PLL_DATA_2,PLL_REF |
10 | lds PLL_DATA_1,PLL_DIV_H |
11 | lds PLL_DATA_0,PLL_DIV_L |
12 | |
13 | ldi TEMP_A,32 ; Anzahl der Bits |
14 | |
15 | sbi TUNER_OUT,TUNER_CE ; auf H zum Schreiben |
16 | |
17 | ldi TEMP_B,(CYCLES_PER_US*15)/2 |
18 | |
19 | send_pll_daten_wait: |
20 | dec TEMP_B |
21 | brne send_pll_daten_wait |
22 | |
23 | send_pll_daten_loop: |
24 | ror PLL_DATA_3 |
25 | ror PLL_DATA_2 |
26 | ror PLL_DATA_1 |
27 | ror PLL_DATA_0 |
28 | |
29 | brcs send_pll_daten_h |
30 | cbi TUNER_OUT,TUNER_DA ; 0 raus |
31 | rjmp send_pll_daten_clock |
32 | |
33 | send_pll_daten_h: |
34 | sbi TUNER_OUT,TUNER_DA ; 1 raus |
35 | |
36 | send_pll_daten_clock: |
37 | cbi TUNER_OUT,TUNER_CK ; Clock H |
38 | nop |
39 | sbi TUNER_OUT,TUNER_CK ; Clock L |
40 | |
41 | dec TEMP_A |
42 | brne send_pll_daten_loop ; weiter nächstes Bit |
43 | |
44 | cbi TUNER_OUT,TUNER_CE ; auf L zum Übernehmen |
45 | |
46 | ret |
Wird Dir vermutlich nicht helfen, andere PLL, für Deinen Chip unnütze Warteschleifen drin usw. usw. Keine Ahnung, ob man das nötige in BasCom nachbauen kann... Gruß aus Berlin Michael
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.