Forum: Mikrocontroller und Digitale Elektronik Bascom: SPI & String


von tec (Gast)


Lesenswert?

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

von Rahul D. (rahul)


Lesenswert?

Das SPI ist byte orientiert.
Dein String braucht also nur 3 (in Worten "drei") Bytes lang sein.

von Michael U. (Gast)


Lesenswert?

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

von tec (Gast)


Lesenswert?

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

von Sebastian Heyn (Gast)


Lesenswert?

du musst den string erst umwandeln, in ein array von bytes

von tec (Gast)


Lesenswert?

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

von Michael U. (Gast)


Lesenswert?

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

von tec (Gast)


Lesenswert?

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

von Michael U. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.