PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 7-Segment Ansteuerung



Xeus
07.12.2004, 10:45
Hallo,
ich hab an einem max7219 ein 3digit siebensegmentdisp angeschlossen.
So weit so gut. Das Problem ist nur, dass ich keine Ahnung hab wie ich das teil ansteuern muss. Hat vielleicht einer von euch einen quellcode, der mir ermöglicht das display zu testen, und mir die ansteuerung erleutert?

gruß xeus

PicNick
07.12.2004, 11:29
Nun, eigentlich ist das einfach. Du mußt das SSP Module so configuriert haben, daß bei ansteigender Flanke des Taktes das jeweilige Data-Bit gerade dick und fett daliegt (--> Datasheet Controller).
Chip-Select (/CS) muß während des Transfers unten sein

Also:
Du muß mit /CS auf Low gehen
Zwei Byte mußt du jedesmal senden, erst Addresse Register, dann das DatenByte (dazwischen ready Flag abfragen!)
/CS wieder rauf.
Was Adresse/Daten jeweils bedeuten, steht im Datasheet, probier's doch einfach, abschreiben kann jeder. mfg robert

'tschuldige, ich seh grad, beim 7219 ist mit CS anders definiert. Ändert aber nix, kannst du genauso ablaufen lassen.

Xeus
07.12.2004, 11:37
Ehrlich gesagt, versteh ich nur bahnhof.
Eigentlich, will ich nur testen, ob meine verdrahtung stimmt

RCO
07.12.2004, 11:58
Wäre schön, wenn hier nen Beispielprog gäe, aber vermutlich ist das nicht so schwer, wenn man das Clocksignal selber geben kann, muss man nicht aufs Timing achten.

MFg Moritz

PicNick
07.12.2004, 12:09
o je, o je. Gut, wenn du folgendes beachtest, kann nix passieren (Lötbrücken etc. mal abgesehen), so richtig trocken kannst du den nicht testen.
Die LED-Seite is schon klar ? ( 7 -segmente, deine 3 Kathoden auf DIG0 - DIG2)
Die Basis-Applikation schlägt 9k3 für ISET(Pin18) vor, also probiers mal damit, kannst du immer noch ändern.
Bleiben noch V+, GND (logo)
und DIN <-> MOSI vom Atmel
LOAD (/CS) <-> irgendein freier OUT-Pin
CLOCK <-> SCK vom Atmel

Wenn du das so angeschlossen hast, MUSS das passen, da brauchst du nix testen, hab' Selbstvertrauen.
Alles weitere spielt sich in der Saftware ab

Für die richtige Konfiguration der SPI beim ATMEL:
Ist da irgendein Spezialist im Publikum ? ich selbst bin Microchip-User
fürs erste mfg robert

Xeus
07.12.2004, 12:10
Hat keiner von euch ein fertiges prog mit dem ich mir ein paar zahlen anzeigenlassen kann.. bitte

RCO
07.12.2004, 12:22
Den Anschluss hat Xeus wie folgt gemacht:

https://www.roboternetz.de/phpBB2/viewtopic.php?t=4074

Der Anschluss ist dann UART, oder werfe ich das was total durcheinander?

MFG Moritz

Xeus
07.12.2004, 12:29
Ja das stimmt habs genau so angeshlossen, nur mit einem MAX7219. Jetzt wollt ich testen, ob ich alles richtig angeschlossen hab.Aber da ich null kenntnisse in bascom besitze wollte ich fragen, ob von euch jemand ein kleines prog hat.

Xeus
07.12.2004, 14:18
Bitte ganz dringend um hilfe!!!

Muss unbedingt wissen ob meine konstruktion funktioniert

PicNick
07.12.2004, 15:22
Die Schaltung ist genau das, was im Datasheet vom MAX steht.
Warum, beim Zeus, soll das nicht gehen ? mfg robert

Alf_Wuffi
08.12.2004, 01:43
Hallo Xeus,

Ich denke der Code hilft dir. Ist allerdings auf die max. Anzahl von 8 Segmenten zugeschnitten, die allerdings gruppenweise zu je 4 gesteuert werden. Der wichtigste Teil ist die sub Send_bytes...Daraus kannst Du erkennen, wie der angesteuert wird. Ansonsten müsste es einfach sein - ganz gut kommentiert, hoffe ich - sich das rauszusuchen, was man braucht.

Man benötigt das Datenblatt, um die vielen Befehle zu erfahren. Man kann damit sogar quasi dimmen: Gleitend von Dunkel nach Hell die Helligkeit hochfahren. Find ich ganz lustig. Daran ist irgendein Widerstand beteiligt. Welchen, weiß ich momentan nicht mehr. Man kann aber erst einmal den vorgeschlagenen Wert nehmen. Ansonsten liebe ich dieses Teil. Einfacher kann man hardwaremäßig eine 8-stellige Anzeige kaum aufbauen, außer vielleicht mit dem saa 1064, aber der kann nur 4.


$regfile = "m32def.dat"

$baud = 19200
$crystal = 16000000

Const Displays = 4
Const Dezpunkt = 3

Declare Sub Send_bytes(byval Bytes As Word)
Declare Sub Alle_aus
Declare Sub Display_zeichen_bilden
Declare Sub Ausgabe

Dim I As Byte , Z As Byte , Wert As Word
Dim Temp As Byte
Dim Display_zeichen(displays)as Byte
Dim Grad As Single
Dim Temp_anzeige As String * Displays1
Dim Zähler As Byte

'***** für MAX-Init-Befehle
Dim A(5) As Word

Config Portc = Output

Clock_max Alias Portc.5 ' clock
Data_out_max Alias Portc.7 ' din
Load_max Alias Portc.6 ' load


'***** es werden immer 2 Bytes auf einmal abgeschickt
'***** deshalb Dimensionierung mit word

'*** erst alle aus
Alle_aus

'**** wichtig, falls vorher im Shutdown-Modus!!!
'**** geht beim Ausschalten da manchmal rein
'**** Befehle werden ausgeführt, aber man sieht nichts!!!!
'*** also zuerst in den Normalmodus

A(1) = &H0C01 '**** Normalmodus
A(2) = &H0B04 '**** Anzahl 4 Digits
A(3) = &H090F '**** Dekodiermodus für die ersten 4
A(4) = &H0A0F '**** Helligkeit, volle Kanne bei ISEG=10K
A(5) = &H0F00 '***** in den Displaymode

'**** Init Bargraf
For I = 1 To 5
Send_bytes A(i)
Next


'**** Versuch mit Grad-Anzeige
Grad = -5.4756
Temp_anzeige = Fusing(grad , "##.#" ) '**** um aufzurunden!

'**** Decodieren nicht nötig
Display_zeichen_bilden

Do
Wait 2
Alle_aus

'***** Testweise alle Zeichen zeigen
For Z = 1 To Displays
For I = 0 To 14
'Wert = Z * 256
'Wert = Wert + I
Wert = Makeint(i , Z)
Send_bytes Wert
Waitms 500
Next
Next

Alle_aus
'**** Gradzahl ausgeben
Ausgabe
Loop

End

Sub Send_bytes(byval Bytes As Word)
Reset Load_max
'**** masb first, clock goes high
Shiftout Data_out_max , Clock_max , Bytes , 1 , 16 , 5
Set Load_max
'Waitms 200
End Sub

Sub Alle_aus
For Z = 1 To 8
'**** 2. Byte immer 0
'Wert = Z * 256
'Wert = Wert + 15
Wert = Makeint(15 , Z) '**** geht schneller!!!
Send_bytes Wert
'Waitms 500
Next
End Sub

Sub Display_zeichen_bilden
Local Temp_zeichen As String * 1
'**** erst Array löschen
For Z = 1 To Displays
Display_zeichen(z) = ""
Next

'***** rückwärts den TempWert durchgehen
Zähler = Displays
For Z = Len(temp_anzeige) To 1 Step -1
Temp_zeichen = Mid(temp_anzeige , Z , 1)
'*** nur wenn kein Dez.Punkt, übernehmen
If Temp_zeichen <> "." Then
Display_zeichen(zähler) = Temp_zeichen
Decr Zähler
End If
Next
'**** fehlende Zeichen sind nun leere Strings!!!
End Sub

Sub Ausgabe
Local Zeichen As Byte
For Z = 1 To Displays

Zeichen = Display_zeichen(z)
If Zeichen = "" Then
'**** Blank
Temp = 15
Elseif Zeichen = "-" Then
Temp = 10
Else
Temp = Val(zeichen)
End If

'**** Dez.Punkt
If Z = Dezpunkt Then
Temp = Temp Or 128
End If

'Wert = Z * 256
'Wert = Wert + Temp
Wert = Makeint(temp , Z) '**** geht wesentlich schneller!!!
Send_bytes Wert
Waitms 200
Next
End Sub

Wolfgang

Xeus
08.12.2004, 18:13
Danke, entlich jemand, der versteht was ich mein.
Ich werd mir den code mal anschauen, und versuchen ihn nachzuvollziehen.
nochmal vielen dank

pebisoft
20.12.2004, 16:47
beim dimmern ist kein widerstand vorhanden. die leuchtbalken werden gepulst. es fliesst nicht immer ein strom voller strom. wenn nämlich alle leuchtbalken an sind (dauerstrom) würden die bauteile zu warm und kaputt ghen.