Forum: Mikrocontroller und Digitale Elektronik Wie verschachtle ich Arrays?


von Geri G. (heimo)


Lesenswert?

Hallo!

Ich habe folgende Frage:

In einem Hauptarray
1
const unsigned int tabelle[10]=
2
{           
3
  1,2,3,4,5,6,7,8,9,10
4
}

habe ich 10 Werte. Über 6 Taster werden die Tastendrücke (rauf oder 
runter) gezählt und pro Tastendruck soll der Taste a, b oder c der 
entsprechende Wert im Hauptarray zugewiesen und am jeweiligen Port 
ausgegeben werden.

Ich möchte aber nur ein einziges Hauptarray verwenden. Wie kann ich das 
am Besten lösen?

1
while (1)
2
{  
3
    if (!(PINC & (1<<PINC7)) && i<=9)    // if Button on PC7 = low
4
    {
5
      PORTA = tabelle[i];          // aufwärts zählen
6
      _delay_ms(10);
7
      i++;
8
    }
9
    if(!(PINC & (1<<PINC6)) && i>=0)    // if Button on PC6 = low
10
    {
11
      PORTA= tabelle[i];          // abwärts zählen
12
      _delay_ms(10);
13
      i--;
14
    }
15
16
    if (!(PINC & (1<<PINC5)) && i<=9)    // if Button on PC5 = low
17
    {
18
      PORTB = tabelle[i];          // aufwärts zählen
19
      _delay_ms(10);
20
      i++;
21
    }
22
    if(!(PINC & (1<<PINC4)) && i>=0)    // if Button on PC4 = low
23
    {
24
      PORTB= tabelle[i];          // abwärts zählen
25
      _delay_ms(10);
26
      i--;
27
    }
28
29
    if (!(PINC & (1<<PINC3)) && i<=9)    // if Button on PC3 = low
30
    {
31
      PORTD = tabelle[i];          // aufwärts zählen
32
      _delay_ms(10);
33
      i++;
34
    }
35
    if(!(PINC & (1<<PINC2)) && i>=0)    // if Button on PC2 = low
36
    {
37
      PORTD= tabelle[i];          // abwärts zählen
38
      _delay_ms(10);
39
      i--;
40
    }    
41
}

von Karl H. (kbuchegg)


Lesenswert?

Geri G. schrieb:

> Ich möchte aber nur ein einziges Hauptarray verwenden. Wie kann ich das
> am Besten lösen?

Indem du nicht für alle Tasten ein gemeinsames i benutzt, sondern für 
jede Taste eine seperate Variable benutzt, die eine Aussage darüber 
erlaubt, welcher Tabellenwert jetzt gerade für diese spezielle Taste 
zuständig ist.

(Und i, ist ein ganz schlechter Name für eine derart wichtige 
Information wie es der momentan gerade 'aktive' Tabelleneintrag für eine 
Taste darstellt)

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Nicht exakt das Gleiche beim _delay_ms(10); aber ich würde es so machen:

1
// Globale Variablen
2
int8_t ai, bi, ci; // signed!
3
const uint8_t tabelle[10]=  // uint8_t reicht
4
  {           
5
    1,2,3,4,5,6,7,8,9,10
6
  }
7
8
// Defines
9
#define MIN(a,b) ((a)<(b) ? (a) : (b))
10
#define MAX(a,b) ((a)>(b) ? (a) : (b))
11
12
  while (1)
13
  {  
14
    if (!(PINC & (1<<PINC7))) ai++;
15
    if (!(PINC & (1<<PINC6))) ai--;
16
    if (!(PINC & (1<<PINC5))) bi++;
17
    if (!(PINC & (1<<PINC4))) bi--;
18
    if (!(PINC & (1<<PINC3))) ci++;
19
    if (!(PINC & (1<<PINC2))) ci--;
20
21
    // Wertebereich begrenzen
22
    ai = MIN(9, MAX(ai, 0));
23
    bi = MIN(9, MAX(bi, 0));
24
    ci = MIN(9, MAX(ci, 0));
25
26
    // Ausgeben
27
    PORTA = tabelle[ai];
28
    PORTB = tabelle[bi];
29
    PORTD = tabelle[ci];
30
31
    // Kurz warten
32
    _delay_ms(10);
33
  }

ADD: Und den Artikel Entprellung lesen!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Über 6 Taster werden die Tastendrücke (rauf oder runter) gezählt
> und pro Tastendruck
Dann würde ich da noch eine Flankenerkennung für die Tasten vorschlagen. 
Denn sonst wird da blitzschnell hochgezählt...

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.