- fchao-Sinus-Wechselrichter AliExpress         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 29

Thema: Portexpander mit Schieberegister 4094

  1. #11
    Benutzer Stammmitglied
    Registriert seit
    09.01.2012
    Beiträge
    75
    Anzeige

    E-Bike
    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
    [/QUOTE]

    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?

  2. #12
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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.

  3. #13
    Benutzer Stammmitglied
    Registriert seit
    09.01.2012
    Beiträge
    75
    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

  4. #14
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von pete1612 Beitrag anzeigen
    wieso ist das so?
    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:
    Code:
    DIM Expander1 as Byte
    DIM Expander2 as Byte
    DIM Expander3 as Byte
    dann führt das hier:
    Code:
    spiout expander3 , 3
    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.

    Wenn man Datenmüll in die Register schreibt, wird aber ganz sicher nicht das hier passieren:
    geben die ersten beiden expander die richtigen bytes und der dritte zeigt mir das byte vom ersten expander.
    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 weiterhelfen

  5. #15
    Benutzer Stammmitglied
    Registriert seit
    09.01.2012
    Beiträge
    75
    @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....

  6. #16
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    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
    ' ...

  7. #17
    Benutzer Stammmitglied
    Registriert seit
    09.01.2012
    Beiträge
    75
    Hier der Schaltplan:
    Klicke auf die Grafik für eine größere Ansicht

Name:	Portexpander mit 4094.jpg
Hits:	35
Größe:	30,4 KB
ID:	21134

  8. #18
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Warum Q'S ?
    Laut DB:
    The output of the last stage (QS) can be used to cascade several devices.

  9. #19
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Wirklich Pete, mach das, was @MagicWSmoke vorschlägt. Die Inhalte der Expanderbytes sind ja von einer Menge Code abhängig, und nur dann vorhersagbar, wenn das alles auch fehlerfrei ist.

    Folgendes ist aufgefallen:
    Code:
    If Zweihand = 0 And Folge.sensorabcd = 0 Then
    Expander1 = Low(speicherwort)                        ' ZEILE  157
    Expander1 = High(speicherwort)                       ' ZEILE  158
    Reset Expander2.2
    ...
    zweimal Expander1 ?

    Expander3 wird nicht gesetzt, ist also offenbar immer NULL. heisst das bei dir, DIe LED's leuchten oder sind sie da finster ?

    Ich hab nach den 3 SPIOUT kein Strobe gesehen ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  10. #20
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Warum Q'S ?
    Beim Zeus, da hat der Mann recht. Auf diese Art ist Müll gesichert. Du musst QS nehmen
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Ähnliche Themen

  1. Portexpander an SPI
    Von chientech im Forum Elektronik
    Antworten: 2
    Letzter Beitrag: 13.02.2011, 17:29
  2. I²C-Portexpander-LED-Modul
    Von Pr0gm4n im Forum Robby RP6
    Antworten: 1
    Letzter Beitrag: 11.05.2008, 23:21
  3. LCD mit Portexpander
    Von davebastard im Forum C - Programmierung (GCC u.a.)
    Antworten: 11
    Letzter Beitrag: 15.06.2007, 18:00
  4. Antworten: 3
    Letzter Beitrag: 20.03.2007, 09:51
  5. 4094 manuell mit Tastern steuern
    Von Bastler5 im Forum Elektronik
    Antworten: 4
    Letzter Beitrag: 01.02.2006, 13:02

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests