Forum: Mikrocontroller und Digitale Elektronik Tabelle mit Variablen


von Lokus P. (derschatten)


Lesenswert?

Kann man einer tabelle keine Variablen zuordnen?
1
volatile uint8_t LED0;
2
#define LED1      (1<<PC1)
3
#define LED2      (1<<PC2)
4
#define LED3      (1<<PC3)
5
#define LED4      (1<<PC4)
6
#define LED5      (1<<PC5)
7
8
uint8_t KonfigPattern[NR_KONFIGS][NR_KEYS] PROGMEM =
9
  {
10
    {LED0,LED1,LED2,LED3,LED4,LED5},            // Konfiguration 1
11
    {LED0,LED2,LED4,LED1,LED3,LED5},            // Konfiguration 2
12
    {LED1,LED0,LED3,LED2,LED4,LED5},            // Konfiguration 3
13
    {LED0,LED2,LED4,LED1,LED3,LED5},            // Konfiguration 4
14
    {LED0,LED2,LED4,LED1,LED3,LED5},            // Konfiguration 5
15
    {LED0,LED2,LED4,LED1,LED3,LED5},            // Konfiguration 6
16
    {LED0,LED2,LED4,LED1,LED3,LED5},            // Konfiguration 7
17
    {LED0,LED2,LED4,LED1,LED3,LED5},            // Konfiguration 8
18
    {LED0,LED2,LED4,LED1,LED3,LED5},            // Konfiguration 9
19
   };

Ich hätte gerne das LED0 zb. eine Variable ist.
AVR Studio stellt sich da aber quer:

../main.c:75: error: initializer element is not constant

von Karl H. (kbuchegg)


Lesenswert?

Kauf dir endlich ein C-Buch und lern die Grundlagen.

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Manfred W. schrieb:
> uint8_t KonfigPattern[NR_KONFIGS][NR_KEYS] PROGMEM =

Bevor ich mich wieder in die Nesseln setzte:
Ich dachte PROGMEM sei der Programmspeicher, also das/der Flash; das 
heißt nicht veränderbar. Da können keine Variablen existieren.

Wenn Du eine variable Matrix haben möchtest, musst Du sie im RAM haben.
Natürlich kannst Du eine konstante Matrix im PROGMEM haben und diese bei 
Programmstart ins RAM kopieren. Dann sind alle Elemente variabel.

von Lokus P. (derschatten)


Lesenswert?

Also laut der Fehlermeldung:

"../main.c:75: error: initializer element is not constant"
kann eine Tabelle nur fixwerte verarbeiten.

Zumindest so wie ich sie verwende.

Ich denke nicht das es was damit zu tun hat wo die Tabelle gerade liegt.

von Klaus W. (mfgkw)


Lesenswert?

Leg sie doch mal ins RAM, dann wirst du sehen was es ausmacht...

von Klaus W. (mfgkw)


Lesenswert?

Abgesehen davon:
Welchen Sinn soll es haben, eine nicht initialisierte Variable
(deren Wert zufällig ist) wiederum zur Initalisierung von etwas
anderem zu verwenden?

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Eine Tabelle (bzw zweidimensionales Array), kann sehr wohl variable 
Werte beinhalten. Nur kann man sie nicht so setzen, wie oben angegeben.

Sondern nur so:
1
KonfigPattern[0][0] = LED0;
2
KonfigPattern[0][1] = LED1;

Eine nicht initialisierte Variable enthält trotzdem einen Wert. Nur ist 
dieser nicht Vorhersehbar. Dieser Wert kann aber ohne weiteres in eine 
zweidimentionales Array geschrieben werden.

Ok, nicht so wie es hier versucht wurde.

Natürlich wird bei einer Änderung von LED0 (also der nicht 
initialisierten Variable) nicht jedes Vorkommen von LED0 im Array 
verändert - falls das die Idee des TE war.

von Lokus P. (derschatten)


Lesenswert?

Christian H. schrieb:
> Natürlich wird bei einer Änderung von LED0 (also der nicht
>
> initialisierten Variable) nicht jedes Vorkommen von LED0 im Array
>
> verändert - falls das die Idee des TE war.

Also wenn ichd as richtig verstanden habe für die Nutzung eines Timers 
unbrauchbar?

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.