PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Max7219!!



astro9481
21.10.2007, 18:40
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



$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.


$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.



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

astro9481
22.10.2007, 21:42
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!

mlgahoc
23.10.2007, 07:38
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

astro9481
23.10.2007, 10:28
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.

astro9481
23.10.2007, 21:51
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.

mlgahoc
24.10.2007, 06:43
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



'************************************************* ************************************************** **************
' 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