Forum: Mikrocontroller und Digitale Elektronik 7 Segmentanzeige - multiplexen Integer mit Taster inkrementieren


von Peter N. (gizmo2308)


Lesenswert?

Hallo zusammen,

ich möchte einen Integer mittels Taster inkrementieren.
Habe folgenden Code geschrieben, aber der Wert wird ohne Tastendruck 
einfach hochgezählt.
Könnte mir jemand einen Tipp geben, was ich Falsch gemacht habe?
1
// Prozessor : Atmega8
2
#define  readout    PORTD
3
#define digit_1  0b00000000
4
#define digit_2  0b00010000
5
#define digit_3  0b00100000
6
#define digit_4  0b00110000
7
#define digit_5  0b01000000
8
#define digit_6  0b01010000
9
#define digit_7  0b01100000
10
#define digit_8  0b01110000
11
#define  value    PORTB
12
#define time     1
13
volatile uint16_t counter;
14
15
//----------------------------------------------------------------------
16
17
void initTimer0()
18
{
19
  TCCR0=0x03;              // prescaler 64
20
  TIMSK=0x01;              // mask INT Timer-Overflow
21
}
22
23
void initPorts()
24
{
25
  // PD4...PD6 Demultiplexer
26
  DDRD |= (1<<PD4) | (1<<PD5) | (1<<PD6);
27
  // PB0...PB4 Decoder
28
  DDRB |= (1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB3) | (1<<PB4);
29
30
  DDRD  = 0b01110000;                // PortD = Input
31
  PORTD = 0b00000100;                // pull-up
32
33
}
34
35
void SectionToSegment(uint16_t ivalue)
36
{
37
  char ziffer1 = 0;
38
  char ziffer2 = 0;
39
  char ziffer3 = 0;
40
41
  while(ivalue>=100)
42
  {
43
    ziffer1+=1;
44
    ivalue+=-100;
45
  }
46
  while(ivalue>=10)
47
  {
48
    ziffer2+=1;
49
    ivalue+=-10;
50
  }
51
52
  ziffer3=ivalue;
53
54
  value = ziffer1;
55
  readout = digit_1;
56
  waitMs(time);
57
58
  value = ziffer2;
59
  readout = digit_2;
60
  waitMs(time);
61
62
  value = ziffer3;
63
  readout = digit_3;
64
  waitMs(time);
65
66
}
67
68
//----------------------------------------------------------------------
69
main ()                // main program, startet bei Power ON und Reset
70
{
71
  initPorts();          // Initialize Ports
72
  sei();                       // enable interrupts
73
  do 
74
  {
75
76
    if (!(PIND&0x04))
77
      PORTB = counter++;
78
79
    SectionToSegment(counter);
80
  }
81
  while (true);          // End of loop mainloop
82
}

von Karl H. (kbuchegg)


Lesenswert?

Peter Nick schrieb:

> Könnte mir jemand einen Tipp geben, was ich Falsch gemacht habe?

Du hast da einen ziemlichen Pallawatsch drinnen.
An manchen Stellen bin ich mir nicht wirklich sicher, iob du weißt, was 
die Zeichen bedeuten, die du hingeschrieben hast.

Zum Problem
1
    if (!(PIND&0x04))
2
      PORTB = counter++;
3
    SectionToSegment(counter++);

wenn du hier beim Funktionsaufruf von SectionToSegment dem Argument 
counter ein ++ nachhängst, dann wird counter selbstverständlich erhöht. 
So wie immer, wenn einer Variablen ein ++ angehängt wird. Das ++ 
bedeutet: um 1 erhöhen.
Und dieses Eerhöhen hier beim Funktionsaufruf ist in keiner Weise davon 
abhängig ob am PIND das bewusste Bit auf 0 oder auf 1 ist. Ergo: Es wird 
immer erhöht.

von Karl H. (kbuchegg)


Lesenswert?

1
  while(value>=100)
2
  {
3
    ziffer1+=1;
4
    value+=-100;

man darf eine Subtraktion ruhig als
1
    value -= 100;
schreiben.

Auch würde ich dir empfehlen, mit Leerzeichen nicht so geizig zu sein. 
Seit Kindesbeinen hast du dein Gehirn darauf trainiert, dass zwischen 
Wörtern ein Leerraum steht. Dein Gehirn ist darauf trainiert, Wörter in 
einem Text genau an diesem Leerraum schnell zu erkennen. Was passiert, 
wenn man diesen Leerraum nicht macht, 
dasistganzschnellaneinemBeispieldemonstriert. Hattest du 
Schweirigkeiten, den letzten Satzteil zu lesen? War das anstrengend und 
hattest du das Gefühl, das dir da jemand absichtlich Prügel zwischen die 
Beine wirft? Warum machst du dann genau dasselbe in deinem Programmen? 
Auch ein Programm besteht aus Wörtern. Du hast schon mit der Bedeutung 
der Wörter bzw. der Bedeutung dessen, was die 'Wortzusammenstellungen' 
aussagen genug zu kämpfen. Du musst dir nicht auch noch Prügel zwischen 
die Beine werfen, indem du es dir selbst schwer machst, erst mal die 
Wörter in dem Zeichenwust überhaupt zu finden.
1
  while( value >= 100 )
2
  {
3
    ziffer1 += 1;
4
    value -= 100;
5
  }
um wieviel leichter ist das zu lesen, wenn man ausnutzt, dass dein 
Gehirn auf Leerräume trainiert ist.

von Peter N. (gizmo2308)


Lesenswert?

> wenn du hier beim Funktionsaufruf von SectionToSegment dem Argument
> counter ein ++ nachhängst, dann wird counter selbstverständlich erhöht.
> So wie immer, wenn einer Variablen ein ++ angehängt wird. Das ++
> bedeutet: um 1 erhöhen.
> Und dieses Eerhöhen hier beim Funktionsaufruf ist in keiner Weise davon
> abhängig ob am PIND das bewusste Bit auf 0 oder auf 1 ist. Ergo: Es wird
> immer erhöht.

Hallo Karl Heinz,
habe ich soeben bemmerkt, hatte einen Copy Paste Fehler.

von Karl H. (kbuchegg)


Lesenswert?

Peter Nick schrieb:

> Hallo Karl Heinz,
> habe ich soeben bemmerkt, hatte einen Copy Paste Fehler.

Als Fragesteller ist es aber keine gute Idee, wenn du nachträglich dein 
Posting editierst und damit das Gefragte komplett umdrehst. Tippfehler 
zu korrigieren ist ok, nachträglich Ergänzungen anbringen ist ok. Aber 
deine Veränderung dreht die Frage komplett um. Denn jetzt ist es nicht 
mehr der Funktionsaufruf, in dem der ++ vorkommt, sondern du hast eine 
2.te Abfrage drinnen, die vorher nicht da war. Aber selbst bei dieser 
Abfrage muss ich mich fragen: Ja, was erwartet er eigentlich?
Da steh
1
    if( PO ....

und jetzt hast du nochmal ausgebessert, wobei du der Frage die komplette 
Grundlage entzogen hast. Jetzt siehst du dämlich aus, weil du im 
Begleittext nach etwas fragst, was sich in der jetzigen Version im Code 
nicht mehr wiederfindet. Und ich seh auch dämlich aus, weil ich auf 
etwas eingehe, was in deinem Code nicht mehr vorkommt.

So funktioniert das nicht. Wenn du änderst, dann darfst du nicht grob 
sinnentstellend ändern. Vor allen Dingen wenn du bemerkst, dass da schon 
jemand darauf eingegangen ist.
Ich bin raus.

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.