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 ?
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)
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; }
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.
1 | #include <avr/io.h> |
2 | #include <avr/pgmspace.h> |
3 | #include <inttypes.h> |
4 | |
5 | #define ARRAY_LENGTH(x) ( sizeof( x ) / sizeof( x[0] ) )
|
6 | |
7 | int feld [] PROGMEM = { 1,2,4,8,16,32,64,128,256} |
8 | #define FELD_LENGTH ARRAY_LENGTH(feld)
|
9 | |
10 | int main(void) |
11 | {
|
12 | int a; |
13 | |
14 | DDRA = 0xff; |
15 | while(1) |
16 | {
|
17 | for (a = 0 ; a < FELD_LENGTH; a++) |
18 | {
|
19 | PORTA = pgm_read_byte( &feld[a] ); |
20 | }
|
21 | }
|
22 | return 0; |
23 | }
|
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.
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)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.