Forum: Compiler & IDEs String besteht nur aus 0xFF - Linkerproblem? AVR Studio 7


von Sascha S. (excess)


Angehängte Dateien:

Lesenswert?

Ahoi. Ich spiele gerade mit der seriellen Schnittstelle vom ATmega 2560 
rum und habe da ein String-Problem. Es handelt sich konkret um einen 
Arduino mit ATmega 2560, der mittels ISP & AVR Studio 7.0 programmiert 
wird (nicht über die Arduino IDE). Für die serielle Schnittstelle habe 
ich die allgemein etablierten Funktionen uart_putc und uart_puts 
verwendet. uart_putc (Char) funktioniert tadellos. uart_puts 
funktioniert nur für Strings mit einer Länge von 3-4 Zeichen. Bei 
längeren Strings werden nur 0xFF Bytes übertragen.

Hier meine Main-Loop.
1
  const char a[] PROGMEM = {'H','e','y',0};
2
3
  const char b[] PROGMEM = {'H','e','y',' ','o','u','t',' ','t','h','e','r','e',0};
4
  
5
  while (1){
6
    uart_puts(a);
7
    uart_putc('|');
8
    
9
    uart_puts(b);
10
    uart_putc('|');
11
    
12
    uart_puts("Hey out there");
13
    uart_putc('|');
14
    
15
    // A-Z
16
    for(char i='A';i<='Z';i++)
17
      uart_putc(i);
18
19
    uart_putc('\r');
20
    uart_putc('\n');
21
22
    _delay_ms(1000);
23
  }

Das Char-Array a wird korrekt ausgegeben, das Char-Array b nur noch als 
0xFF. Die Ausgabe schaut ungefähr so aus:
1
Hey|??????????????Hey|??????????????|ABCDEFGHIJKLMNOPQRSTUVWXYZ<\r><\n>
2
Hey|??????????????Hey|??????????????|ABCDEFGHIJKLMNOPQRSTUVWXYZ<\r><\n>
3
Hey|??????????????Hey|??????????????|ABCDEFGHIJKLMNOPQRSTUVWXYZ<\r><\n>

uart_puts ist wie gewohnt so:
1
void uart_puts (const char *s){
2
  while (*s)
3
    uart_putc( *s++ );
4
}

Nun vermute ich, dass irgendwas beim Linken schief läuft. Hier die 
Ausgabe vom Linker/AVR Studio:
1
Invoking: AVR8/GNU Linker : 4.9.2
2
    "C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-g++.exe" -o TestSIM.elf  main.o   -Wl,-Map="TestSIM.map" -Wl,--start-group -Wl,-lm  -Wl,--end-group -Wl,--gc-sections -mrelax -mmcu=atmega2560 -B "C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.0.90\gcc\dev\atmega2560"  
3
    Finished building target: TestSIM.elf
4
    "C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-objcopy.exe" -O ihex -R .eeprom -R .fuse -R .lock -R .signature -R .user_signatures  "TestSIM.elf" "TestSIM.hex"
5
    "C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-objcopy.exe" -j .eeprom  --set-section-flags=.eeprom=alloc,load --change-section-lma .eeprom=0  --no-change-warnings -O ihex "TestSIM.elf" "TestSIM.eep" || exit 0
6
    "C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-objdump.exe" -h -S "TestSIM.elf" > "TestSIM.lss"
7
    "C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-objcopy.exe" -O srec -R .eeprom -R .fuse -R .lock -R .signature -R .user_signatures "TestSIM.elf" "TestSIM.srec"
8
    "C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-size.exe" "TestSIM.elf"


Kennt jemand das Problem?

Danke für eure Hilfe,
Sascha

von Bernd (Gast)


Lesenswert?

1
const char __flash s1[] ="Start";
1
void putst(const __flash char *s)
2
...

von Oliver S. (oliverso)


Lesenswert?

Am Linker liegt es nicht, oder siehts du da eine Fehlermeldung?

Aber dein putc dürfte das Problem verursachen. Da du das aber nicht 
zeigst...

Schau dir im Tutorial nochmal das Kapitel zu Daten im Flash an.

Olivet

von Sascha S. (excess)


Lesenswert?

Bernd schrieb:
>
1
> const char __flash s1[] ="Start";
2
>
>
>
1
> void putst(const __flash char *s)
2
> ...
3
>

Funzt nicht...

von Sascha S. (excess)


Lesenswert?

Oliver S. schrieb:
> Am Linker liegt es nicht, oder siehts du da eine Fehlermeldung?
>
> Aber dein putc dürfte das Problem verursachen. Da du das aber nicht
> zeigst...
>
> Schau dir im Tutorial nochmal das Kapitel zu Daten im Flash an.
>
> Olivet

Nein, an putc liegt es nicht. Sonst würde doch A-Z nicht ausgegeben 
werden. Und putc sieht aus wie im Tutorial.

von Bernd (Gast)


Lesenswert?

> Funzt nicht...

Was funktioniert nicht? Wie sieht die Ausgabe aus?

von Bernd (Gast)


Lesenswert?

Ein Tipp: Gehe mit dem Simulator Schritt für Schritt durch dein 
Programm, dann sollte sich der Fehler offenbaren.

von Sascha S. (excess)


Lesenswert?

Bernd schrieb:
> Ein Tipp: Gehe mit dem Simulator Schritt für Schritt durch dein
> Programm, dann sollte sich der Fehler offenbaren.

Auch das habe ich schon gemacht und das sah gut aus. :-)

von Bernd (Gast)


Lesenswert?

Sascha S. schrieb:
> Bernd schrieb:
>> Ein Tipp: Gehe mit dem Simulator Schritt für Schritt durch dein
>> Programm, dann sollte sich der Fehler offenbaren.
>
> Auch das habe ich schon gemacht und das sah gut aus. :-)

Dann ist ja alles OK. Klinke mich hier aus.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Sascha S. schrieb:
>
1
void uart_puts (const char *s){
2
>   while (*s)
3
>     uart_putc( *s++ );
4
> }

Das liest aber aus dem RAM, nicht aus dem Flash.

Also muss hier __flash verwendet werden, und die Funktion funktioniert 
dann nur für Strings im Flash.  __flash muss dann auch der Address-Space 
sein in dem die (String-)Objekte liegen wie Bernd schon schrieb.

Oder eben die Asbach Lösung mit pgmspace.h + pgm_read_xxx.

: Bearbeitet durch User
von Isses denn wahr (Gast)


Lesenswert?

Bernd schrieb:
> Was funktioniert nicht? Wie sieht die Ausgabe aus?

Vielleicht so, wie im Anhang des ersten Beitrages?

Bernd schrieb:
> Dann ist ja alles OK. Klinke mich hier aus.

Besser ist das.

von Sascha S. (excess)


Angehängte Dateien:

Lesenswert?

Moin Männer, hier nochmal der komplette Code. Die Strings liegen nun im 
RAM und es sollten somit keine Verrenkungen bzgl. Speicherraum notwendig 
sein:
1
#define F_CPU 16000000UL
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
6
7
#define BAUD 9600UL
8
9
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)
10
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))
11
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD)
12
13
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
14
#error Systematischer Fehler der Baudrate groesser 1% und damit zu hoch!
15
#endif
16
17
18
void uart_init(void){
19
  UBRR0 = UBRR_VAL;
20
  UCSR0B |= (1<<TXEN0);
21
  UCSR0C = (1<<UCSZ01) | (1<<UCSZ00);
22
}
23
24
void  uart_putc(unsigned char c){
25
  while (!(UCSR0A & (1<<UDRE0))){}  
26
  UDR0 = c;
27
}
28
29
void uart_puts (const char *s){
30
  while (*s)
31
    uart_putc( *s++ );
32
}
33
34
35
int main(void){
36
  uart_init();
37
38
  const char a[] = "ABC";
39
40
  const char b[] = "CHAR-ARRAY";
41
42
  while (1){
43
    uart_puts(a);
44
    uart_putc('#');
45
    uart_puts(b);
46
    uart_putc('#');
47
    uart_puts("Longer String");
48
    uart_putc('#');
49
    for(char i='A';i<='Z';i++)
50
      uart_putc(i);
51
    uart_putc('\r');
52
    uart_putc('\n');
53
    _delay_ms(1000);
54
  }
55
}

Die Ausgabe sieht weiterhin so aus:
1
ABC#???????????ABC#??????????????????????????#ABCDEFGHIJKLMNOPQRSTUVWXYZ<\r><\n>
2
ABC#???????????ABC#??????????????????????????#ABCDEFGHIJKLMNOPQRSTUVWXYZ<\r><\n>


Interessant ist, dass das erste "ABC" richtig ausgespuckt wird.

Im Debugger sind die ?=0xFF Zeichen richtig belegt.

Als Anhang noch das LSS File.

Ich bin ratlos. :/

: Bearbeitet durch User
von Codix (Gast)


Lesenswert?

Sascha S. schrieb:
> Moin Männer,
Es gibt hier auch Frauen!



Der LSS-File entspricht nicht dem C-Code den Du hier gepostet hast.
Das wollte ich einmal festhalten. Denn das ist nicht gut, wenn man Dir 
helfen soll.
Lt. LSS-File ist das Array b falsch, das passt nicht.

Vorschlag:

Bereinige Dein Projekt mit Make Clean. Das 7er Studio kenne ich nicht, 
das sollte allerdings ein Menüpunkt unter Build sein.

Lösche alle Hex+Elf Files im Projekt-Ausgabeordner.
D.h., vor allem die Datei die auf den AVR schreibst.
Hast Du auch die richtige Datei verwendet?

Dann lösche ALLE const Definitionen. Auch in den uart-Routinen.
Wo hast Du denn die abgekupfert?

Danach änderst Du alle char (unsigned oder nicht) in uint8_t.


Schalte in der Compiler-Konfiguration die Warnings auf -Wall und die
Optimierung auf -O0 (keine Optimierung).

Jetzt solltest Du das Programm noch einmal compilieren und testen.

Sollte funktionieren.

von dennis restle (Gast)


Lesenswert?

a und b sind auf dem Stack der Mainroutine wenn ich das richtig sehe.
Wird der Bereich eventuell überschrieben?

von Sascha S. (excess)


Angehängte Dateien:

Lesenswert?

Hallo Codix & guten Morgen zusammen,

ich habe Codix Vorschläge durchprobiert und es ändert sich nichts an der 
Ausgabe. Habe extra ein neues Projekt angelegt, aber ohne Erfolg. Ich 
habe mal das komplette Projekt als ZIP angehängt.

Die const Anweisung hatte ich übrigens eingefügt, weil der Compiler 
diesbzgl. eine Warnung ausspuckte.

Die Programmierung des µC erfolgt über Atmel-Studio (F5) via ISP. Ich 
muss dazu keine Datei auswählen, sondern die IDE macht das für mich 
unmittelbar nach dem Kompilieren automatisch. Sonst wäre ein 
Entwicklungszyklus doch sehr umständlich. ;-)

Die Ausgabe bei der Compilierung:
1
------ Rebuild All started: Project: UART-Test, Configuration: Debug AVR ------
2
Build started.
3
Project "UART-Test.cproj" (Clean target(s)):
4
Target "Clean" in file "C:\Program Files (x86)\Atmel\Studio\7.0\Vs\Compiler.targets" from project "E:\avr-sandbox\Atmel AVR\UART-Test\UART-Test.cproj" (entry point):
5
  Task "RunCompilerTask"
6
    Shell Utils Path C:\Program Files (x86)\Atmel\Studio\7.0\shellUtils
7
    C:\Program Files (x86)\Atmel\Studio\7.0\shellUtils\make.exe clean 
8
    rm -rf  main.o   
9
    rm -rf  main.d   
10
    rm -rf "UART-Test.elf" "UART-Test.a" "UART-Test.hex" "UART-Test.lss" "UART-Test.eep" "UART-Test.map" "UART-Test.srec" "UART-Test.usersignatures"
11
  Done executing task "RunCompilerTask".
12
Done building target "Clean" in project "UART-Test.cproj".
13
Done building project "UART-Test.cproj".
14
15
Build succeeded.
16
------ Rebuild All started: Project: UART-Test, Configuration: Debug AVR ------
17
Build started.
18
Project "UART-Test.cproj" (default targets):
19
Target "PreBuildEvent" skipped, due to false condition; ('$(PreBuildEvent)'!='') was evaluated as (''!='').
20
Target "CoreBuild" in file "C:\Program Files (x86)\Atmel\Studio\7.0\Vs\Compiler.targets" from project "E:\avr-sandbox\Atmel AVR\UART-Test\UART-Test.cproj" (target "Build" depends on it):
21
  Task "RunCompilerTask"
22
    Shell Utils Path C:\Program Files (x86)\Atmel\Studio\7.0\shellUtils
23
    C:\Program Files (x86)\Atmel\Studio\7.0\shellUtils\make.exe all 
24
    Building file: .././main.c
25
    Invoking: AVR/GNU C Compiler : 4.9.2
26
    "C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-gcc.exe"  -x c -funsigned-char -funsigned-bitfields -DDEBUG  -I"C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.0.90\include"  -O0 -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -mrelax -g2 -Wall -Wextra -mmcu=atmega2560 -B "C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.0.90\gcc\dev\atmega2560" -c -std=gnu99 -MD -MP -MF "main.d" -MT"main.d" -MT"main.o"   -o "main.o" ".././main.c" 
27
    In file included from .././main.c:4:0:
28
c:\program files (x86)\atmel\studio\7.0\toolchain\avr8\avr8-gnu-toolchain\avr\include\util\delay.h(95,3): warning: #warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed" [-Wcpp]
29
     # warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed"
30
       ^
31
    .././main.c: In function 'main':
32
E:\avr-sandbox\Atmel AVR\UART-Test\main.c(45,16): warning: pointer targets in initialization differ in signedness [-Wpointer-sign]
33
       uint8_t *c = "LITERAL";
34
                    ^
35
E:\avr-sandbox\Atmel AVR\UART-Test\main.c(55,15): warning: pointer targets in passing argument 1 of 'uart_puts' differ in signedness [-Wpointer-sign]
36
         uart_puts("1234567890");
37
                   ^
38
E:\avr-sandbox\Atmel AVR\UART-Test\main.c(31,6): info: expected 'uint8_t *' but argument is of type 'char *'
39
     void uart_puts (uint8_t *s){
40
          ^
41
    Finished building: .././main.c
42
    Building target: UART-Test.elf
43
    Invoking: AVR/GNU Linker : 4.9.2
44
    "C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-gcc.exe" -o UART-Test.elf  main.o   -Wl,-Map="UART-Test.map" -Wl,--start-group -Wl,-lm  -Wl,--end-group -Wl,--gc-sections -mrelax -mmcu=atmega2560 -B "C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.0.90\gcc\dev\atmega2560"  
45
    Finished building target: UART-Test.elf
46
    "C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-objcopy.exe" -O ihex -R .eeprom -R .fuse -R .lock -R .signature -R .user_signatures  "UART-Test.elf" "UART-Test.hex"
47
    "C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-objcopy.exe" -j .eeprom  --set-section-flags=.eeprom=alloc,load --change-section-lma .eeprom=0  --no-change-warnings -O ihex "UART-Test.elf" "UART-Test.eep" || exit 0
48
    "C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-objdump.exe" -h -S "UART-Test.elf" > "UART-Test.lss"
49
    "C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-objcopy.exe" -O srec -R .eeprom -R .fuse -R .lock -R .signature -R .user_signatures "UART-Test.elf" "UART-Test.srec"
50
    "C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-size.exe" "UART-Test.elf"
51
       text     data      bss      dec      hex  filename
52
       1336       32        0     1368      558  UART-Test.elf
53
  Done executing task "RunCompilerTask".
54
  Task "RunOutputFileVerifyTask"
55
        Program Memory Usage   :  1368 bytes   0,5 % Full
56
        Data Memory Usage     :  32 bytes   0,4 % Full
57
  Done executing task "RunOutputFileVerifyTask".
58
Done building target "CoreBuild" in project "UART-Test.cproj".
59
Target "PostBuildEvent" skipped, due to false condition; ('$(PostBuildEvent)' != '') was evaluated as ('' != '').
60
Target "Build" in file "C:\Program Files (x86)\Atmel\Studio\7.0\Vs\Avr.common.targets" from project "E:\avr-sandbox\Atmel AVR\UART-Test\UART-Test.cproj" (entry point):
61
Done building target "Build" in project "UART-Test.cproj".
62
Done building project "UART-Test.cproj".
63
64
Build succeeded.
65
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========

Aufgrund der Umstellung von char auf uint8_t sind Warnungen 
hinzugekommen - aber vernachlässigbar.

Any Ideas?

Danke und einen schönen Freitag.

von Oliver S. (oliverso)


Lesenswert?

Sascha S. schrieb:
> Nein, an putc liegt es nicht. Sonst würde doch A-Z nicht ausgegeben
> werden. Und putc sieht aus wie im Tutorial.

Wie du meinst...

Du rufst puts mal mit Strings im Flash und man mit Strings im SRam auf. 
Eins von beiden kann nicht funktionieren. Aber poste ruhig weiter völlig 
sinnfreie Compilerausgaben. Ist dein Code und dein Problem...

Oliver

von Sascha S. (excess)


Lesenswert?

Oliver S. schrieb:
> Sascha S. schrieb:
>> Nein, an putc liegt es nicht. Sonst würde doch A-Z nicht ausgegeben
>> werden. Und putc sieht aus wie im Tutorial.
>
> Wie du meinst...
>
> Du rufst puts mal mit Strings im Flash und man mit Strings im SRam auf.
> Eins von beiden kann nicht funktionieren. Aber poste ruhig weiter völlig
> sinnfreie Compilerausgaben. Ist dein Code und dein Problem...
>
> Oliver

Hallo Oliver,

eben, ich habe uart_puts mal mit Strings ausm SRAM und mal ausm FLASH 
aufgerufen - um zu prüfen, welcher Speicher denn nun gelesen wird. 
Beides hat aber nicht geklappt. Wenn Du dir meine letzten Postings 
durchgelesen hast, dann siehst du, dass es auch bei einer 
RAM-only-Lösung nicht funktioniert.

Mit dem Debugger kann ich umgehen und da war alles OK.

Und ich bleibe dabei, dass mein uart_putc semantische dem aus dem 
Tutorial gleicht. :P

Tutorial:
1
int uart_putc(unsigned char c)
2
{
3
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
4
    {
5
    }                             
6
 
7
    UDR = c;                      /* sende Zeichen */
8
    return 0;
9
}

Meins:
1
void  uart_putc(unsigned char c){
2
  while (!(UCSR0A & (1<<UDRE0))){}  
3
  UDR0 = c;
4
}


VG,
Sascha

: Bearbeitet durch User
von Oliver S. (oliverso)


Lesenswert?

Und ich bleibe dabei, daß du das Kapitel zu Daten im Flash nicht gelesen 
hast. Schau dir das doch mal an.

Oliver

von MitLeser (Gast)


Lesenswert?

meiner Meinung nach hat const bei der Deklaration einer Variablen
im RAM nix zu suchen.

von Klaus (Gast)


Lesenswert?

MitLeser schrieb:
> meiner Meinung nach hat const bei der Deklaration einer Variablen
> im RAM nix zu suchen.

Dann hast Du eine falsche Meinung.

von Codix (Gast)


Lesenswert?

Letzte Idee von mir.
Es könnte sein, dass a und b innerhalb der main Probleme machen.
Was ich allerdings nicht wirklich glaube.

Aber zum Testen einfach die Deklaration global machen und
mit volatile versehen. Damit sollte sicher sein, dass der Compiler das
nicht mehr anfasst/irgend etwas optimiert.

Die Optimierung solltest Du wieder auf -O2 stellen, damit der Delay
sauber funktioniert.

Ausserdem solltest Du in den Compilereinstellungen des Studios -DF_CPU 
angeben und nicht im Source.
1
#define F_CPU 16000000UL // <- Das in den Compiler settings
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
6
7
#define BAUD 9600UL
8
9
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)
10
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))
11
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD)
12
13
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
14
#error Systematischer Fehler der Baudrate groesser 1% und damit zu hoch!
15
#endif
16
17
volatile uint8_t *a = "ABC";
18
19
volatile uint8_t *b = "CHAR-ARRAY";
20
21
void uart_init(void){
22
  UBRR0 = UBRR_VAL;
23
  UCSR0B |= (1<<TXEN0);
24
  UCSR0C = (1<<UCSZ01) | (1<<UCSZ00);
25
}
26
27
void  uart_putc(uint8_t c){
28
  while (!(UCSR0A & (1<<UDRE0))){}  
29
  UDR0 = c;
30
}
31
32
void uart_puts (uint8_t *s){
33
  while (*s)
34
    uart_putc( *s++ );
35
}
36
37
38
int main(void){
39
 
40
  uart_init();
41
42
 
43
44
  while (1){
45
        uart_puts(a);
46
        uart_putc('#');
47
        uart_puts(b);
48
        uart_putc('#');
49
        uart_puts("TEST STRING");
50
        uart_putc('#');
51
              for(uint8_t i='A';i<='Z';i++)
52
                  uart_putc(i);
53
        uart_putc('\r');
54
        uart_putc('\n');
55
        _delay_ms(1000);
56
  }
57
}

von Sascha S. (excess)


Lesenswert?

Danke Codix! Leider gibts weiterhin nur 0xFF.
Ich werde es morgen mal mit dem STK500 und anderen AVRs probieren - 
derzeit ist es ja ein Arduino mit ATmega 2560. Der ist im Gehäuse etwas 
praktischer auf der Couch, als das STK.

Mit großer Sicherheit kann man sagen, dass es ein Flash/Speicherproblem 
ist. Wenn ich ein char[] Buffer (RAM) definiere und die ASCII-Codes da 
nacheinder eintrage, dann klappt es. Weise ich dem char[] (RAM) einen 
String zu, klappt es nicht. Speichere ich einen String im FLASH und 
kopiere diesen in den char[] Buffer mittels strcpy_P, so hängt sich der 
µC weg. Beim Debugging in der Simulierung vom Atmel-Studio kann man sich 
die Speicherbereiche anschauen und es schaut alles i.O. aus.
Ich werde berichten, sobald ich neue Erkenntnisse habe. :)

Schönen Abend noch.


Codix schrieb:
> Letzte Idee von mir.
> Es könnte sein, dass a und b innerhalb der main Probleme machen.
> Was ich allerdings nicht wirklich glaube.
>
> Aber zum Testen einfach die Deklaration global machen und
> mit volatile versehen. Damit sollte sicher sein, dass der Compiler das
> nicht mehr anfasst/irgend etwas optimiert.
>
> Die Optimierung solltest Du wieder auf -O2 stellen, damit der Delay
> sauber funktioniert.
>
> Ausserdem solltest Du in den Compilereinstellungen des Studios -DF_CPU
> angeben und nicht im Source.

: Bearbeitet durch User
von Sascha S. (excess)


Lesenswert?

TADAAAA!

Mit dem STK 500 und einem ATMEGA 8151 funktioniert es problemlos (RAM & 
FLASH - Strings).

Nun kann man darüber Vermutungen anstellen, ob für den ATMEGA 2560 des 
Arduinos falsch kompiliert wurde, der µC eine Macke hat oder irgendetwas 
anderes im Busch ist. Mir ist es wurscht, denn ich war dem Wahnsinn 
schon sehr nahe und nun ist es gelöst. Der Fehler lag nicht in meinem 
Code.

Danke an diejenigen, die konstruktiv mitgeholfen haben. Und über die 
dussligen Kommentare schmunzel ich jetzt mal. ;-P

VG

: Bearbeitet durch User
von Innoran (Gast)


Lesenswert?

Sascha S. (excess) schrieb:

> Und über die dussligen Kommentare schmunzel ich jetzt mal. ;-P

Es ist schön, dass du über dich selbst lachen kannst.

von Sascha S. (excess)


Lesenswert?

Innoran schrieb:
> Sascha S. (excess) schrieb:
>
>> Und über die dussligen Kommentare schmunzel ich jetzt mal. ;-P
>
> Es ist schön, dass du über dich selbst lachen kannst.

:D :D Ja, ich kann auch über mich selbst schmuzeln. Und ich sehe auch 
ein, dass nicht alles zu 100% korrekt von mir formuliert war. Aber ich 
bin seit 20 Jahren Informatiker und habe ein gewisses Grundverständnis. 
Bin mit Assembler auf C64 und Acorn Archimedes mit ARM-Processoren groß 
geworden. Ist aber schon paar Jahre her und hauptberuflich nun auf 
höherem Abstraktionslevel unterwegs. Manchmal bringe ich vielleicht 
etwas durcheinander, aber Kommentare ala "Der Fehler ist in dem Code, 
den du nicht zeigst" sind einfach Quark.

von Oliver S. (oliverso)


Lesenswert?

Sascha S. schrieb:
> Mir ist es wurscht, denn ich war dem Wahnsinn
> schon sehr nahe und nun ist es gelöst. Der Fehler lag nicht in meinem
> Code.

Nun ja mit deiner unendlichen Erfahrung solltest du eigentlich wissen, 
daß gar nichts "gelöst" ist. Du hast herausgefunden, daß ein anderer 
Code auf einer anderen Hardware funktioniert. Das ist zwar prima, löst 
aber nix.

Oliver

von Sascha S. (excess)


Lesenswert?

Oliver S. schrieb:
> Nun ja mit deiner unendlichen Erfahrung solltest du eigentlich wissen,
> daß gar nichts "gelöst" ist. Du hast herausgefunden, daß ein anderer
> Code auf einer anderen Hardware funktioniert. Das ist zwar prima, löst
> aber nix.
>
> Oliver

Lass uns doch nicht streiten. Ich habe mein "Problem gelöst", dass ich 
eine serielle Schnittstelle mit einem AVR ausprobieren wollte. Der 
C-Code vom 2560er und 8151er ist strukturell identisch. Ja, die Register 
waren anders und der daraus resultiere Maschinencode auch. Ich bestelle 
mir jetzt mal einen neuen 2560er [mist, gibts ja gar nicht als THT für 
den Sockel] und teste den im STK 500. Von "unendlich" habe ich nichts 
geschrieben - das wäre vermessen. Es sollte nicht überheblich rüber 
kommen, nur dass ich (meist) weiß, was ich tue und warum. Manchmal 
Trail-and-Error, wenn man der Verzweiflung nahe ist und es laut 
Spezifikation eigentlich klappen sollte. Aber das haben wir doch alle 
schon mal gemacht, oder? ;)

Mein einziger Fehler im ersten Beitrag war doch, dass ich aus dem Flash 
direkt lesen wollte, d.h. den als RAM behandelt habe. Aber der 
"RAM-String" hätte in jedem Fall ausgegeben werden müssen.

Schönes WE!

: Bearbeitet durch User
von gunit (Gast)


Lesenswert?

Hallo Zusammen,
mir ist klar, dass der Thread schon was älter ist, dennoch wollte ich 
eine mögliche Lösung für das hier geschilderte Problem posten.
Ich habe jetzt selber mehrere Stunden verbracht mit dem atmega2560 und 
der seriellen Kommunikation. Bei mir wurden Strings, die größer als 3 
Zeichen waren nur als 0xff ausgegeben.
Hier lag's an den FUSE, besser gesagt am "boot reset vector". Da dieser 
beim mega2560 R3 im Auslieferungszustand aktiviert ist wurden die 
Strings nicht richtig ausgegeben. Im deaktivierten Zustand läuft alles 
perfekt.

Gruß gunit

von Sascha.s (Gast)


Lesenswert?

Vielen Dank für diesen Hinweis!

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
Noch kein Account? Hier anmelden.