Hallo! Bin noch ein Amateur was C++ und Atmega32 betrifft und hätte da eine Frage bezüglich des lcd_print(int x,int y, char *t); - Ich will eine bestimmte Integer-Variable (hier bei mir hat sie den Namen iDurchlauf) um den Wert 1 hochzählen lassen, sobald ich einen Taster PD2 (meine Anschlussbelegung am Bord) drücke. Drücke ich den Taster nochmal, zählt es zu der Variable iDurchlauf nochmal 1 dazu und so weiter.Und iDurchlauf will ich dann jedes Mal am LCD Display ausgeben, doch muss diesen Wert irgendwie in den Datentyp char *t verwandeln. Also in einen String. Ich dachte mir, dass über ASCII zu machen, weiter habe ich es nicht geschafft. Ich danke Euch für jede Hilfe.
1 | char text[10]; |
2 | int i = 0; |
3 | |
4 | while (1) { |
5 | warte_auf_taster(); |
6 | i++; |
7 | sprintf(text, "%d", i); |
8 | lcd_print(0, 0, text); |
9 | } |
Zeig doch mal, was du bis jetzt hast und wo du nicht mehr weiter kommst.
int Durchlauf,i; char StringDurchlauf; while(1) { if (!(PIND & (1<<PD2))) { Durchlauf++; StringDurchlauf++; lcd_print(1,0,); Wartezeit(1); } } Ich werde egal's gleich mal ausprobieren.
while(1) { if (!(PIND & (1<<PD2))) { Durchlauf++; sprintf(StringDurchlauf, "%d", Durchlauf); lcd_print(1,0,StringDurchlauf); Wartezeit(1); } } Ich habe die Funktion von egal gleich mal bei mir angewandt. Es funktioniert einwandfrei. Ich hab zu danken! (sprintf - habe ich gesucht ;) )
:
Bearbeitet durch User
Ich muss mich entschuldigen, nun verzweifle ich jedoch an dem hier: Ich soll 4 LEDs mir den aktuellen Wert anzeigen - binär - (das geht natürlich nur bis zur Zahl 15) bei 1 wäre das 0001 - d.h die 4 LED leuchtet. Wie geht das ? Es scheint mir unmöglich... Weil müsste ich für jede Zahl eine eigene IF Funktion haben ? Ich will das alles irgendwie zusammenfassen, ich will nicht für 15 Zahlen , Fünfzehn IF's in meinem Programm stehen haben - das wäre nicht schwer , jedoch sehr umständlich und am Ende auch unübersichtlich. Ihr habt da sicher eine Idee. if (Durchlauf <= 15) { }
:
Bearbeitet durch User
1 | if (wert & 0x01) { |
2 | led1 an; |
3 | } |
4 | |
5 | if (wert & 0x02) { |
6 | led2 an; |
7 | } |
8 | |
9 | if (wert & 0x04) { |
10 | led3 an; |
11 | } |
12 | |
13 | if (wert & 0x04) { |
14 | led4 an; |
15 | } |
Falls die 4 LEDs an einem Port an den Pins 0, 1, 2, 3 hängen, kannst Du es auch direkt an den Port geben; falls sie an höheren Pins, die aber trotzdem zusammenhängend sind, vorher entsprechend schieben (wert >> x). Suchbegriffe um das zu verstehen, was Du brauchst: Bitmasken, bitweise Operationen.
unten natürlich 0x08 Hint: Der Windows Standard-Taschenrechner kann in der "Programmierer"-Ansicht Bitmasken, Hexzahlen und Dezimalzahlen darstellen, das hilft oft.
Ich habe dann nur das Problem, dass wenn ich bei der Zahl 3 bin, nicht die dritte und vierte LED gleichzeitig zusammen leuchten: 0011 so schaut das zurzeit bei mir aus:
1 | if (Durchlauf <= 15) |
2 | {
|
3 | if (Durchlauf & 0x01) |
4 | {
|
5 | PORTD = 0x10; |
6 | }
|
7 | |
8 | if (Durchlauf & 0x02) |
9 | {
|
10 | PORTD = 0x20; |
11 | }
|
12 | |
13 | if (Durchlauf & 0x04) |
14 | {
|
15 | PORTD = 0x40; |
16 | }
|
17 | |
18 | if (Durchlauf & 0x08) |
19 | {
|
20 | PORTD = 0x80; |
21 | }
|
bei mir sind die oberen 4 Bits die Ausgänge (LEDs) deswegen steht da 0x80 zB 1000 (0000) das heist die LED ganz links leuchtet. wie mans dreht und wendet kanns die 4te oder 1te sein.
:
Bearbeitet durch User
Stefan S. schrieb: > PORTD = 0x10; Du willst nicht den ganzen Port beschreiben, sondern du willst genau und nur das eine Bit auf 1 setzen, an dessen Pin die jeweilige LED hängt! Bitoperationen um ein einzelnes Bit an einem Port zu setzen wirst du ja wohl schon gelernt haben.
Stefan S. schrieb: > das heist die LED ganz links leuchtet. wie mans dreht und wendet kanns > die 4te oder 1te sein. Nein kann es nicht. Wir fangen immer 'unten' zu zählen. Bei der kleinsten Stelle. In der Zahl 567 ist es auch nicht egal, ob du die 5 jetzt als Einer oder als Hunderter bezeichnest.
1 | 567 |
7 ist die Stelle 0, 6 ist die Stelle 1 und 5 ist die Stelle 2 (wir fangen bei 0 an zu zählen und das aus gutem Grund)
:
Bearbeitet durch User
1 | if (Durchlauf & 0x01) |
2 | {
|
3 | //PORTD &= ~(0xF0);
|
4 | PORTD |= (1<<PD4); |
5 | }
|
6 | |
7 | if (Durchlauf & 0x02) |
8 | {
|
9 | //PORTD &= ~(0xF0);
|
10 | PORTD |= (1<<PD5); |
11 | }
|
12 | |
13 | if (Durchlauf & 0x04) |
14 | {
|
15 | //PORTD &= ~(0xF0);
|
16 | PORTD |= (1<<PD6); |
17 | }
|
18 | |
19 | if (Durchlauf & 0x08) |
20 | {
|
21 | //PORTD &= ~(0xF0);
|
22 | PORTD |= (1<<PD7); |
23 | }
|
so klappts auch nicht und jap, das leuchtet ein, ist wenn man es dann so betrachtet, doch nicht egal
Stefan S. schrieb: > so klappts auch nicht Irgendwo wirst du eine bereits leuchtende LED auch wieder löschen müssen. Von alleine geht die nicht aus IM einfachsten Fall löschr du einfach alle 4 LED, egal ob sie leuchten oder nicht und setzt dann die Bits, die du benötigst wieder neu. Das geht so schnell, dass kein Mensch sieht, dass die für ein paar millionstel Sekunden nicht geleuchtet haben.
:
Bearbeitet durch User
Es leuchtet immer nur eine LED, egal ob mehrere LEDs leuchten sollten wie zB bei 3 die habe ich dort als Kommentar, die Funktion, PORTD &= ~(0xF0); aber auch mit der klappts nicht :(
:
Bearbeitet durch User
Stefan S. schrieb: > Es leuchtet immer nur eine LED, egal ob mehrere LEDs leuchten sollten > wie zB bei 3 Dann zeig dein komplettes Programm
hier ein Ausschnitt ( denn das Projekt ist ziemlich groß)
1 | if (!(PIND & (1<<PD2))) // WENN der blaue Taster gedrückt ist, DANN die Funktionen drinnen ausgeführt |
2 | {
|
3 | Durchlauf++; // Durchlaufsvariable |
4 | sprintf(StringDurchlauf, "%d", Durchlauf); // Die Funktion die es mir ermöglich, am Ende das am Display anzuzeigen. |
5 | // Ich weise dem StringDurchlauf den Wert Durchlauf zu.
|
6 | lcd_print(1,0,StringDurchlauf); // Wird angezeigt |
7 | Wartezeit(1); // Wartezeit-Funktion. HIER: 1000ms |
8 | |
9 | |
10 | |
11 | if (Durchlauf <= 15) // NUR WENN mein Wert unter oder gleich 15 ist, wirds ausgeführt |
12 | {
|
13 | if (Durchlauf & 0x01) |
14 | {
|
15 | PORTD &= ~(0xF0); |
16 | PORTD = 0x10; |
17 | }
|
18 | |
19 | if (Durchlauf & 0x02) |
20 | {
|
21 | PORTD &= ~(0xF0); |
22 | PORTD = 0x20; |
23 | }
|
24 | |
25 | if (Durchlauf & 0x04) |
26 | {
|
27 | PORTD &= ~(0xF0); |
28 | PORTD = 0x40; |
29 | }
|
30 | |
31 | if (Durchlauf & 0x08) |
32 | {
|
33 | PORTD &= ~(0xF0); |
34 | PORTD = 0x80; |
35 | }
|
36 | |
37 | |
38 | }
|
39 | |
40 | }
|
:
Bearbeitet durch User
Stefan S. schrieb: > Es leuchtet immer nur eine LED, egal ob mehrere LEDs leuchten sollten > wie zB bei 3 > die habe ich dort als Kommentar, die Funktion, PORTD &= ~(0xF0); > aber auch mit der klappts nicht :( Das würde alle 4 LED löschen. Wenn du das also aktivierst, dann löscht die jeweils 'höchste' LED erst mal alle 4 LED, ehe sie dann 'ihre' LED aktiviert. Logisch. Dadurch kann immer nur eine leuchten. Die höchstwertigste 'gewinnt'.
:
Bearbeitet durch User
1 | ....
|
2 | |
3 | if (Durchlauf <= 15) // NUR WENN mein Wert unter oder gleich 15 ist, wirds ausgeführt |
4 | {
|
5 | |
6 | // erst mal alle LED aus
|
7 | PORTD &= ~(0xF0); |
8 | |
9 | // und jetzt diejenigen LED wieder einschalten, die für die
|
10 | // Binärzahl benötigt werden
|
11 | if (Durchlauf & 0x01) |
12 | PORTD |= ( 1 << PD4 ); |
13 | |
14 | if (Durchlauf & 0x02) |
15 | PORTD |= ( 1 << PD5 ); |
16 | |
17 | ....
|
Stefan S. schrieb: > es hat sich leider nichts geändert, es leuchtet wieder nur eine LED Das kann nicht sein. Dein jetziger Code?
Okay, habs nachgeprüft, hab was falsch eingegeben. Sorry Es funktioniert jetzt, ich hab zu kompliziert gedacht.... Danke!!
Falls du das nicht geändert hast
1 | if (Durchlauf & 0x01) |
2 | {
|
3 | PORTD &= ~(0xF0); |
4 | PORTD = 0x10; |
5 | }
|
wie war das nochmal mit du sollst nur genau das eine Bit setzen, das du an dieser Stelle für genau diese LED brauchst? Wenn an PORTD etwas zuweist, dann veränderst du ALLE Bits. Du setzt hier
1 | PORTD = 0x10; |
nicht nur das Bit PD4 auf 1. Du setzt auch gleichzeitig alle anderen Bits auf 0! Und das gilt sinngemäss auch für alle anderen Fälle. Wenn also hier zum Beispiel
1 | PORTD = 0x80; |
die oberste LED eingeschaltet wird, dann schaltest du mit der Zuweisung die restlichen 3 LED aus!
Das ist nicht schlecht zu wissen, habe ich jetzt gelernt, dank euch! habs über Bit-Operatoren und mit viel Hilfe dann endlich hingekriegt
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.