Spiout() erwartet als zweiten Parameter die Anzahl der zu sendenden Bytes, da muss also jeweils 1 hin und nicht 2 oder 3.
Kannst Dir doch selbst denken, dass Du keine 2 oder 3 Bytes schicken kannst, wenn die Variable nur 1 Byte enthält.
Werbung
Spiout() erwartet als zweiten Parameter die Anzahl der zu sendenden Bytes, da muss also jeweils 1 hin und nicht 2 oder 3.
Kannst Dir doch selbst denken, dass Du keine 2 oder 3 Bytes schicken kannst, wenn die Variable nur 1 Byte enthält.
okay, aber wie kann ich es realisieren, dass der expander 1 das byte expander1, der expander 2 das byte expander2 , usw. erhält. wenn ich alle auf eins setze, bekommen doch alle expander die selben daten, oder??
Wenn die Expander in serie (1, 2, 3) geschaltet sind, musst du (z.B)
Code:DIM Expander1 as Byte ' daten für expander 1 DIM Expander2 as Byte ' daten für expander 2 DIM Expander3 as Byte ' daten für expander 3 spiout Expander3, 1 ' exp3 daten im expander 1 spiout Expander2, 1 ' exp2 daten im expander 1 ==> exp3 daten im expander 2 spiout Expander1, 1 ' exp1 daten im expander 1 ==> exp2 daten im expander 1 ==> exp3 daten im expander 3
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
[/QUOTE]Code:DIM Expander1 as Byte ' daten für expander 1 DIM Expander2 as Byte ' daten für expander 2 DIM Expander3 as Byte ' daten für expander 3 spiout Expander3, 1 ' exp3 daten im expander 1 spiout Expander2, 1 ' exp2 daten im expander 1 ==> exp3 daten im expander 2 spiout Expander1, 1 ' exp1 daten im expander 1 ==> exp2 daten im expander 1 ==> exp3 daten im expander 3
Habe das probiert....
Wenn ich das so in meinen µC lade, dann habe ich auf allen drei Expandern das selbe Byte.
Wenn ich nur zwei expander betrieibe und dann
spiout expander1 , 1
spiout expander2 ,2
im code schreibe, erscheinen alle bits richtig auf den beiden expandern.
bei
spiout expander1 , 1
spiout expander2 , 2
spiout expander3 , 3
geben die ersten beiden expander die richtigen bytes und der dritte zeigt mir das byte vom ersten expander.
wieso ist das so?
Wenn die 4094-er richtig in serie geschaltet sind, ist der Effekt sehr seltsam.
Ich denk, du must dein komplettes Programm herzeigen, da ist irgendwo der Wurm drin
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
okay =)
kein Problem... der Code ist noch nicht fertig, daher sind einige deklarierte Variablen noch "unbenutzt" , nicht wundern =)
Außerdem wird das Projekt später auf einem Mega32 laufen, das tut aber jetzt nichts zur Sache.
los gehts:
Code:$regfile = "m8def.dat" $crystal = 16000000 Baud = 19200 Config Adc = Single , Prescaler = Auto Start Adc Config Spi = Hard , Interrupt = On , Master = Yes , Clockrate = 16 Enable Spi Spiinit Dim Eingangswort As Word Dim Speicherwort As Word Dim Analogwert1 As Word Dim Analogwert2 As Word Dim Analogwert3 As Word Dim Takt As Byte Dim Takt2 As Word Dim Takt3 As Word Dim Takt4 As Word Dim Takt5 As Word Dim Folge As Byte Dim Sensortyp As Byte Dim Freigeben As Bit Dim Eingerichtet As Bit Dim Puls As Bit Dim Puls2 As Bit Dim Zweihandimpuls As Bit Dim Einganga As Byte Dim Eingangb As Byte Dim Eingangc As Byte Dim Expander1 As Byte Dim Expander2 As Byte Dim Expander3 As Byte Config Pind.0 = Input Config Pind.1 = Input Config Pind.2 = Input Config Pinc.3 = Input Config Pinc.2 = Input Config Portd.6 = Output Config Portd.7 = Output Config Portb.0 = Output Config Portc.4 = Output Sensor1a Alias Pind.0 Sensor1c Alias Pind.1 Sensor1b Alias Pind.2 Sensor1d Alias Pind.3 Einrichten Alias Pinc.3 Zweihand Alias Pinc.2 Status1 Alias Portd.6 Status2 Alias Portd.7 Status3 Alias Portb.0 Freigabe Alias Portc.4 Portd.0 = 1 Portd.1 = 1 Portd.2 = 1 Portd.3 = 1 Portc.3 = 1 Portc.2 = 1 Const Sensora1 = 0 Const Sensora2 = 1 Const Sensora3 = 2 Const Sensora4 = 3 Const Sensora5 = 4 Const Sensora6 = 5 Const Sensorb1 = 10 Const Sensorb2 = 11 Const Sensorb3 = 12 Const Sensorb4 = 13 Const Sensorc1 = 6 Const Sensorc2 = 7 Const Sensorc3 = 8 Const Sensorc4 = 9 Const Sensord1 = 14 Const Sensord2 = 15 Const Extrafreigabe = 15 Const Sensorabcd = 0 Const Sensorcaus = 1 Do Analogwert3 = Getadc(5) Analogwert3 = Analogwert3 * 20 Analogwert2 = 250 Analogwert1 = 20000 If Zweihand = 1 Then Takt3 = 0 Takt4 = 0 Takt5 = 0 Reset Zweihandimpuls Reset Freigabe Reset Folge.sensorabcd Reset Folge.sensorcaus If Einrichten = 1 Then Expander1 = 0 Expander2 = 0 End If End If For Takt = 0 To Sensortyp Incr Takt2 Select Case Takt2 Case 3000 : Set Puls Case 5500 : Set Puls2 Case 6000 : Reset Puls Case 6100 : Reset Puls2 Case 6200 : Takt2 = 0 End Select If Folge.sensorabcd = 1 Then Sensortyp = 15 Else Sensortyp = 9 End If If Eingerichtet = 0 Then Debounce Einrichten , 1 , Einrichtstatus , Sub If Einrichten = 0 Then Reset Freigabe Reset Zweihandimpuls Reset Eingerichtet Expander1 = Low(speicherwort) Expander2 = High(speicherwort) Debounce Sensor1a , 0 , Aktiv1a , Sub Debounce Sensor1b , 0 , Aktiv1b , Sub Debounce Sensor1c , 0 , Aktiv1c , Sub Debounce Sensor1d , 0 , Aktiv1d , Sub Else Debounce Zweihand , 0 , Zweihandaktiv , Sub If Zweihand = 0 And Freigeben = 1 And Takt3 > Analogwert1 Then Set Folge.sensorabcd End If If Takt = 0 Then Set Freigeben Eingangswort.sensora1 = Not Sensor1a Eingangswort.sensorb1 = Not Sensor1b Eingangswort.sensorc1 = Not Sensor1c If Einrichten = 1 Then If Zweihand = 0 And Freigabe = 1 And Folge.sensorcaus = 0 Then Incr Takt5 If Takt5 > Analogwert3 Or Folge.sensorcaus = 1 Then Set Folge.sensorcaus Eingangswort.sensorc1 = Speicherwort.sensorc1 Eingangswort.sensorc2 = Speicherwort.sensorc2 Eingangswort.sensorc3 = Speicherwort.sensorc3 Eingangswort.sensorc4 = Speicherwort.sensorc4 End If If Eingangswort.takt < Speicherwort.takt Then Incr Takt4 If Zweihand = 0 And Takt4 > Analogwert2 Then Reset Freigeben If Freigeben = 1 Then Incr Takt3 If Zweihand = 0 And Folge.sensorabcd = 0 Then Expander1 = Low(speicherwort) Expander1 = High(speicherwort) Reset Expander2.2 Reset Expander2.3 Reset Expander2.4 Reset Expander2.5 End If If Zweihand = 0 And Folge.sensorabcd = 1 Then Expander1 = Low(speicherwort) Expander2 = High(speicherwort) End If If Zweihand = 0 And Folge.sensorcaus = 1 Then Reset Expander1.6 Reset Expander1.7 Reset Expander2.0 Reset Expander2.1 End If End If If Takt = Sensortyp And Einrichten = 1 And Zweihand = 0 Then Freigabe = Freigeben End If Spiout Expander3 , 1 Spiout Expander2 , 1 Spiout Expander1 , 1 Status1 = Folge.sensorabcd Status2 = Folge.sensorcaus Next Loop End Einrichtstatus: Expander1 = 0 Expander2 = 0 Set Eingerichtet Return Zweihandaktiv: Set Zweihandimpuls Return Aktiv1a: If Speicherwort.sensora1 = 0 Then Set Speicherwort.sensora1 Else Reset Speicherwort.sensora1 End If Return Aktiv1b: If Speicherwort.sensorb1 = 0 Then Set Speicherwort.sensorb1 Else Reset Speicherwort.sensorb1 End If Return Aktiv1c: If Speicherwort.sensorc1 = 0 Then Set Speicherwort.sensorc1 Else Reset Speicherwort.sensorc1 End If Return Aktiv1d: If Speicherwort.sensord1 = 0 Then Set Speicherwort.sensord1 Else Reset Speicherwort.sensord1 End If Return
Mit dem gezeigten Code, bzw. der Variablendimensionierung bezweifle ich, dass das überhaupt "so" ist.
Wenn Du nur ein Byte hast, kannst Du keine 3 Bytes schicken, bzw. Du kannst es versuchen und wirst scheitern. Schrieb ich bereits.
Wenn die Variablen in der gezeigten Reihenfolge dimensioniert sind:
dann führt das hier:Code:DIM Expander1 as Byte DIM Expander2 as Byte DIM Expander3 as Byte
dazu, dass als erstes das Byte Expander3, als nächstes aber noch 2 nachfolgende Bytes aus dem Speicher rausgeschoben werden. Nach dem Expander3-Byte kommen aber keine weiteren sinnvollen Daten, zumindest nach den gezeigten Codefetzen zu urteilen. Du schreibst also Datenmüll in die Schieberegister.Code:spiout expander3 , 3
Wenn man Datenmüll in die Register schreibt, wird aber ganz sicher nicht das hier passieren:
Wie PicNick schrieb, zeig vollständigen und compilierbaren Code, sonst ist das ein Stochern im Nebel. Eine Beschreibung der der Verbindungen 4094 untereinander/mit dem µC, bzw. ein Schaltplan wie die 4094 tatsächlich angeschlossen sind, würde sicher auch weiterhelfengeben die ersten beiden expander die richtigen bytes und der dritte zeigt mir das byte vom ersten expander.
@MagicWSmoke:
Das mit den 3 Bytes habe ich verstanden. Das war einfach Unwissenheit von mir und ein wenig naiv zu glauben, dass es klappt. Bin halt ganz frisch in der SPI-Welt =)
Danke, trotzdem.
Das es so ist, wie ich es beschrieben habe, kannst du mir glauben. Die ganze Zeit habe ich überlegt, wieso das Byte, das an Expander1 ansteht auch an Expander3 auftaucht. Eine sinnvolle Erklärung dazu habe ich auch nicht, sonst hätte ich weniger Probleme eine Lösung zu finden.
Ersteinmal danke ich euch, dass ihr mir bei meinem Problem helft. Das ist nicht selbstverständlich! Danke.
Ich werde mal schnell einen Schaltplan von meiner 4094-er Verschaltung anfertigen....
An Deiner Stelle würde ich den Code auf ein Minimum reduzieren, also die reine SPI-Ausgabe mit einem Delay danach. Sonst kannst Du Seiteneffekte aus dem anderen Code nicht ausschließen. Auch würde ich über ein vernünftiges Einrücken nachdenken, der Code ist im Moment unübersichtlich.
Du brauchst auch kein Interrupt = On und Enable SPI, da Du keinen Interrupt verwendest. Und eine Stack- und Framedefinition im Code wär' sinnvoll.
Teste das dann mal in dieser Weise:
Code:' ... Dim Expdr(3) As Byte Expdr(1) = &b10101010 Expdr(2) = &b11110000 Expdr(3) = &b00001111 Do Spiout Expdr(1) , 3 ' ...
Lesezeichen