Hallo,
Ich steuere gerade 3 7-Segment Anzeigen an:
Ein Mega 8 steuert ein Schieberegister (74HC595) an, an dem
8x BC547A hängen. Desweiteren steuert der Prozessor einen ULN 2803,
der dafür zuständig ist, die Anzeigen mit gemeinsamer Kathode
nacheinander auf GND zieht (Multiplexen).
Das funktioniert nun, die Anzeigen lassen sich alle steuern.
Nun zur Software:
-Programmiert wird in Bascom, Beispiele in C oder Assembler helfen mir
nicht
-Das Multiplexen wird per Timer0 Interrupt erledigt
-Es gibt ein Abfrage, die im Interrupt die Zahlen (1-9) Binäre Werte
umwandelt, passend für die Anzeigen, die dann ins Schieberegister
geschoben werden.
Code:
1 | Select Case Zahl(1)
|
2 | Case 0 : T1 = &B11101101
|
3 | Case 1 : T1 = &B10000001
|
4 | Case 2 : T1 = &B11001110
|
5 | Case 3 : T1 = &B01101110
|
6 | Case 4 : T1 = &B00101011
|
7 | Case 5 : T1 = &B01100111
|
8 | Case 6 : T1 = &B11100111
|
9 | Case 7 : T1 = &B00101101
|
10 | Case 8 : T1 = &B11101111
|
11 | Case 9 : T1 = &B01101111
|
12 |
|
13 | End Select
|
14 |
|
15 |
|
16 | Select Case Zahl(2)
|
17 | Case 0 : T2 = &B11101101
|
18 | Case 1 : T2 = &B10000001
|
19 | Case 2 : T2 = &B11001110
|
20 | Case 3 : T2 = &B01101110
|
21 | Case 4 : T2 = &B00101011
|
22 | Case 5 : T2 = &B01100111
|
23 | Case 6 : T2 = &B11100111
|
24 | Case 7 : T2 = &B00101101
|
25 | Case 8 : T2 = &B11101111
|
26 | Case 9 : T2 = &B01101111
|
27 |
|
28 | End Select
|
29 |
|
30 |
|
31 |
|
32 | Select Case Zahl(3)
|
33 | Case 0 : T3 = &B11101101
|
34 | Case 1 : T3 = &B10000001
|
35 | Case 2 : T3 = &B11001110
|
36 | Case 3 : T3 = &B01101110
|
37 | Case 4 : T3 = &B00101011
|
38 | Case 5 : T3 = &B01100111
|
39 | Case 6 : T3 = &B11100111
|
40 | Case 7 : T3 = &B00101101
|
41 | Case 8 : T3 = &B11101111
|
42 | Case 9 : T3 = &B01101111
|
43 |
|
44 | End Select
|
Ich habe also drei Variabeln, die jeweil eine Stelle, von 1 bis 9,
darstellen.
Ich will eine ganze Zahl auf dieser Anzeige ausgeben, die in einer
anderen
Varialble gespeichert ist, z.B. 142.
Wie schaffe ich es nun, diese Zahl aufzuteilen,
also in die Stellen 1, 2 und 3 ?
Hier die erste Methode, die ich mir ausgedacht hatte:
-Als erstes wird die Zahl durch 100 geteilt
-Dann werden die Kommastellen ermittelt
-Und dann abgezogen
-Jetzt könnte die Zahl z.B. lauten: 2.0
-Um das komma "wegzubringen" runde ich noch
Hier wieder der Code:
(Mit Derklerationen)
1 | $regfile = "m8def.dat" 'ATmega8-Deklarationen
|
2 | $crystal = 1000000
|
3 | $baud = 4800
|
4 |
|
5 | Config Portc.5 = Output
|
6 | Config Portc.4 = Output
|
7 | Config Portc.3 = Output
|
8 | Config Portc.2 = Output
|
9 | Config Portd.5 = Output
|
10 | Config Portd.6 = Output
|
11 | Config Portb.7 = Output
|
12 |
|
13 | Portb.0 = 1
|
14 | Portd.7 = 1
|
15 |
|
16 | Clock Alias Portc.5
|
17 | Stout Alias Portc.4
|
18 | Dat Alias Portc.3
|
19 |
|
20 | Down Alias Pind.7
|
21 | Up Alias Pinb.0
|
22 |
|
23 | L1 Alias Portd.6
|
24 | L2 Alias Portd.5
|
25 | L3 Alias Portb.7
|
26 |
|
27 | Clock = 0
|
28 | Stout = 0
|
29 | Dat = 0
|
30 |
|
31 |
|
32 | Dim Zahl(3) As Integer
|
33 | Dim Zanz As Integer
|
34 |
|
35 | Dim K1 As Single
|
36 | Dim K2 As Single
|
37 | Dim K3 As Single
|
38 | Dim Fr As Single
|
39 |
|
40 |
|
41 | Dim T1 As Byte
|
42 | Dim T2 As Byte
|
43 | Dim T3 As Byte
|
44 | Dim A As Byte
|
45 |
|
46 | On Timer0 Isr
|
47 | Config Timer0 = Timer , Prescale = 8
|
48 | Enable Timer0
|
49 | Enable Interrupts
|
50 |
|
51 | Zanz = 123
|
52 |
|
53 | Do
|
54 |
|
55 | K1 = Zanz / 100
|
56 | Fr = Frac(k1)
|
57 | K1 = K1 - Fr
|
58 | T1 = Round(k1)
|
59 |
|
60 |
|
61 | K2 = Zanz / 10
|
62 | Fr = Frac(k2)
|
63 | K2 = K2 - Fr
|
64 | T2 = Round(k2)
|
65 |
|
66 |
|
67 | Print "k1:" ; K1
|
68 | Print "k2:" ; K2
|
69 | Print " "
|
70 | Print "t1:" ; T1
|
71 | Print "t2:" ; T2
|
72 | Print " "
|
73 | Print "Fr:" ; Fr
|
74 |
|
75 |
|
76 | Loop
|
Aber es funktioniert nicht.
Kennt jemand einen andere Methode,
so etwas "umzuwandeln"?
Oder findet jemand den Fehler in meinem Code ?
Falls nötig kann ich auch den ganzen Code posten. (oder noch mehr zur
Hardware?!)
Vielen Dank schonmal
PS: Ich bin in ca. 45 Minuten wieder da, gespannt auf eure Antworten.