Compiler & IDEs
›
Thread
zugriff auf einen 2D Array
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 LED s in spalte 5
aufleuchten.
bei led(0,...) sind alle LED s 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 LED s.
kopiere ich aus dem Array die Spaltenwerte per Hand leuchten jedoch auch
die richtigen LED s.
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 2 dim 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!
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
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
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
Noch kein Account?
Die Registrierung ist kostenlos und dauert nur eine Minute.
Jetzt registrieren