FuX
26.04.2008, 21:13
ich habe mit der RN-Digi Platine eine große 7 segmentstoppuhr gebaut mit 100mm hohen Ziffern.
http://freenet-homepage.de/planet-elektronik/P1090326.JPG
Es sind 2 RN-Digi Platinen eigentlich drinnen, die eine habe ich nun getrennt, weil ich auf der Fehlersuche bin.
die anzeige soll jede 1/100sek hochzählen.
das unten ist jetzt nur so ein testprogramm und nicht das eigentliche.
bloß sieht dann das display nach dem einschalten so aus.
http://freenet-homepage.de/planet-elektronik/P1090313.JPG
Declare Sub Led_display_init()
Declare Sub Led_display(byval Ziffer As Byte , Byval Zahl As Byte)
$regfile = "m32def.dat"
$crystal = 16000000
Config Timer1 = Timer , Prescale = 8
On Timer1 Timer_irq
Const Timervorgabe = 45536
Config Sda = Portc.1 ' I2C Bus konfigurieren
Config Scl = Portc.0
Const Rn_digi_slave_write = &H70
Const Rn_digi_slave_read = &H71
Const Dezimalpunktziffer = 2 'Segment wo Dezimalpunkt leuchten soll (0=keinen)
Dim Segmente As Byte
Dim Z As Byte
Dim I As Byte
I2cinit
Led_display_init
I = 0
Enable Timer1
Enable Interrupts
Do
Loop
'Dies ist der Programmteil, der in dem von ihnen gewählten
'Intervall aufgerufen wird
Timer_irq:
Timer1 = Timervorgabe
Incr I
If I = 10 Then
I = 0
End If
Led_display 3 , I
Return
Sub Led_display_init()
I2cstart
I2cwbyte Rn_digi_slave_write
I2cwbyte 0 'Control Byte
'Dynamic Alternative Mode und Helligkeit
'Die oberen 3 Bits bestimmen die Helligkeit
'Wenn es dunkler sein soll dann z.b. &B0110111
I2cwbyte &B1110111
I2cstop
'Alle Ziffern auf 0
For Z = 1 To 4
Led_display Z , 0
Next Z
End Sub
Sub Led_display(ziffer An Byte , Zahl As Byte)
I2cstart
I2cwbyte Rn_digi_slave_write
I2cwbyte Ziffer
Select Case Zahl
Case 0:
Segmente = &H3F
Case 1:
Segmente = &H06
Case 2:
Segmente = &H5B
Case 3:
Segmente = &H4F
Case 4:
Segmente = &H66
Case 5:
Segmente = &H6D
Case 6:
Segmente = &H7D
Case 7:
Segmente = &H07
Case 8:
Segmente = &H7F
Case 9:
Segmente = &H67
Case Else :
Segmente = &H80 'Ansonsten Dezimalpunkt
End Select
If Dezimalpunktziffer = Ziffer Then Segmente = Segmente Or &H80
I2cwbyte Segmente
I2cstop
End Sub
An was kann das liegen?
Wenn ich den timer abschalte und die Uhr über warteschleifen hochzählen lasse dann geht es einwandfrei.
http://freenet-homepage.de/planet-elektronik/P1090326.JPG
Es sind 2 RN-Digi Platinen eigentlich drinnen, die eine habe ich nun getrennt, weil ich auf der Fehlersuche bin.
die anzeige soll jede 1/100sek hochzählen.
das unten ist jetzt nur so ein testprogramm und nicht das eigentliche.
bloß sieht dann das display nach dem einschalten so aus.
http://freenet-homepage.de/planet-elektronik/P1090313.JPG
Declare Sub Led_display_init()
Declare Sub Led_display(byval Ziffer As Byte , Byval Zahl As Byte)
$regfile = "m32def.dat"
$crystal = 16000000
Config Timer1 = Timer , Prescale = 8
On Timer1 Timer_irq
Const Timervorgabe = 45536
Config Sda = Portc.1 ' I2C Bus konfigurieren
Config Scl = Portc.0
Const Rn_digi_slave_write = &H70
Const Rn_digi_slave_read = &H71
Const Dezimalpunktziffer = 2 'Segment wo Dezimalpunkt leuchten soll (0=keinen)
Dim Segmente As Byte
Dim Z As Byte
Dim I As Byte
I2cinit
Led_display_init
I = 0
Enable Timer1
Enable Interrupts
Do
Loop
'Dies ist der Programmteil, der in dem von ihnen gewählten
'Intervall aufgerufen wird
Timer_irq:
Timer1 = Timervorgabe
Incr I
If I = 10 Then
I = 0
End If
Led_display 3 , I
Return
Sub Led_display_init()
I2cstart
I2cwbyte Rn_digi_slave_write
I2cwbyte 0 'Control Byte
'Dynamic Alternative Mode und Helligkeit
'Die oberen 3 Bits bestimmen die Helligkeit
'Wenn es dunkler sein soll dann z.b. &B0110111
I2cwbyte &B1110111
I2cstop
'Alle Ziffern auf 0
For Z = 1 To 4
Led_display Z , 0
Next Z
End Sub
Sub Led_display(ziffer An Byte , Zahl As Byte)
I2cstart
I2cwbyte Rn_digi_slave_write
I2cwbyte Ziffer
Select Case Zahl
Case 0:
Segmente = &H3F
Case 1:
Segmente = &H06
Case 2:
Segmente = &H5B
Case 3:
Segmente = &H4F
Case 4:
Segmente = &H66
Case 5:
Segmente = &H6D
Case 6:
Segmente = &H7D
Case 7:
Segmente = &H07
Case 8:
Segmente = &H7F
Case 9:
Segmente = &H67
Case Else :
Segmente = &H80 'Ansonsten Dezimalpunkt
End Select
If Dezimalpunktziffer = Ziffer Then Segmente = Segmente Or &H80
I2cwbyte Segmente
I2cstop
End Sub
An was kann das liegen?
Wenn ich den timer abschalte und die Uhr über warteschleifen hochzählen lasse dann geht es einwandfrei.