www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Wie verschachtle ich Arrays?


Autor: Geri G. (heimo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich habe folgende Frage:

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

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?

while (1)
{  
    if (!(PINC & (1<<PINC7)) && i<=9)    // if Button on PC7 = low
    {
      PORTA = tabelle[i];          // aufwärts zählen
      _delay_ms(10);
      i++;
    }
    if(!(PINC & (1<<PINC6)) && i>=0)    // if Button on PC6 = low
    {
      PORTA= tabelle[i];          // abwärts zählen
      _delay_ms(10);
      i--;
    }

    if (!(PINC & (1<<PINC5)) && i<=9)    // if Button on PC5 = low
    {
      PORTB = tabelle[i];          // aufwärts zählen
      _delay_ms(10);
      i++;
    }
    if(!(PINC & (1<<PINC4)) && i>=0)    // if Button on PC4 = low
    {
      PORTB= tabelle[i];          // abwärts zählen
      _delay_ms(10);
      i--;
    }

    if (!(PINC & (1<<PINC3)) && i<=9)    // if Button on PC3 = low
    {
      PORTD = tabelle[i];          // aufwärts zählen
      _delay_ms(10);
      i++;
    }
    if(!(PINC & (1<<PINC2)) && i>=0)    // if Button on PC2 = low
    {
      PORTD= tabelle[i];          // abwärts zählen
      _delay_ms(10);
      i--;
    }    
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

// Globale Variablen
int8_t ai, bi, ci; // signed!
const uint8_t tabelle[10]=  // uint8_t reicht
  {           
    1,2,3,4,5,6,7,8,9,10
  }

// Defines
#define MIN(a,b) ((a)<(b) ? (a) : (b))
#define MAX(a,b) ((a)>(b) ? (a) : (b))

  while (1)
  {  
    if (!(PINC & (1<<PINC7))) ai++;
    if (!(PINC & (1<<PINC6))) ai--;
    if (!(PINC & (1<<PINC5))) bi++;
    if (!(PINC & (1<<PINC4))) bi--;
    if (!(PINC & (1<<PINC3))) ci++;
    if (!(PINC & (1<<PINC2))) ci--;

    // Wertebereich begrenzen
    ai = MIN(9, MAX(ai, 0));
    bi = MIN(9, MAX(bi, 0));
    ci = MIN(9, MAX(ci, 0));

    // Ausgeben
    PORTA = tabelle[ai];
    PORTB = tabelle[bi];
    PORTD = tabelle[ci];

    // Kurz warten
    _delay_ms(10);
  }

ADD: Und den Artikel Entprellung lesen!

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.