Unterprogramme automatischer Aufruf nach dem Hochzählen

Gast #3948314
Lesenswert?
• ▲
▼
Hallo,

so nun zu meiner Frage. Ich habe 27 LED´s die über 12Bit angesteuert 
werden (8 Bit PORTA, 4 LOWBit PORTB). Da ich für jede LED PORTA und 
PORTB definieren muss, habe ich diese in ein Unterprogramm 
ausgegliedert:
1
void LED1( void )
2
{
3
  PORTA=0x01;
4
  PORTB=0x0c;
5
}
6
void LED2()
7
{
8
  PORTA=0x02;
9
  PORTB=0x0c;
10
}
11
void LED3()
12
{
13
  PORTA=0x04;
14
  PORTB=0x0c;
15
}
16
void LED4()
17
{
18
  PORTA=0x08;
19
  PORTB=0x0c;
20
}
21
void LED5()
22
{
23
  PORTA=0x10;
24
  PORTB=0x0c;
25
}
26
void LED6()
27
{
28
  PORTA=0x20;
29
  PORTB=0x0c;
30
}
31
void LED7()
32
{
33
  PORTA=0x40;
34
  PORTB=0x0c;
35
}
36
.
37
.
38
.
39
.
40
.

Nun wäre es bei einem Lauflicht zum Programmieren total einfach, wenn 
ich die in einem weiteren Unterprogramm einfach dann die Methode LEDX 
mit der entsprechenden Zahl aufrufen kann, die dann immer hochgezählt 
wird.
Hier nur ein unfertiger Ausschnitt:
1
void Lauflicht()
2
{
3
  LEDX(); 
4
  X++;
5
  _delay_ms(10);
6
}
Also das X soll sich immer ändern und die entsprechende LED aufrufen.

Ist der Ansatz überhaupt verfolgbar? In meinem C Buch habe ich dies 
nicht gefunden oder konnte es nicht zuordnen. Welche Möglichkeiten gibt 
es noch dies elegant und Profihaft zu lösen?

Vielen Dank im Voraus für alle konstruktiven Beiträge!
#3948322
Lesenswert?
• ▲
▼
Lies mal in deinem C-Buch das Kapitel über Arrays.
Du könntest jetzt die Funktionszeiger in ein solches packen, und dann 
per Index aufrufen.

Einfacher ist es allerdings, die Funktionen wegzulassen, und statt 
dessen die Werte für PortA und PortB in zwei Arrays zu speichern (oder 
ein Array mit structs), und dann auf die Werte per Index zugreifen.

Oliver
Gast #3948323
Lesenswert?
• ▲
▼
Lieber TO,

ich bedaure Dir mitteilen zu müssen, dass keine konstruktiven Beiträge 
möglich sind, die nicht auch als potentiell beleidigend aufgefasst 
werden können - es sei denn Du bist unter 12 Jahre alt.

Um ganz sicher zu gehen, teile bitte mit, welche Art von "konstruktiven 
Beitrag" Du genau wünschst.
#3948475
Lesenswert?
• ▲
▼
Der Trick ist, zu erkennen, worin sich Dein Wust an Funktionen 
unterscheidet.
Und schwups ist nur noch eine einzige Funktion mit Argument:
1
void set_led( uint8_t n )
2
{
3
  uint16_t mask;
4

5
  mask = 1<<n;           // convert number to bit mask
6
  PORTA = mask;          // low byte
7
  PORTB = mask>>8;       // high byte
8
}

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.