PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bascom Nur bestimmte Array-Daten senden - möglich?



stardust19322
13.12.2017, 17:09
Hallo BASCOM-Freunde,

Ich möchte mehrere Digitalpoti per SPI ansteuern. Soweit so gut, habe ich das auch mittlerweile schon gut im Griff.
Das Problem ist jedoch der Datensatz.
Ich kann immer nur Daten aus einem Array ab einer bestimmten vordefinierten Stelle senden, aber keine expliziten.

Als Beispiel:

SPIOUT Var1(2) , 2

Damit werden 2 Bytes aus dem Array der Variable Var gesendet, und zwar die 2te und die 3te.
Soweit so gut.
Nun möchte ich aber gern, z.B. nur die 1te, die 2te, noch mal die 1te und 2te, dann die 5te und 6te senden.
Ist so etwas möglich?

Bei der Kaskadierung der Poti's müssen leider immer zusammenhängende Datenblöcke gesendet werden, da sonst der CS-Ausgang wieder auf Low zieht und die Übertragung beendet wird. Alle weiteren Poti gehen quasi "leer" aus und bekommen vom vorangegangenen Poti nur Nullen.


Meine Frage daher:
Ist es möglich, nur bestimmte Array-Zeilen zu senden oder bin ich fest daran gebunden, dass ich immer nur ab einem bestimmten Punkt alle nachfolgenden Daten senden muss?


Liebe Grüße

Maik

stardust19322
14.12.2017, 16:51
Hallo,

ich glaube, ich habe eine Lösung gefunden. Fiel mir beim Schreiben einer Email ein.

Vielleicht ist es ja möglich, für alle Poti's das gesamte Array zu senden, ohne einzelne Teile aus einem großen Array rauszupicken, und zwar indem ich die Daten im Array selbst verändere.
Als Ausgangsbasis liegt ja Folgendes zu Grunde:


Do

Poti(1) = &B00010011 'Kommandobyte für Poti1
Poti(2) = Variable1 'Stellwert für Poti1
Poti(3) = &B00010011 'Kommandobyte für Poti2
Poti(4) = Variable2 'Stellwert für Poti2
usw.ff

SPIOUT Poti(1) , 4

Loop


Meine Gedanken gehen nun in die Richtung, dass ich das Array im Grunde so belasse, nur neue Variablen und eine kleine Wahrheitstabelle hinzufüge, in etwa so:


Do

Poti(1) = Kommando1
Poti(2) = Variable1
Poti(3) = Kommando2
Poti(4) = Variable2
usw.ff

If Ereignis1 = 1 then Kommando1 = &B00010011 Else Kommando2 = &B00010000
If Ereignis2 = 1 then Kommando2 = &B00010011 Else Kommando2 = &B00010000

SPIOUT Poti(1), 4

Loop

Was denkt ihr? Würde das so funktionieren?


LG - Maik

Siro
15.12.2017, 07:29
Hallo Maik,

Du hast uns leider nicht verraten welches Digitalpoti Du benutzt,
wenn es aber eines mit DataIn und DataOut ist, dann wird die CS Leitung auf Low gelegt,
dann schiebst Du generell "ALLE" Daten, für ALLE Potis hintereinander aus und dann wird das CS wieder auf High gelegt.
Bei der steigenden Flanke an CS werden dann die Daten von allen Potis übernommen.
Hier musst Du die Reihenfolge in deinem Array entsprechend berücksichtigen.
Das erste Byte ist dann für das letzte Poti, da dieses ja als erstes ausgeschoben wird und dann immer weitergereicht wird,
bis es am letzten Poti angekommen ist.
Zum Verändern eines Potis brauchst Du dann nur das entsprechende Byte in deinem Array ändern, beim nächsten
Ausschiebevorgang wird es dann entsprechend übernommen.

Somit ist deine Idee soweit richtig. Wie das in BASCOM aber aussieht weis ich nicht, pin Pascaller :-)

Siro

stardust19322
15.12.2017, 21:39
Hallo Siro,

deine Annahme war richtig. Die Poti haben einen Data-In und einen Data-Out. Es geht dabei speziell um die MCP42010.
Wie das Senden der Daten via SPI erfolgt, ist mir mittlerweile, nachdem ich das Datenblatt bestimmt 6mal gewälzt habe, nun auch geläufig ^^. Mein Englisch ist halt gerade so ausreichend für das Nötigste...
Ein Testprogramm für 2 dieser Poti habe ich eben noch geschrieben - ging sogar verdammt zügig, da ich nicht jedes Mal ein neues Array erstellen musste.
Mittlerweile werde ich mit den Arrays auch richtig warm. Habe bis Dato halt immer ohne geschrieben ^^.

Morgen probiere ich das Programm einmal aus.
Bin mir im Moment nur nicht ganz sicher, ob die Command-Variablen in der Debounce-Subroutine richtig sind. Werde ich morgen aber sehen. Wenn nicht, dann wandern die halt ins Hauptprogramm ^^.


$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 40
$swstack = 32
$framesize = 60

Config Portb = Output
Config Portd = Input
Portd = 255

Config Spi = Soft , Dout = Portb.1 , Ss = Portb.2 , Clock = Portb.3
Spiinit

Dim A As Byte , Command1 As Byte , Command2 As Byte , Senddata(4) As Byte , Data1 As Byte , Data2 As Byte
Dim M1 As Bit

M1 = 0

Declare Sub Links
Declare Sub Rechts
Declare Sub Pushbutton
Declare Sub Powerbutton

' ********************************
' **** Main Program ****
' ********************************

Do


' ---------------------------
' SPI-Dataoutput for MCP42010
' ---------------------------

Senddata(1) = Command1
Senddata(2) = Data1
Senddata(3) = Command2
Senddata(4) = Data2

Spiinit

Spiout Senddata(1) , 4


' ----------------
' Querying Encoder
' ----------------

A = Encoder(pind.2 , Pind.3 , Links , Rechts , 0)


' --------------------
' Querying Pushbuttons
' --------------------

Debounce Pind.4 , 0 , Encoderbutton , Sub
Debounce Pind.5 , 0 , Powerbutton , Sub

Loop


Links:

If M1 = 0 Then Incr Data1
If M1 = 1 Then Incr Data2
If Data1 = 255 Then Data1 = 254
If Data2 = 255 Then Data2 = 254

Return


Rechts:

If M1 = 0 Then Decr Data1
If M1 = 1 Then Decr Data2
If Data1 = -1 Then Data1 = 0
If Data2 = -1 Then Data2 = 0

Return


Encoderbutton:

Toggle M1
If M1 = 0 Then
Command1 = &B00010011
Command2 = &B00010000
Elseif M1 = 1 Then
Command1 = &B00010000
Command2 = &B00010011
End If

Return


Powerbutton:
nop
Return


End


MFG - Maik