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.