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!
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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
|