Forum: Compiler & IDEs zugriff auf einen 2D Array


von Matthias N. (damaev)


Lesenswert?

zz progge ich eine 20x8 LED-Anzeige.
mit der Funktion led() lässt sich jede LED auf dem Display ansteuern;
led(0xFF,5) btw. led(0b00000000,5) lässt alle LEDs in spalte 5 
aufleuchten.
bei led(0,...) sind alle LEDs aus

nun habe ich folgendes Problem:
Es ist ein 2D Array vorgegeben, der die Spaltenwerte der eines 
Buchstaben wiedergibt. Nur funktioniert entweder das Auslesen des Arrays 
nicht korrekt,
oder das schreiben des Arrays führt zu Fehlern. Eine Fehlermeldung liegt 
jedoch nicht vor, es leuchten einfach immer die falschen LEDs.

kopiere ich aus dem Array die Spaltenwerte per Hand leuchten jedoch auch 
die richtigen LEDs.


Hier mein Code ohne die Funktion LED und Portsteuerung
1
#include<avr/io.h>
2
#include<avr/interrupt.h>
3
#include<avr/pgmspace.h> 
4
#include<ascii-set-4.h>
5
6
unsigned char wort[50];
7
8
9
int main(void) {
10
11
12
int i;
13
for(i=0;i<6;i++)
14
  wort[i]=ascii_generator [72][i%6]; werte aus 2dim array nehmen
15
16
for(i=0;i<6;i++)
17
  led(wort[i],i); // LED anschalten in Reihe i mit Wert WORT[i]
18
}


und hier ein ausschnitt aus dem 2D Array (mit Anfang):
1
// ASCII-Generator für alle Zeichen im Bereich: 0..255 abgelegt im FLASH-Speicher
2
//flash unsigned char  ascii_generator [256][6] =  //für CodeVision-C-Compiler
3
4
unsigned char  ascii_generator [256][6] PROGMEM =  //für WINAVR-C-Compiler
5
.
6
.
7
.
8
// Zeichen 64 bis 71
9
  0x32, 0x49, 0x79, 0x41, 0x3e, 0x00, 0x7e, 0x09, 0x09, 0x09, 0x7e, 0x00, // @ und A
10
  0x7f, 0x49, 0x49, 0x49, 0x36, 0x00, 0x3e, 0x41, 0x41, 0x41, 0x22, 0x00, // B und C
11
  0x7f, 0x41, 0x41, 0x22, 0x1c, 0x00, 0x7f, 0x49, 0x49, 0x49, 0x41, 0x00, // D und E
12
  0x7f, 0x09, 0x09, 0x09, 0x01, 0x00, 0x3e, 0x41, 0x49, 0x49, 0x7a, 0x00, // F und G
13
  // Zeichen 72 bis 79
14
  0x7f, 0x08, 0x08, 0x08, 0x7f, 0x00, 0x00, 0x41, 0x7f, 0x41, 0x00, 0x00, // H und I
15
  0x20, 0x41, 0x41, 0x3f, 0x01, 0x00, 0x7f, 0x08, 0x14, 0x22, 0x41, 0x00, // J und K
16
  0x7f, 0x40, 0x40, 0x40, 0x40, 0x00, 0x7f, 0x02, 0x0c, 0x02, 0x7f, 0x00, // L und M
17
  0x7f, 0x04, 0x08, 0x10, 0x7f, 0x00, 0x3e, 0x41, 0x41, 0x41, 0x3e, 0x00, // N und O
18
.
19
.
20
.
21
};
!der 2D Array soll im Flash stehn!

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Das Array sollte const sein.

Um daraus zu lesen, gibt's die pgm_read_byte bzw. memcpy_P aus 
avr/pgmspace.h
   http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html#g73084a8bbde259ffae72980354b3f027

In deinem Falle dann:
1
memcpy_P (wort, & ascii_generator[72][0], 6);

Zudem sollte der Initializer eher so aussehen:
1
const unsigned char ascii_generator[256][6] PROGMEM =
2
{
3
  { 0x32, 0x49, 0x79, 0x41, 0x3e, 0x00 }, // @
4
  { 0x7e, 0x09, 0x09, 0x09, 0x7e, 0x00 }, // A
5
  ...
6
};

Johann

von Matthias N. (damaev)


Lesenswert?

danke

läuft :)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Das Kopieren in das lokale Array wort ist überigens überflüssig. Du 
kannst der Routine led auch einfach die Adresse
1
& ascii_generator[72][0]
übergeben, sofern du innerhalb von led den richtigen Zugriff tätigst.

Johann

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.