Hallo, Ich würde gerne eine 2 stellige Anzeige mit 2 7 Segment Anzeigen programmien. Sie soll von 00 - 99 hochzählen. Die Schaltung läuft im Multiplexbetrieb. Wie kann ich die 100 Zahlen auf die codierung der Anzeige bringen ohne für jede einzelne zahl eine eigene Funktion zu schreiben ? Programmiert wird auf einem MSP430G2553. Danke euch schon mal
Gast
#3641704
Robert I. schrieb: > Wie kann ich die 100 Zahlen auf die codierung der Anzeige bringen ohne > für jede einzelne zahl eine eigene Funktion zu schreiben ? Mach dir eine Tabelle für die Ziffern 0..9 und die liest du dann zwei mal, einmal für die Zehner und einmal für die Einer.
Gast
#3641714
In dem du die 2 Ziffern einzeln behandelst.
char ziffer[]={0x7D,0x30,0x6D,0x79,0x33,0x5D,0x5F,0x70,0x7B,0x7B};
void main(void)
{
DDRB=DDRD=0xFF;
while(1) for(n=0;n<100;n++)
{
PORTB=ziffer[n%10];
PORTD=ziffer[n/10];
_delay_ms(1000);
}
}
Ist also nicht wirklich schwer, aber der Lernweg bis dahin noch weit.
Danke euch schon mal. Hab das auch soweit erreicht, nur stehe ich vor dem Problem es Sinnvoll auf die Anzeige zu übertragen. Wenn ich von 0-9 hochzähle , möchte ich dass auf der Zehnerstelle immer eine 0 steht , also 00, 01, 02,03, usw. Ich schaffe es nur nicht dass die Zehnerstelle, also die 0 steht und nur die Einerstelle aktualisiert wird. Bei mir läuft es total schnell durch und man kann auch erkennen dass die Zahlen immer kurz ausgehen. Also bleibt noch die Frage wie ich es umsetzen kann dass zb 9 Sekunden hoch gezählt werden ohne dass eine der Beiden stellen immer aus ist. Gruß
Gast
#3641831
Wenn du a mit 1 initialisierst funktionierts. Show code.
Robert I. schrieb: > Bei mir läuft es total schnell durch und man kann auch erkennen dass die > Zahlen immer kurz ausgehen. Zeig mal den Code. Kann es sein, dass du mit irgendwelchen Delays das Multiplexen unterbrichst? > Also bleibt noch die Frage wie ich es umsetzen kann dass zb 9 Sekunden > hoch gezählt werden ohne dass eine der Beiden stellen immer aus ist.
1 | |
2 | |
3 | |
4 | |
5 | |
Für ein 4-stelliges 7-Segment sieht es als Code für AVR so aus:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
Die Schleife musst du auf zwei Durchläufe reduzieren, die if-Bedingungen zur Aktivierung des Dezimalpunkts kannst du löschen. Die Funktion unter den Arrays läuft bei mir im Timer-Interrupt, einmal pro Millisekunde.
Bei mir funktionierts es jetzt. Hab es geschafft dass die Anzeige von 00 bis 99 zählt. Vllt nicht sehr elegalnt und effektiv gelöst aber es geht. Ist es normal dass ich immer einen leichten Schatten habe? Also wenn ich Zb die Zahl 19 ausgebe habe ich in der Anzeige für den 1er einen leichten Schatten vom 9er drinnen?
Nee, dann machst du es noch nicht richtig und die 9 wird gelegentlich auf der falschen Stelle ausgegeben.
Ja das denke ich mir selber auch , nur ich wollte keinen Code aus dem Internet nehmen und den nur einfügen, ich will solche sachen selber lösen. Ich weiss halt nicht ob man es auf dem Foto erkennen kann, da sollte eigentlich 16 stehen, mit dem Auge erkennt man es zwar besser aber ihr könnt euch sicher denken um was es geht.
Ohne deinen Code zu sehen, können wir nur noch mehr rätseln als du selber. Da scheinen die LEDs zwischendrin alle angeschaltet zu werden. Also, Code posten, dann können andere helfen. So bleibt es ein "tu-du-was-ich-denke", also Mission Impossible.
Robert I. schrieb: > Die Schaltung läuft im > Multiplexbetrieb. Multiplex benötigt zwingend einen Timerinterrupt, alles andere ist Quatsch. Nur wenige Uneinsichtige versuchen es mit einem Delay im Main zu erzwingen, was nur doppelte Arbeit bedeutet. Auch als Anfänger muß niemand in die Sackgasse hineinfahren, er darf auch gleich den richtigen Weg nehmen.
Ja gut ich habs ohne Interrupt gemacht da ich da noch nicht so durchblicke. Sieht so bei mir aus :
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
80 | |
81 | |
82 | |
83 | |
84 | |
85 | |
86 | |
87 | |
88 | |
89 | |
90 | |
91 | |
92 | |
93 | |
94 | |
95 | |
96 | |
97 | |
98 | |
99 | |
100 | |
101 | |
102 | |
103 | |
104 | |
105 | |
106 | |
107 | |
108 | |
109 | |
110 | |
111 | |
112 | |
113 | |
114 | |
115 | |
116 | |
117 | |
118 | |
119 | |
120 | |
121 | |
122 | |
Vllt kann mir ja mal jemand zeigen wie es effektiver und kürzer mithilfe von Interrupts wird. Danke euch !!
Gast
#3642427
Robert I. schrieb: > #define NULL 0x3F So was macht man nicht! NULL ist in den C-Headern schon definiert! Wenn, dann nimm den Namen ZERO oder was anderes passendes, aber nicht NULL!
Ui, echter Einsteiger-Code, schön :) Du solltest vor dem Wechsel der Stellen Digit1 / Digit2 auch wieder ausmachen. So schreibt er den Wert der anderen Digit in die grad aktive und schaltet anschließend um. Dadurch hast du ein Glimmen der jeweils anderen Nummer.
@Telco : Danke , genau das hab ich mir gedacht nachdem ich den Code hochgeladen habe. @Dirk: Werde es mal versuchen und sehen was dabei rauskommt.
Gast
#3643607
Robert I. schrieb: > Vllt kann mir ja mal jemand zeigen wie es effektiver und kürzer mithilfe > von Interrupts wird. Der code wird auch deutlich kürzer, wenn du ein array statt der case structure für die digits nehmen würdest... Ausserdem fände ich es logischer die Zehnerstelle "Digit1" und die Einerstelle "Digit2" zu nennen...
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
