Hallo an alle,
wenn ich versuche Werte in ein Array zu schreiben, habe ich das Problem,
dass nicht immer die Werte auch im Array stehen.
Funktioniert NICHT:
1
charlevel1[8]={0,10,17,21,17,10,0,0};
Funktioniert NICHT:
1
charlevel1[]={0,10,17,21,17,10,0,0};
Funktioniert:
1
charlevel1[8];
2
3
level1[0]=0;
4
level1[1]=10;
5
level1[2]=17;
6
level1[3]=21;
7
level1[4]=17;
8
level1[5]=10;
9
level1[6]=0;
10
level1[7]=0;
Nur bei der letzten Variante befinden sich die Werte auch im Array wenn
ich diese zum Beispiel am Display ausgebe. Woran könnte das liegen? Die
anderen Varianten müssten doch auch gehen, oder?
lg Nino
Compilierbares komplettes Beispiel.
Da wir davon ausgehen können, dass jeder C Compiler das Initialisieren
eines Arrays beherrscht, muss das Problem im Umfeld dieser
Initialisierung liegen.
Ich habe nun den Fehler gefunden. War echt gut versteckt.
Im Makefile meines projektes und der libraries hatte ich -Os stehen und
wie es scheint hat das nach dem Update der AVR Toolchain und WinAVR
etwas zu viel beschnitten.
Nachdem ich die makefiles auf -O0 geändert habe, funktioniert diese
Zuweisung wieder.
Echt seltsam. Habe es auch nur durch Zufall gefunden, da ich zeitgleich
nach dem Update Probleme mit dem Display hatte.
Nino K. schrieb:> Nachdem ich die makefiles auf -O0 geändert habe, funktioniert diese> Zuweisung wieder.
Das ist keine Zuweisung, sondern eine Intialisierung.
Und mit dem Abschalten des Optimizers hast du nur den eigentlichen
Fehler versteckt aber nicht beseitigt. Drinn ist er immer noch, nur gibt
es jetzt keinen Optimizer mehr, der ihn gnadenlos ausnutzen würde.
Hi Karl Heinz,
da muss ich die leider recht geben. Denn in einem anderen Zusammenhang
funktioniert es wieder nicht. :-(
Dieser Code funktioniert. Da habe ich wieder zeilenweise das Array
befüllt. Es wird am Display ein Ball angezeigt.
1
#define F_CPU 14745600
2
3
#include<stdio.h>
4
5
#include<avr/io.h>
6
#include<avr/pgmspace.h>
7
8
#include<inttypes.h>
9
#include<string.h>
10
11
#include<util/delay.h>
12
#include"../libnerdkits/delay.h"
13
#include"../libnerdkits/lcd.h"
14
15
intmain(void){
16
17
// Local Variables (The Arrays haven been set to a size of 12 to increase afterwards)
18
19
charlevel1[8];
20
21
level1[0]=0;
22
level1[1]=10;
23
level1[2]=17;
24
level1[3]=21;
25
level1[4]=17;
26
level1[5]=10;
27
level1[6]=0;
28
level1[7]=0;
29
30
inti=0;
31
32
// fire up the LCD
33
lcd_init();
34
lcd_home();
35
36
lcd_set_type_command();// Change into command mode
37
lcd_write_byte(0x40);// Change to CGRAM to store custom character - at 0x00
38
lcd_set_type_data();// Change into data mode
39
40
for(i=0;i<8;i++)
41
{
42
lcd_write_byte(level1[i]);
43
}
44
45
lcd_set_type_command();// Change into command mode
46
lcd_write_byte(0x80);// Change to DDRAM
47
48
lcd_set_type_data();
49
lcd_write_byte(0x00);// Show stored custom character on lcd screen
50
51
// busy loop
52
while(1){
53
54
// do nothing
55
}
56
57
return0;
58
}
Aber der folgende Code funktioniert nicht. Es wird am Display ein
Kästchen komplett ausgefüllt. Ich habe lediglich die Befüllung des
Arrays geändert.
1
#define F_CPU 14745600
2
3
#include<stdio.h>
4
5
#include<avr/io.h>
6
#include<avr/pgmspace.h>
7
#include<inttypes.h>
8
9
#include<string.h>
10
11
#include<util/delay.h>
12
#include"../libnerdkits/delay.h"
13
#include"../libnerdkits/lcd.h"
14
15
intmain(void){
16
17
// Local Variables (The Arrays haven been set to a size of 12 to increase afterwards)
18
19
intlevel1[8]={0,10,17,21,17,10,0,0};
20
21
inti=0;
22
23
// fire up the LCD
24
lcd_init();
25
lcd_home();
26
27
lcd_set_type_command();// Change into command mode
28
lcd_write_byte(0x40);// Change to CGRAM to store custom character - at 0x00
29
lcd_set_type_data();// Change into data mode
30
31
for(i=0;i<8;i++)
32
{
33
lcd_write_byte(level1[i]);
34
}
35
36
lcd_set_type_command();// Change into command mode
37
lcd_write_byte(0x80);// Change to DDRAM
38
39
lcd_set_type_data();
40
lcd_write_byte(0x00);// Show stored custom character on lcd screen
>Ich habe lediglich die Befüllung des
Arrays geändert.
Nur ein Hinweis: Du hast mehr geändert: Du hast den Typ von level1 von
char nach int geändert. Das kann der entscheidene Unterschied sein.
Schau Dir mal eventuelle Warnings an. Auch ein Blick ins Mapping-File
könnte sachdienliche Hinweise liefern (welche Variablen liegen
vor/hinter dem betroffenen Array, welcher Code greift auf diese zu,
usw.)
Stefan Ernst schrieb:> Keine data-Section => keine Initialisierungsdaten für das Array
Vielen Dank Stefan, das war die Lösung.
Habe nun die Zeile im Makefile angepasst, nun passen die Werte vom
Array.