Guten Abend liebe Community Ich habe grade erfolgreich einen einfachen Counter auf einer 7 Segment Anzeige programmiert. #include <avr/io.h> #include <util/delay.h> int main(void) { DDRD = 0xFF; while(1) { PORTD = 0b00000001; _delay_ms(2500); PORTD = 0b00000010; _delay_ms(2000); PORTD = 0b00000011; _delay_ms(2000); PORTD = 0b00001000; _delay_ms(2000); PORTD = 0b00001001; _delay_ms(2000); PORTD = 0b00001010; _delay_ms(2000); PORTD = 0b00001011; _delay_ms(2000); PORTD = 0b00000100; _delay_ms(2000); PORTD = 0b00000101; _delay_ms(2000); } return 0; } Das Programm ist ziemlich lang und ich möchte es jetzt gerne mithilfe von einer Schleife einer Variabel oder eines Arrays zusammenfassen. Ich danke schonmal im Voraus!
?
1 | int main(void) |
2 | {
|
3 | uint8_t Counter = 0, |
4 | |
5 | DDRD = 0xFF; |
6 | |
7 | while(1) { |
8 | PORTD = Counter; |
9 | _delay_ms(2500); |
10 | |
11 | Counter++; |
12 | if( Counter == 10 ) |
13 | Counter = 0; |
14 | }
|
15 | }
|
Ach du Schande. Jetzt seh ichs erst. Was hast du denn da gemacht?
1 | PORTD = 0b00000001; |
2 | _delay_ms(2500); |
3 | PORTD = 0b00000010; |
4 | _delay_ms(2000); |
5 | PORTD = 0b00000011; |
6 | _delay_ms(2000); |
7 | PORTD = 0b00001000; |
Warum hast du denn die Datenleitungen nicht vernünftig zu deinem Dekoder gezogen sondern die Bits 2 und 3 vertauscht? Das war keine gute Idee! Damit verschenkst du dir die Möglichkeit, einstellige Zahlen einfach auf den Port ausgeben zu können. Dann muss das jetzt eben ein bischen anders gemacht werden
1 | uint8_t digits[] = { 0b00000000, |
2 | 0b00000001, |
3 | 0b00000010, |
4 | 0b00000011, |
5 | 0b00001000, |
6 | 0b00001001, |
7 | 0b00001010, |
8 | 0b00001011, |
9 | 0b00000100, |
10 | 0b00000101, |
11 | };
|
12 | |
13 | |
14 | int main(void) |
15 | {
|
16 | uint8_t Counter = 0, |
17 | |
18 | DDRD = 0xFF; |
19 | |
20 | while(1) { |
21 | PORTD = digits[ Counter ]; |
22 | _delay_ms(2500); |
23 | |
24 | Counter++; |
25 | if( Counter == 10 ) |
26 | Counter = 0; |
27 | }
|
28 | }
|
Dieses Umkodieren hättest du dir sparen können, wenn du dafür gesorgt hättest, das alle Ziffern bit-richtig an den Dekoder angelegt werden. Dann hätte das Bitmuster einer einstelligen Dezimalzahl schon gepasst. So hast du diese Chance vertan und im Grunde muss man sagen: ausser das du nur 4 Leitungen anstelle von 8 benötigst, hast du keinen Vorteil mehr vom Dekoder. Das Umsetzen der Ziffer in ein Muster, welche von 8 LED leuchten sollen (eben genau das, was der Dekoder macht), hättest du genausogut auch mit diesem Array machen können und dir den ganzen Dekoder sparen können. Dann könntest du zb selbst entscheiden, wie eine '6' oder eine '9' dargestellt wird, könntest auch Hex-Ziffern hinmalen, bzw. könntest überhaupt jedes beliebige Muster auf der 7-Segmentanzeige darstellen. Wie machst du denn bei einer mehrstelligen Anzeige zb die Ausgabe von negativen Zahlen? Dazu brauchst du ein '-', das du aber vom Dekoder nicht kriegst.
:
Bearbeitet durch User
Hi Nun, bei einem Controller ist ein Decoder nicht unbedingt erforderlich. Den Zähler incrementierst du in einer Schleife oder noch besser im Timer-Interrupt. Dazu gibt es zig Beispiele. Im Programm hinterlegst du dir ein Array mit dem Code der 7 Segmentanzeige, also 0 bis 9 Bitmuster. Um die Anzeige anzusteuern, setzt du einen Pointer auf die Adresse mit dem Code für die 0 und addierst den Zähler hinzu. Dieses Wert gibst du am Port aus. Fertig. Übrigends, gewöhn dir an, beim Zählen immer mit 0 anzufangen. Der Zahlenbereich ist nicht von 1 nach 10, sondern von 0 nach 9. Die 10 hat bereits schon einen Übertrag zur nächsten Stelle. Aus dem Grund haben wir auch nur 9 Finger :) Wenn ich C könnte, würd ich dir auch ein wenig Code liefern, aber es ist für dich eine gute Übung mit einer Code-Tabelle und einer Variablen zu arbeiten. Gruß oldmax
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.