Forum: Mikrocontroller und Digitale Elektronik Unterprogramme automatischer Aufruf nach dem Hochzählen


von iGast (Gast)


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!

von Oliver S. (oliverso)


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

von Bitflüsterer (Gast)


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.

von Max M. (jens2001)


Lesenswert?

Also wenn dein C-Buch das wirklich nicht erklärt (definition, 
implementation u. aufruf von Funktionen) dann soltest du es verbrennen.
Aber das kann ich nicht glauben!

von iGast (Gast)


Lesenswert?

Danke für die Stichworte. Natürlich hat dies das Buch, aber der Leser 
davor konnte dies nicht zuordnen

von Peter D. (peda)


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
}

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.