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.
und hier mal der log von der RS232.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
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







Zitieren

Lesezeichen