PDA

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



infosystems
12.02.2006, 20:08
Hallo,

ich versuche mich auch gerade in das Bascom einzuarbeiten.

Nun wollte ich an den Ports für eine 7 Segment LED Anzeige den CODE direkt schreiben da ich mir die Decodier IC-s "BCD zu 7 Segment" sparen wollte.

Ich habe da auch irgendwo einen Code gefunden, doch leider funktioniert bei mir die Portausgabe nicht.

Habt Ihr eine Ahnung woran das liegen könnte?
Wo ist da der Fehler???

Warscheindlich übergebe ich das nicht richtig an die Ports.
Da wo ich es an die RS232 übergebe, da funktioniert es noch... Hab ich auch so übernommen, doch meine Ausgabe funktioniert nicht.



Portd = Segment(1)
Portc = Segment(2)


$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600


' BASCOM
' 7-Segment Multiplexer


Const Dekaden = 2 ' Anzahl der Anzeigen (dekaden)
Const Pulsdauer = 10000 ' Dauer eines Impulses


Declare Function Segmentdecoder(byval C As String) As Byte
Declare Sub Selector(byval Wert As Integer)


Dim Segment(dekaden) As Byte ' Array für die Fertig berecheten Segmente
Dim Demo As Byte

Config Portc = Output 'Port C wird als Output configuriert
Config Portd = Output


' Hauptprogramm
' -----------------------------------------------------------------------------

Call Selector(22) ' Berechnet die Segmente der einzelnen Dekaden
' und legt diese im Array Segment() ab.


' Die folgenden Zeilen Zeigen Dir was rauskommt und können gelöscht werden.

For Demo = 1 To Dekaden
Print Bin(segment(demo))
Next Demo


' Ein bisschen darfst Du auch naoch was tun... Schaffe ich auch nicht....
' Jetzt muß noch die Ausgabe erfolgen.
' Frage das Array ab, weise dem Port den Wert Zu
' z.B. Portb = segment(1)
' pulseout portd, 1 pulsdauer
' Portb = segment(2)
' pulseout portd, 2 pulsdauer
' usw.



Portd = Segment(1)
Portc = Segment(2)






End 'end program

' -----------------------------------------------------------------------------
' -----------------------------------------------------------------------------




Sub Selector(byval Wert As Integer)
Dim S As String * Dekaden ' Stringvariable Länge = Anzeige
Dim L As Byte ' Variable für Länge des Strings
Dim X As Byte ' Zählervariable
Dim Pos As Byte ' Variable für MID Funktion
Dim Z As String * 1
Dim Segcode As Byte



S = Str(wert) ' Wandle Wert in String
L = Len(s) ' ermittle Länge des Strings
If L > Dekaden Then L = Dekaden ' Verhindern dass mehr Anzeigen berechent werden
' als definiert und vorhanden sind.


For X = 1 To L
Pos = L - X
Pos = Pos + 1 ' Beginne mit den Einer Stellen (rechts)
Z = Mid(s , Pos , 1) ' Picke eine einzelnes Zeichen heraus

Segcode = Segmentdecoder(z) ' Ermittle den Portcode für die Segmente
Segment(x) = Segmentdecoder(z)
Next X

End Sub

' -----------------------------------------------------------------------------

Function Segmentdecoder(byval C As String) As Byte
Select Case C
Case "0" : Segmentdecoder = &B00111111 ' Bit 0 = Segment A
Case "1" : Segmentdecoder = &B00000110 ' Bit 1 = Segment B
Case "2" : Segmentdecoder = &B01011011 ' Bit 2 = Segment C
Case "3" : Segmentdecoder = &B01001111 ' Bit 3 = Segment D
Case "4" : Segmentdecoder = &B01100110 ' Bit 4 = Segment E
Case "5" : Segmentdecoder = &B01101101 ' Bit 5 = Segment F
Case "6" : Segmentdecoder = &B01111101 ' Bit 6 = Segment G
Case "7" : Segmentdecoder = &B00000111 ' Bit 7 = Segment dp
Case "8" : Segmentdecoder = &B01111111
Case "9" : Segmentdecoder = &B01101111
Case "." : Segmentdecoder = &B10000000
Case Else : Segmentdecoder = &B000000000 ' unerwartes Zeichen keine Ausgabe
End Select

'Bit Segmente

' || G | F | E | D | C | B | A |
' --||---+---+---+---+---+---+---|
' 0 || 0 | 1 | 1 | 1 | 1 | 1 | 1 |
' 1 || 0 | 0 | 0 | 0 | 1 | 1 | 0 |
' 2 || 1 | 0 | 1 | 1 | 0 | 1 | 1 |
' 3 || 1 | 0 | 0 | 1 | 1 | 1 | 1 |
' 4 || 1 | 1 | 0 | 0 | 1 | 1 | 0 |
' 5 || 1 | 1 | 0 | 1 | 1 | 0 | 1 |
' 6 || 1 | 1 | 1 | 1 | 1 | 0 | 1 |
' 7 || 0 | 0 | 0 | 0 | 1 | 1 | 1 |
' 8 || 0 | 1 | 1 | 1 | 1 | 1 | 1 |
' 9 || 1 | 1 | 0 | 1 | 1 | 1 | 1 |
End Function
' -----------------------------------------------------------------------------



End

Baumschubser
12.02.2006, 21:07
Ich habe dein Programm nicht genauer angeschaut aber vielleicht kannst du etwas mit dieser Lösung von Claus Kühnel anfangen:



$regfile = "m8def.dat" ' ATmega8
$crystal = 3690000 ' für STK500
$baud = 19200

Config Portb = Output
Portb = 255

Dim I As Byte

Dim X(16) As Byte

Restore Value_table

For I = 1 To 16 ' Lade Tabelle in Bytearray
Read X(i)
Next

Do ' Ausgabe von 0 bis F über PortB

For I = 1 To 16
Portb = X(i)

Waitms 500
Print Hex(portb)
Next


Loop

End

Value_table:
' 0 1 2 3 4 5 6 7
Data &H40 , &H79 , &H24 , &H30 , &H19 , &H12 , &H02 , &H78
' 8 9 A B C D E F
Data &H00 , &H10 , &H08 , &H03 , &H46 , &H21 , &H06 , &H0E


Mfg Nico

veit
12.02.2006, 22:58
hmmm also ich bin auch gerade am anfangen...

wie sieht deine schaltung aus?
hast du transistoren an der gemeinsamen kathode der segmente oder sowas?

hast mal die 7segment anzeige getestet ohne das multiplexen ???

ich hab bei mir mal drei taster an port d und ein segment an port c gehangen und etwas rumexperimentiert, hier mal mein aktueller code ...

funktion: er zeigt ne null wenn ich den einen taster aus hab, beim betätigen verschwindet die null.
drück ich den taster an d.2 (interrupt) wird die schleife unterbrochen und er zählt von 6 bis 0 runter ...






'testsoftware v 0.1

config porta = output
Config Portc = Output
Config Pind.0 = Input ' kann man auch kürzer schreiben - egal
Config Pind.1 = Input 'konfiguriert die ports d 0,1,2 als input
Config Pind.2 = Input

Portd.0 = 1 'pullup-widerstände ein
Portd.3 = 1
Portd.2 = 1

Dim Nix As Byte , Eins As Byte
Dim Zwei As Byte , Drei As Byte , Vier As Byte , Fuenf As Byte , Sechs As Byte
Dim Sieben As Byte , Acht As Byte , Neun As Byte

Nix = &B1111011
Eins = &B0101000
Zwei = &B1110110
Drei = &B1111100
Vier = &B0101101
Fuenf = &B1011101
Sechs = &B1011111
Sieben = &B1101000
Acht = &B1111111
Neun = &B1111101

On Int0 Int0serv 'bei interrupt int0 gehe zu int0serv
Config Int0 = Rising 'und zwar bei steigender flanke
Enable Int0 'muss auch rein
Enable Interrupts 'und das muss wohl auch rein ...

Porta.0 = 1 'led mal ausschalten


Do 'Beginn der Endlosschleife


If Pind.0 = 1 Then
'nix also die 0 anzeigen
Portc = Nix


Else
'alle LEDs aus
Portc = 0
End If
Loop 'Ende der Endlosschleife



Int0serv: 'bei interrupt von sechs runterzählen
Portc = Sechs
Waitms 500
Portc = Fuenf
Waitms 500
Portc = Vier
Waitms 500
Portc = Drei
Waitms 500
Portc = Zwei
Waitms 500
Portc = Eins
Waitms 500
Portc = Nix



Return


Code-Tags. Männer ! (PicNick)

veit
12.02.2006, 22:58
achso und hier hätt ich ne frage .... mein code im interrupt wird immer zwei mal durchlaufen, kann das daran liegen das der taster nicht entprellt ist ???

infosystems
15.02.2006, 09:13
Hi,

ich versuche erst mal alles an der Simulation.

Die Schaltung mache ich erst danach.

Aber der Code von Claus Kühnel schein ganz OK zu sein. Ich werde den mal anpassen.

Viele Grüße aus Nürnberg

Richard


quote="veit"]hmmm also ich bin auch gerade am anfangen...

wie sieht deine schaltung aus?
hast du transistoren an der gemeinsamen kathode der segmente oder sowas?

hast mal die 7segment anzeige getestet ohne das multiplexen ???

i