Variable hochzählen und ausgeben(String)

OP #4374962
Lesenswert?
• ▲
▼
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.
OP #4375028
Lesenswert?
• ▲
▼
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)
{

}
Gast #4375085
Lesenswert?
• ▲
▼
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.
OP #4375114
Lesenswert?
• ▲
▼
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.
#4375292
Lesenswert?
• ▲
▼
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)
OP #4375299
Lesenswert?
• ▲
▼
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
#4375307
Lesenswert?
• ▲
▼
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.
OP #4375314
Lesenswert?
• ▲
▼
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
    }
#4375315
Lesenswert?
• ▲
▼
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'.
#4375316
Lesenswert?
• ▲
▼
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
        ....
#4375330
Lesenswert?
• ▲
▼
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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren