- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 6 von 6

Thema: Problem mit Max7219!!

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    15.01.2006
    Beiträge
    80

    Problem mit Max7219!!

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,
    habe ein Problem mit 2 Max7219. Ich habe diese Kaskadiert. Den ersten kann ich ohne Probleme ansteuern. NUR den 2. kann ich auch ohne Probleme ansteuern, aber wenn ich beide zusammen nutzen will klappt das nicht.

    In meinem Beispiel sollen jeweils 4 Anzeigen zu testzwecken 1111,2222 und 3333 anzeigen.

    Wenn ich das jetzt laufen lasse macht er mir die ersten 4 anzeigen vom ersten MAx auf 1111, dann macht er mir die ersten 4 anzeigen vom zweiten max auf 2222. Und dann macht er die letzten vier vom erstne max auf 3333.
    So und jetzt das problem wenn jetzt die ersten 4 stellen des ersten max beschrieben werden setzt er mir die ersten 4 vom 2.Max auch auf 1111!

    Was kann das sein, habe ich da einen fehler im prog??

    zur Info:
    Ich habe bei mri im Programm die Variablen Max7219nr um zu deklarieren welchen er kontaktieren soll. und eine Variable Adresse, mit der ich sage wo die 4 Stellen anfangen! Also bei 1 wären es die ersten 4 stellen und bei 5 die letzten 4 stellen des jeweiligen max!

    Achso und dann habe ich noch ein Problem bei der Initialisierung, wenn ich da den Segment test machen will klappt das auch nur wenn ich das nacheinander mache, ich müsste doch eigenltich beide max auf test stellen können und dann beide wieder zurück, oder??

    Dank euch schonmal

    cu Marco


    Code:
    $regfile = "m16def.dat"
    $crystal = 16000000
    $baud = 9600
    $hwstack = 128
    $swstack = 128
    $framesize = 128
    Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
    Open "Com1"
    
    '----------------------------------- Ports definieren ------------------------------------------------
    
    Config Portb.4 = Output
    Config Portc = Output
    Config Portd = Output
    Set Portb.4
    
    '--------------------------------- Variablen Definieren ----------------------------------------------
    
    Dim Adctemp As Integer , Adcdruck As Integer , Volt1 As Integer , Volt2 As Integer , Volt3 As Integer , Volt4 As Integer
    Dim Ist As Integer , Ist2 As Integer , Istwert As Integer
    Dim Tempwert As Word , Maxwert As Integer , Minwert As Integer , Differenz As Word
    Dim Abstand As Word , Temperatur As Integer , Temp_str As String * 10 , Istdruck As Word , Druck_str As String * 10
    Dim Spannung As Long , Spg_str As String * 10 , S As String * 10 , Helligkeit As Byte
    Dim 7seg_string As String * 10 At &HC0
    Dim 7seg_1 As Byte At &HC0 Overlay
    Dim 7seg_2 As Byte At &HC1 Overlay
    Dim 7seg_3 As Byte At &HC2 Overlay
    Dim 7seg_4 As Byte At &HC3 Overlay
    Dim 7seg_5 As Byte At &HC4 Overlay
    Dim Max7219nr As Byte At &HD0
    Dim Adresse As Byte , Dezimalpunkt As Byte
    Dim 7segment As Word At $b0 Overlay
    Dim 7seg_adr As Byte At $b1 Overlay
    Dim 7seg_wert As Byte At $b0 Overlay
    Dim Noop As Word
    Dim Init As Byte
    
    '----------------------------------- Subs declarieren ------------------------------------------------
    
    Declare Sub Max7219datenout(d As Word)
    Declare Sub 7segment_aufbereitung
    Declare Sub Temp
    Declare Sub Druck
    Declare Sub Ausser_bereich
    Declare Sub Spannung
    Declare Sub Noop
    
    
    '--------------------------- Initialisiere ADC und starte ADC ----------------------------------------
    
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    Start Adc
    
    
    '------------------------------- Initialisierung MAX7219 --------------------------------------------
    
    7_en Alias Portd.3                                          ' Chip Enable für MAX7219
    7_clk Alias Portd.4                                         ' Clock für MAX7219
    7_data Alias Portd.2                                        ' Data für MAX7219
    Init = 0
    Noop = &H0000
    
    Do
    Incr Init
    If Init = 1 Then Max7219nr = 1
    If Init = 2 Then Max7219nr = 2
    7segment = &H0C01                                           ' Register 0C = Shutdown
    Call Max7219datenout(7segment)                              ' übertrage Register zum Max7219
    7segment = &H09FF                                           ' Register 09 = Decode Mode
    Call Max7219datenout(7segment)                              ' übertrage Register zum Max7219
    7segment = &H0A0F                                           ' Register 0A = Intensität(Helligkeit) der Anzeige
    Call Max7219datenout(7segment)                              ' übertrage Register zum Max7219
    7segment = &H0B07                                           ' Register 0B = Scan Limit (Anzahl der 7-Segmentanzeigen)
    Call Max7219datenout(7segment)                              ' übertrage Register zum Max7219
    Loop Until Init = 2
    
    'Max7219nr = 1
    '7segment = &H0F01                                           ' Register 0F = Display Test Alle Digits einschalten
    'Call Max7219datenout(7segment)                              ' übertrage Register zum Max7219
    'call Max72192datenout(7segment)                            ' übertrage Register zum Max7219
    'Wait 5                                                      ' alle digits eine sekunde an
    'Max7219nr = 1
    '7segment = &H0F00                                           ' Register 0F = Display Test alle digits aus
    'Call Max7219datenout(7segment)                              ' übertrage Register zum Max7219
    'Call Max72192datenout(7segment)                             ' übertrage Register zum Max7219
    
    
    
    'Max7219nr = 2
    '7segment = &H0F01                                           ' Register 0F = Display Test Alle Digits einschalten
    'Call Max7219datenout(7segment)                              ' übertrage Register zum Max7219
    'Wait 5
    'Max7219nr = 2
    '7segment = &H0F00                                           ' Register 0F = Display Test alle digits aus
    'Call Max7219datenout(7segment)                              ' übertrage Register zum Max7219
    
    
    '----------------------------------- Hauptschleife ------------------------------------------------
    
    Do
    Cls
    
    
        Max7219nr = 1
        Adresse = 1
        7seg_string = "1111"
        Call 7segment_aufbereitung
     Wait 2
    
        Max7219nr = 2
        Adresse = 1
        7seg_string = "2222"
        Call 7segment_aufbereitung
    Wait 2
    
        Max7219nr = 1
        Adresse = 5
        7seg_string = "3333"
        Call 7segment_aufbereitung
    Wait 2
    
    Loop
    End
    
    
    
    '-------------------------------Sub MAX7219 Datenübergabe --------------------------------------------
    
    Sub Max7219datenout(d As Word)
    
    7_en = 0                                                    ' Chip Select bzw enable auf Low (Daten werden verarbeitet)
    Shiftout 7_data , 7_clk , D , 1 , 16                        'Daten ausgeben
       If Max7219nr = 2 Then Call Noop                          'wenn max7219 angesprochen wird springe sofort zum ende,
    
    7_en = 1                                                    ' Chip Select bzw Enable auf High (daten werden nicht verarbeitet)
    
    
    End Sub
    
    '-------------------------------Sub Noop----------------------------------------------
    
    Sub Noop
      Shiftout 7_data , 7_clk , Noop , 1 , 16                   'an sonsten übertrage noop damit der richtige Max angesprochen wird
     End Sub
    
    '-------------------------------Sub 7-Segment Aufbereitung----------------------------------------------
    
    Sub 7segment_aufbereitung
    'Wert 46 = Dezimalpunkt , Wenn Abfrage Auf Dezimalpunkt Ok Den Wert Davor Um 128 Addieren Und Die Anderen Werte Eine Stelle Vorücken
       If 7seg_2 = 46 Then
          7seg_1 = 7seg_1 + 128
          7seg_2 = 7seg_3
          7seg_3 = 7seg_4
          7seg_4 = 7seg_5
       End If
    
       If 7seg_3 = 46 Then
          7seg_2 = 7seg_2 + 128
          7seg_3 = 7seg_4
          7seg_4 = 7seg_5
       End If
    
       If 7seg_4 = 46 Then
          7seg_3 = 7seg_3 + 128
          7seg_4 = 7seg_5
       End If
    
    'Wert 32 = Leerzeichen wert 160 = leerzeichen + Dezimalpunkt, wenn abfrage ok dann wert um 17 verringern um ein leerzeichen anzuzeigen ansonsten alle werte minus 48 damit alle werte rictig nagezeigt werden
       If 7seg_1 = 32 Or 7seg_1 = 160 Then
          7seg_1 = 7seg_1 - 17
       Else
         7seg_1 = 7seg_1 - 48
       End If
    
       If 7seg_2 = 32 Or 7seg_2 = 160 Then
          7seg_2 = 7seg_2 - 17
       Else
         7seg_2 = 7seg_2 - 48
       End If
    
       If 7seg_3 = 32 Or 7seg_3 = 160 Then
          7seg_3 = 7seg_3 - 17
       Else
         7seg_3 = 7seg_3 - 48
       End If
    
       If 7seg_4 = 32 Or 7seg_4 = 160 Then
          7seg_4 = 7seg_4 - 17
       Else
         7seg_4 = 7seg_4 - 48
       End If
    
    
    7seg_adr = Adresse
    7seg_wert = 7seg_1
    Call Max7219datenout(7segment)                              ' übertrage Register zum Max7219
    
    7seg_adr = 7seg_adr + 1
    7seg_wert = 7seg_2
    Call Max7219datenout(7segment)                              ' übertrage Register zum Max7219
    
    
    7seg_adr = 7seg_adr + 1                                     'Adresse + 3
    7seg_wert = 7seg_3
    Call Max7219datenout(7segment)                              ' übertrage Register zum Max7219
    
    
    7seg_adr = 7seg_adr + 1
    7seg_wert = 7seg_4
    Call Max7219datenout(7segment)                              ' übertrage Register zum Max7219
    
    
    End Sub

    EDIT:
    So also faul war ich in der zwischenzeit auch nicht, habe nochmal ein paar tests gemacht. Und zwar habe ich das programm soweit verändert das mir alles angezeigt wird was wichtig ist.
    wenn zwischen enable=0 und enable =1 ein noop steht heist das das die noop routine durchlaufen wurde und somit der 2. chip angesprochen wird. Und wenn da nur enable=0 und als nächstes enable =1 steht wurde die noop routine nicht durchlaufen, also wird der erste chip angsprochen
    hier mal das programm.

    Code:
    $regfile = "m16def.dat"
    $crystal = 16000000
    $baud = 9600
    $hwstack = 128
    $swstack = 128
    $framesize = 128
    Config Com1 = 57600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
    Open "Com1"
    
    '----------------------------------- Ports definieren ------------------------------------------------
    
    Config Portb.4 = Output
    Config Portc = Output
    Config Portd = Output
    Set Portb.4
    
    '--------------------------------- Variablen Definieren ----------------------------------------------
    
    Dim Adctemp As Integer , Adcdruck As Integer , Volt1 As Integer , Volt2 As Integer , Volt3 As Integer , Volt4 As Integer
    Dim Ist As Integer , Ist2 As Integer , Istwert As Integer
    Dim Tempwert As Word , Maxwert As Integer , Minwert As Integer , Differenz As Word
    Dim Abstand As Word , Temperatur As Integer , Temp_str As String * 10 , Istdruck As Word , Druck_str As String * 10
    Dim Spannung As Long , Spg_str As String * 10 , S As String * 10 , Helligkeit As Byte
    Dim 7seg_string As String * 10 At &HC0
    Dim 7seg_1 As Byte At &HC0 Overlay
    Dim 7seg_2 As Byte At &HC1 Overlay
    Dim 7seg_3 As Byte At &HC2 Overlay
    Dim 7seg_4 As Byte At &HC3 Overlay
    Dim 7seg_5 As Byte At &HC4 Overlay
    Dim Max7219nr As Byte At &HD0
    Dim Adresse As Byte , Dezimalpunkt As Byte
    Dim 7segment As Word At $b0 Overlay
    Dim 7seg_adr As Byte At $b1 Overlay
    Dim 7seg_wert As Byte At $b0 Overlay
    Dim Noop As Word
    Dim Init As Byte
    
    '----------------------------------- Subs declarieren ------------------------------------------------
    
    Declare Sub Max7219datenout(d As Word)
    Declare Sub 7segment_aufbereitung
    Declare Sub Temp
    Declare Sub Druck
    Declare Sub Ausser_bereich
    Declare Sub Spannung
    Declare Sub Noop
    
    
    '------------------------------- Initialisierung MAX7219 --------------------------------------------
    
    7_en Alias Portd.3                                          ' Chip Enable für MAX7219
    7_clk Alias Portd.4                                         ' Clock für MAX7219
    7_data Alias Portd.2                                        ' Data für MAX7219
    Init = 0
    Noop = &H0000
    
    Wait 5
    Print "Start Initialisierung"
    Print
    Do
    Incr Init
    If Init = 1 Then Max7219nr = 1
    If Init = 2 Then Max7219nr = 2
    7segment = &H0C01                                           ' Register 0C = Shutdown
    Call Max7219datenout(7segment)                              ' übertrage Register zum Max7219
    7segment = &H09FF                                           ' Register 09 = Decode Mode
    Call Max7219datenout(7segment)                              ' übertrage Register zum Max7219
    7segment = &H0A0F                                           ' Register 0A = Intensität(Helligkeit) der Anzeige
    Call Max7219datenout(7segment)                              ' übertrage Register zum Max7219
    7segment = &H0B07                                           ' Register 0B = Scan Limit (Anzahl der 7-Segmentanzeigen)
    Call Max7219datenout(7segment)                              ' übertrage Register zum Max7219
    7segment = &H0F01                                           ' Register 0F = Display Test Alle Digits einschalten
    Call Max7219datenout(7segment)                              ' übertrage Register zum Max7219
    Wait 2                                                      ' alle digits eine sekunde an
    7segment = &H0F00                                           ' Register 0F = Display Test alle digits aus
    Call Max7219datenout(7segment)                              ' übertrage Register zum Max7219
    Loop Until Init = 2
    
    Print "Initialisierung abgeschlossen!"
    Print "-----------------------------------------------------"
    Print
    
    '----------------------------------- Hauptschleife ------------------------------------------------
    
    Do
    
    
        Max7219nr = 1
        Adresse = 1
        7seg_string = "1111"
        Call 7segment_aufbereitung
     Wait 2
    
        Max7219nr = 1
        Adresse = 5
        7seg_string = "2222"
        Call 7segment_aufbereitung
    Wait 2
    
        Max7219nr = 2
        Adresse = 1
        7seg_string = "3333"
        Call 7segment_aufbereitung
    Wait 2
    
    Loop
    End
    
    
    
    '-------------------------------Sub MAX7219 Datenübergabe --------------------------------------------
    
    Sub Max7219datenout(d As Word)
    Print "Max7219nr: " ; Max7219nr
    Print "7-segment Adresse: " ; 7seg_adr
    Print "7-segment Wert: " ; 7seg_wert
    Print "7-segment Daten: " ; Hex(7segment)
    Print "enable=0"
    Reset 7_en                                                  ' Chip Select bzw enable auf Low (Daten werden verarbeitet)
    Shiftout 7_data , 7_clk , D , 1 , 16                        'Daten ausgeben
       If Max7219nr = 2 Then Call Noop                          'wenn max7219 angesprochen wird springe sofort zum ende,
    Set 7_en                                                    ' Chip Select bzw Enable auf High (daten werden nicht verarbeitet)
    Print "enable=1"
    Print
    End Sub
    
    
    Sub Noop
      Noop = &B0000000000000000
      Shiftout 7_data , 7_clk , Noop , 1 , 16                   'an sonsten übertrage noop damit der richtige Max angesprochen wird
      Print "noop"
     End Sub
    
    '-------------------------------Sub 7-Segment Aufbereitung----------------------------------------------
    
    Sub 7segment_aufbereitung
    'Wert 46 = Dezimalpunkt , Wenn Abfrage Auf Dezimalpunkt Ok Den Wert Davor Um 128 Addieren Und Die Anderen Werte Eine Stelle Vorücken
       If 7seg_2 = 46 Then
          7seg_1 = 7seg_1 + 128
          7seg_2 = 7seg_3
          7seg_3 = 7seg_4
          7seg_4 = 7seg_5
       End If
    
       If 7seg_3 = 46 Then
          7seg_2 = 7seg_2 + 128
          7seg_3 = 7seg_4
          7seg_4 = 7seg_5
       End If
    
       If 7seg_4 = 46 Then
          7seg_3 = 7seg_3 + 128
          7seg_4 = 7seg_5
       End If
    
    'Wert 32 = Leerzeichen wert 160 = leerzeichen + Dezimalpunkt, wenn abfrage ok dann wert um 17 verringern um ein leerzeichen anzuzeigen ansonsten alle werte minus 48 damit alle werte rictig nagezeigt werden
       If 7seg_1 = 32 Or 7seg_1 = 160 Then
          7seg_1 = 7seg_1 - 17
       Else
         7seg_1 = 7seg_1 - 48
       End If
    
       If 7seg_2 = 32 Or 7seg_2 = 160 Then
          7seg_2 = 7seg_2 - 17
       Else
         7seg_2 = 7seg_2 - 48
       End If
    
       If 7seg_3 = 32 Or 7seg_3 = 160 Then
          7seg_3 = 7seg_3 - 17
       Else
         7seg_3 = 7seg_3 - 48
       End If
    
       If 7seg_4 = 32 Or 7seg_4 = 160 Then
          7seg_4 = 7seg_4 - 17
       Else
         7seg_4 = 7seg_4 - 48
       End If
    
    
    7seg_adr = Adresse
    7seg_wert = 7seg_1
    Call Max7219datenout(7segment)                              ' übertrage Register zum Max7219
    
    7seg_adr = 7seg_adr + 1
    7seg_wert = 7seg_2
    Call Max7219datenout(7segment)                              ' übertrage Register zum Max7219
    
    
    7seg_adr = 7seg_adr + 1                                     'Adresse + 3
    7seg_wert = 7seg_3
    Call Max7219datenout(7segment)                              ' übertrage Register zum Max7219
    
    
    7seg_adr = 7seg_adr + 1
    7seg_wert = 7seg_4
    Call Max7219datenout(7segment)                              ' übertrage Register zum Max7219
    
    
    End Sub
    und hier mal der log von der RS232.

    Code:
    Start Initialisierung
    
    Max7219nr: 1
    7-segment Adresse: 12
    7-segment Wert: 1
    7-segment Daten: 0C01
    enable=0
    enable=1
    
    Max7219nr: 1
    7-segment Adresse: 9
    7-segment Wert: 255
    7-segment Daten: 09FF
    enable=0
    enable=1
    
    Max7219nr: 1
    7-segment Adresse: 10
    7-segment Wert: 15
    7-segment Daten: 0A0F
    enable=0
    enable=1
    
    Max7219nr: 1
    7-segment Adresse: 11
    7-segment Wert: 7
    7-segment Daten: 0B07
    enable=0
    enable=1
    
    Max7219nr: 1
    7-segment Adresse: 15
    7-segment Wert: 1
    7-segment Daten: 0F01
    enable=0
    enable=1
    
    Max7219nr: 1
    7-segment Adresse: 15
    7-segment Wert: 0
    7-segment Daten: 0F00
    enable=0
    enable=1
    
    Max7219nr: 2
    7-segment Adresse: 12
    7-segment Wert: 1
    7-segment Daten: 0C01
    enable=0
    noop
    enable=1
    
    Max7219nr: 2
    7-segment Adresse: 9
    7-segment Wert: 255
    7-segment Daten: 09FF
    enable=0
    noop
    enable=1
    
    Max7219nr: 2
    7-segment Adresse: 10
    7-segment Wert: 15
    7-segment Daten: 0A0F
    enable=0
    noop
    enable=1
    
    Max7219nr: 2
    7-segment Adresse: 11
    7-segment Wert: 7
    7-segment Daten: 0B07
    enable=0
    noop
    enable=1
    
    Max7219nr: 2
    7-segment Adresse: 15
    7-segment Wert: 1
    7-segment Daten: 0F01
    enable=0
    noop
    enable=1
    
    Max7219nr: 2
    7-segment Adresse: 15
    7-segment Wert: 0
    7-segment Daten: 0F00
    enable=0
    noop
    enable=1
    
    Initialisierung abgeschlossen!
    -----------------------------------------------------
    
    Max7219nr: 1
    7-segment Adresse: 1
    7-segment Wert: 1
    7-segment Daten: 0101
    enable=0
    enable=1
    
    Max7219nr: 1
    7-segment Adresse: 2
    7-segment Wert: 1
    7-segment Daten: 0201
    enable=0
    enable=1
    
    Max7219nr: 1
    7-segment Adresse: 3
    7-segment Wert: 1
    7-segment Daten: 0301
    enable=0
    enable=1
    
    Max7219nr: 1
    7-segment Adresse: 4
    7-segment Wert: 1
    7-segment Daten: 0401
    enable=0
    enable=1
    
    Max7219nr: 1
    7-segment Adresse: 5
    7-segment Wert: 2
    7-segment Daten: 0502
    enable=0
    enable=1
    
    Max7219nr: 1
    7-segment Adresse: 6
    7-segment Wert: 2
    7-segment Daten: 0602
    enable=0
    enable=1
    
    Max7219nr: 1
    7-segment Adresse: 7
    7-segment Wert: 2
    7-segment Daten: 0702
    enable=0
    enable=1
    
    Max7219nr: 1
    7-segment Adresse: 8
    7-segment Wert: 2
    7-segment Daten: 0802
    enable=0
    enable=1
    
    Max7219nr: 2
    7-segment Adresse: 1
    7-segment Wert: 3
    7-segment Daten: 0103
    enable=0
    noop
    enable=1
    
    Max7219nr: 2
    7-segment Adresse: 2
    7-segment Wert: 3
    7-segment Daten: 0203
    enable=0
    noop
    enable=1
    
    Max7219nr: 2
    7-segment Adresse: 3
    7-segment Wert: 3
    7-segment Daten: 0303
    enable=0
    noop
    enable=1
    
    Max7219nr: 2
    7-segment Adresse: 4
    7-segment Wert: 3
    7-segment Daten: 0403
    enable=0
    noop
    enable=1

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    15.01.2006
    Beiträge
    80
    Weiß denn echt keiner was??
    Ich werde morgen mal probieren ob ich beide ansteuern kann wenn ich das enable signal getrennt gebe. Und alles andere parallel auf beide chips gebe!

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    02.09.2005
    Ort
    Greifswald
    Beiträge
    17
    Hallo Marco,

    habe den Chip nicht aber vieleicht hilft es Dir weiter.
    Ich gehe mal davon aus, Du hast die Schaltung wie im Datenblatt aufgebaut?
    Bei mir ist das Seite 13 Figure 3.

    Ich habe jetzt keine Zeit mich durch Dein Programm zu wühlen.
    Im Datenblatt Seite 6 Table 1 steht das Bitmuster für einen Chip.
    Jeder Chip möchte ein 16Bit Datenwort.
    Sind zwei "hintereinander geschaltet" muss man also 32Bit ausgeben.
    DOUT vom ersten Chip ist mit DIN vom zweiten verbunden.
    Also müssen zuerst die 16Bit für den zweiten Chip und dann die 16Bit für den ersten Chip in der richtigen Reihenfolge gesendet werden.
    Da liegt irgendwo Dein Problem.

    Hinweis im Datenblatt:
    The data into DIN is valid at DOUT 16.5 clock cycles later.
    On CLK’s rising edge, data is shifted into the internal shift register. On CLK’s falling edge, data is clocked out of DOUT.

    Deine Fehlerbeschreibung weißt darauf hin, das irgendwo ein Bit verlorengeht.
    Die Frage ist wo das passiert, bei der Datenausgabe oder in Deinem Programmablauf.
    Für den Programmablauf sollte der Simulator weiterhelfen.

    Ich würde mir aber besser ein ganz kleines Programm schreiben um einfach mal 2x 16Bit hintereinander zu senden.
    Bei gleichem Bitmuster müssen beide Chips das gleiche anzeigen.
    LOAD zu trennen wird sicher gehen, verschenkt aber einen Pin.


    Gruß Manfred
    www.malo-web.de

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    15.01.2006
    Beiträge
    80
    Die Ansteuerung ist ja soweit klar. Also das mit den 16 bzw 32bit. Und die Schaltung ist auch so aufgebaut.

    Hmm also wenn ich jetzt diesen code ausführe sollte es doch klappen, oder??


    D=&H0c01

    Reset load
    Shiftout 7_data , 7_clk , D , 1 , 16
    Shiftout 7_data , 7_clk , D , 1 , 16
    Set load


    und wenn ich das mache klappt es trotzdem nicht.
    Das untere Programm ist ja das minimale Programm. Wo der chip nur initialisiert wird und 3 werte übertragen werden.

    Achja was mir noch auffällt. Wenn der 2. chip initialisiert ist und auch mal was anzeigt(kommt gelegentlich vor, aber nicht immer). Und das Programm steht(wartet auf eingabe) kommt es meistens vor das der 2.Chip einfach austeigt. Also alle segmente aus. Er muss dann erst neu initialisiert werden. Habe schon fast das Gefühl das der Max7219 ne Macke hat!

    Habe die schaltung mal umgelötet und werde das nachher mal so testen. Denke vom Timing her ist das doch bestimmt auch besser so.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    15.01.2006
    Beiträge
    80
    Hallo,
    ich habe die Platine jetzt so umgebaut das das clock signal und das data signal auf beide max parallel gehen und die load signale getrennt sind. Und der 2. max macht nur probleme, ich denke das der wohl ne Macke haben wird. Und ich Suche hier wie blöd nen Fehler, werde mal einen neuen bestellen und gucken was passiert.

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    02.09.2005
    Ort
    Greifswald
    Beiträge
    17
    Hallo Marco,

    hier mal ein kleines Demo, ist getestet.
    Wenn Dein zweiter MAX immer noch spinnt, dann ist er wohl hinüber.
    Das Demo benutzt den normal mode für Anzeigen.
    Wenn man Zahlen anzeigen wil ist der BCD mode günstiger, siehe Datenblatt.
    Hinweis: Die Versorgungsspannung der MAX sollte mit Kondensatoren geblockt werden.

    Gruß Manfred
    www.malo-web.de

    Code:
    '*****************************************************************************************************************
    '  Bascom AVR Compiler 1.11.8.7
    '  ATMega8 Applikation
    '
    '  Manfred Look
    '  webmaster@malo-web.de
    '  http://www.malo-web.de
    '
    '  Demo 2x MAX7219 (8x 7_Segment LED Treiber IC)
    '  sollte auch mit MAX7221 funktionieren
    '
    '  10/2007
    '  V1.00
    '
    '  Takt getestet mit:
    '  intern 1MHz
    '  extern 16MHz (Fuses entsprechend setzen)
    '
    '  Schaltplan siehe Datenblatt MAX7219 Seite 13 Figure 3
    '
    '*****************************************************************************************************************
    '
    '--compiler directives--------------------------------------------------------------------------------------------
    '
    $regfile = "m8def.dat"                                      'Chip auswaehlen: ATMega8
    $crystal = 16000000                                         'Taktfrequenz (Hz) festlegen
    $hwstack = 32                                               'Hardware Stack
    $swstack = 8                                                'Software Stack
    $framesize = 20                                             'Framsize
    '
    '--variable-------------------------------------------------------------------------------------------------------
    '
    Dim Send_max1 As Word                                       '16Bit Variable MAX1 die seriel ausgegeben wird
    Dim Send_max2 As Word                                       '16Bit Variable MAX2 die seriel ausgegeben wird
    '
    '--alias----------------------------------------------------------------------------------------------------------
    '
    _data Alias Portd.2                                         'data MAX7219
    _load Alias Portd.3                                         'chip Enable MAX7219
    _clk Alias Portd.4                                          'clock MAX7219
    '
    '--init program---------------------------------------------------------------------------------------------------
    '
    'Initialisierung Ports
    Ddrd = &B00011100                                           'Port D, 1=Ausgang
    '
    Loop:
    '
    'Initialisierung MAX7219
       Send_max2 = &B0000111100000001                           'Display Test ein
       Send_max1 = &B0000111100000001                           'Display Test ein
       Gosub _ser_output
       Wait 1                                                   '1 Sekunde Test
    '
       Send_max2 = &B0000111100000000                           'Test aus
       Send_max1 = &B0000111100000000                           'Test aus
       Gosub _ser_output
    '
       Send_max2 = &B0000110000000001                           'normal mode
       Send_max1 = &B0000110000000001                           'normal mode
       Gosub _ser_output
    '
       Send_max2 = &B0000101100000111                           'scan limit: 8
       Send_max1 = &B0000101100000111                           'scan limit: 8
       Gosub _ser_output
    '
       Send_max2 = &B0000101000001000                           'intensity: 17/32 (heller)
       Send_max1 = &B0000101000000010                           'intensity: 5/32 (dunkler)
       Gosub _ser_output
    '
    'Initialisierung Ausgaben
    '               xxxx    PABCDEFG
       Send_max2 = &B0000000101111001                           'Digit 0 Anzeige: 3
       Send_max1 = &B0000000101101101                           'Digit 0 Anzeige: 2
       Gosub _ser_output
    '               xxxx    PABCDEFG
       Send_max2 = &B0000001000110000                           'Digit 1 Anzeige: 1
       Send_max1 = &B0000001001011111                           'Digit 1 Anzeige: 2
       Gosub _ser_output
    'usw.
       Wait 2                                                   '2 Sekunden Anzeige
    Goto Loop                                                   'Demo startet neu
    '
    End
    '
    'Serielle Schnittstelle
    _ser_output:
       Reset _load                                              'bereit
       Shiftout _data , _clk , Send_max2 , 1                    '16Bit senden, MSB zuerst, Takt steigende Flanke
       Shiftout _data , _clk , Send_max1 , 1                    '16Bit senden, MSB zuerst, Takt steigende Flanke
       Set _load                                                'fertig
    Return

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress