www.mikrocontroller.net

Forum: PC-Programmierung Tabellen einbinden


Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie bekomme ich Tabellen in cpp eingebunden.
ín Assembler läßt sich ja sowas mit LPM lösen und einer Tabelle z.B

Tabelle:
db 11,12,13,14,15,16,...

Wie funktioniert das in cpp ?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du legst dir ein Array an und initialisierst es mit den Werten?

An dieser Stelle wieder mal der Hinweis:
Ein vernünftiges Lehrbuch ist sein Gewicht in Silber wert! (Gold war mir 
jetzt zu teuer)

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Buch habe ich mittlerweile, habe nur unter dem falschen Kapitel gesucht

#include <avr/io.h>
#include <avr/pgmspace.h>
#include <inttypes.h>

int a;
int feld [] PROGMEM = { 1,2,4,8,16,32,64,128,256}

int main(void)
  {
   DDRA= 0xff;
   while(1)
   {
    for (a=0;a<=7;a++)
        {
           PORTA = pgm_read_byte(&feld[a]);

        }
  }
    return 0;
  }

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ingo Laabs wrote:
> Buch habe ich mittlerweile, habe nur unter dem falschen Kapitel gesucht

:-) Und im falschen Forum gepostet

> #include <avr/io.h>
> #include <avr/pgmspace.h>
> #include <inttypes.h>
>
> int a;
> int feld [] PROGMEM = { 1,2,4,8,16,32,64,128,256}
>
> int main(void)
>   {
>    DDRA= 0xff;
>    while(1)
>    {
>     for (a=0;a<=7;a++)
>         {
>            PORTA = pgm_read_byte(&feld[a]);
>
>         }
>   }
>     return 0;
>   }


Mir ist schon klar, dass es sich hier nur um ein Beispiel für das Forum 
handelt, trotzdem solltest du dir ein paar Dinge angewöhnen.

Ist dir schon aufgefallen, dass dein Array 9 Einträge hat, du aber nur 8 
ausgibst?
Gewöhn dir das <= in einer normalen Zähle-For Schleife wieder ab. Die 
Denkweise in C läuft normalerweise so, dass dort steht wie-oft die 
Schleife durchlaufen wird. Das ist universeller, als wenn man den 
höchsten zu benutzenden Index dort wiederfindet.
Solche magischen Zahlen im Code sind schlecht. Wenn du das Array 
vergrößerst oder verkleinerst, musst du quer durch den ganzen Code und 
diese Konstanten anpassen. Und das ist fehleranfällig. Lass den Compiler 
für dich arbeiten, wenns geht.
Halte den Scope für typische Zählvariablen (wie das a in deinem Fall) so 
klein wie möglich.
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <inttypes.h>
 
#define ARRAY_LENGTH(x)  ( sizeof( x ) / sizeof( x[0] ) ) 

int feld [] PROGMEM = { 1,2,4,8,16,32,64,128,256}
#define FELD_LENGTH   ARRAY_LENGTH(feld)

int main(void)
{
  int a;

  DDRA = 0xff;
  while(1)
  {
    for (a = 0 ; a < FELD_LENGTH; a++)
    {
      PORTA = pgm_read_byte( &feld[a] );
    }
  }
  return 0;
}

So ist die Gefahr gebannt. Alle Werte im Array werden ausgegeben. Wenn 
im Array mehr Werte dazukommen oder welche wegkommen, passt sich der 
Rest des Programmes automatisch an diese Änderung an.

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Code hat noch ein paar Probleme mehr:
- PORTA hat nur 8-Bit keine 16-Bit wie int, d.h. bei 256 kommt 0 beim 
Port an.
- Byte Order: Fällt hier zwar nicht auf, kann aber zu Problemen führen 
(zudem sollte statt pgm_read_byte das passendere pgm_read_word verwendet 
werden)

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.