www.mikrocontroller.net

Forum: Compiler & IDEs zugriff auf einen 2D Array


Autor: Matthias N. (damaev)
Datum:

Bewertung
0 lesenswert
nicht 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
#include<avr/io.h>
#include<avr/interrupt.h>
#include<avr/pgmspace.h> 
#include<ascii-set-4.h>

unsigned char wort[50];


int main(void) {


int i;
for(i=0;i<6;i++)
  wort[i]=ascii_generator [72][i%6]; werte aus 2dim array nehmen

for(i=0;i<6;i++)
  led(wort[i],i); // LED anschalten in Reihe i mit Wert WORT[i]
}


und hier ein ausschnitt aus dem 2D Array (mit Anfang):
// ASCII-Generator für alle Zeichen im Bereich: 0..255 abgelegt im FLASH-Speicher
//flash unsigned char  ascii_generator [256][6] =  //für CodeVision-C-Compiler

unsigned char  ascii_generator [256][6] PROGMEM =  //für WINAVR-C-Compiler
.
.
.
// Zeichen 64 bis 71
  0x32, 0x49, 0x79, 0x41, 0x3e, 0x00, 0x7e, 0x09, 0x09, 0x09, 0x7e, 0x00, // @ und A
  0x7f, 0x49, 0x49, 0x49, 0x36, 0x00, 0x3e, 0x41, 0x41, 0x41, 0x22, 0x00, // B und C
  0x7f, 0x41, 0x41, 0x22, 0x1c, 0x00, 0x7f, 0x49, 0x49, 0x49, 0x41, 0x00, // D und E
  0x7f, 0x09, 0x09, 0x09, 0x01, 0x00, 0x3e, 0x41, 0x49, 0x49, 0x7a, 0x00, // F und G
  // Zeichen 72 bis 79
  0x7f, 0x08, 0x08, 0x08, 0x7f, 0x00, 0x00, 0x41, 0x7f, 0x41, 0x00, 0x00, // H und I
  0x20, 0x41, 0x41, 0x3f, 0x01, 0x00, 0x7f, 0x08, 0x14, 0x22, 0x41, 0x00, // J und K
  0x7f, 0x40, 0x40, 0x40, 0x40, 0x00, 0x7f, 0x02, 0x0c, 0x02, 0x7f, 0x00, // L und M
  0x7f, 0x04, 0x08, 0x10, 0x7f, 0x00, 0x3e, 0x41, 0x41, 0x41, 0x3e, 0x00, // N und O
.
.
.
};
!der 2D Array soll im Flash stehn!

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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__...

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

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

Johann

Autor: Matthias N. (damaev)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke

läuft :)

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

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

Johann

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.