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
Lesezeichen