Forum: PC-Programmierung Variable hochzählen und ausgeben(String)


von Stefan S. (derprogrammierer2)


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.

von egal (Gast)


Lesenswert?

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
}

von ?!? (Gast)


Lesenswert?

Zeig doch mal, was du bis jetzt hast und wo du nicht mehr weiter kommst.

von Stefan S. (derprogrammierer2)


Lesenswert?

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.

von Stefan S. (derprogrammierer2)


Lesenswert?

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
von Stefan S. (derprogrammierer2)


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)
{

}

: Bearbeitet durch User
von egal (Gast)


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.

von egal (Gast)


Lesenswert?

unten natürlich 0x08

Hint: Der Windows Standard-Taschenrechner kann in der 
"Programmierer"-Ansicht Bitmasken, Hexzahlen und Dezimalzahlen 
darstellen, das hilft oft.

von Stefan S. (derprogrammierer2)


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.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


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)

: Bearbeitet durch User
von Stefan S. (derprogrammierer2)


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

von Karl H. (kbuchegg)


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.

: Bearbeitet durch User
von Stefan S. (derprogrammierer2)


Lesenswert?

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
von Karl H. (kbuchegg)


Lesenswert?

Stefan S. schrieb:
> Es leuchtet immer nur eine LED, egal ob mehrere LEDs leuchten sollten
> wie zB bei 3

Dann zeig dein komplettes Programm

von Stefan S. (derprogrammierer2)


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
    }

: Bearbeitet durch User
von Karl H. (kbuchegg)


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'.

: Bearbeitet durch User
von Karl H. (kbuchegg)


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
        ....

von Stefan S. (derprogrammierer2)


Lesenswert?

es hat sich leider nichts geändert, es leuchtet wieder nur eine LED

von Karl H. (kbuchegg)


Lesenswert?

Stefan S. schrieb:
> es hat sich leider nichts geändert, es leuchtet wieder nur eine LED

Das kann nicht sein.
Dein jetziger Code?

von Stefan S. (derprogrammierer2)


Lesenswert?

Okay, habs nachgeprüft, hab was falsch eingegeben. Sorry

Es funktioniert jetzt, ich hab zu kompliziert gedacht....

Danke!!

von Karl H. (kbuchegg)


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!

von Stefan S. (derprogrammierer2)


Lesenswert?

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
Noch kein Account? Hier anmelden.