zugriff auf einen 2D Array

OP #1261405
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!
Persönliche Seite #1261419
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

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.