Forum: Mikrocontroller und Digitale Elektronik ATmega328p resetet ständig


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Flo G. (flolix)


Bewertung
0 lesenswert
nicht lesenswert
Liebe Leute,

ich hoffe es kann mir jemand helfen..

Von einem AtMega328p mit 16Mhz Quarz und FTDI FT232 will ich einen 
String an ein Terminal senden..
1
#define F_CPU 16000000UL
2
3
#include <avr/io.h>
4
5
#define BAUD 300L                  
6
#define UBRR_VAL  ((F_CPU ) / (BAUD * 16) - 1)  
7
8
9
void uart_init() {
10
    UBRR0H = (UBRR_VAL >> 8);
11
    UBRR0L = UBRR_VAL & 0xFF;
12
    UCSR0B = (1 << TXEN0);
13
    UCSR0C = (1<<UCSZ01) | (1<<UCSZ00); // 8bit 1 stopbit
14
}
15
16
void uart_putc (unsigned char data) {
17
    while (( UCSR0A & (1 << UDRE0)) == 0) {};         
18
    UDR0 = data;                                   
19
}
20
21
int main(void) {
22
    uart_init();
23
    char * s = "halo";
24
    char * t = s;
25
    /*
26
    uart_putc(*s);
27
    s++;
28
    uart_putc(*s);
29
    s++;
30
    uart_putc(*s);
31
    s++;
32
    uart_putc(*s);
33
    */
34
    while ( *t != '\0' ) {
35
        uart_putc(*t);
36
        t++;
37
    }
38
    while (1) { };

Es scheint als ob der Controller ständig resetet und es werden laufend 
'h' gesendet.

Wenn ich die Zeichen einzeln sende, wie im Moment auskommentiert und 
dafür die while-Schleife auskommentiere, geht alles hervorragend.

Ja, Abblockkondensatoren sind verbaut.

Weiß jemand Rat?

Danke schonmal
Flolix

von Carl D. (jcw2)


Bewertung
0 lesenswert
nicht lesenswert
Scheint auf den erste Blick nichts falsch zu sein.
Gib doch mal einzelne Zeichen aus.

von Carl D. (jcw2)


Bewertung
0 lesenswert
nicht lesenswert
Wirklich einzeln, ohne String.

von Flo G. (flolix)


Bewertung
0 lesenswert
nicht lesenswert
sowas wie
1
   uart_putc('h');
2
   uart_putc('a');
3
   uart_putc('l');
4
   uart_putc('o');


geht problemlos..

von Carl D. (jcw2)


Bewertung
0 lesenswert
nicht lesenswert
Was gibt der Compiler aus (am besten mit -v)?
Was steht inm .lss File?

von Flo G. (flolix)


Bewertung
0 lesenswert
nicht lesenswert
Nur main..
Mein String "halo" taucht übrigens indem ganze *.lss-File nicht auf! 
Sollte er das?!?
1
int main(void) {
2
  aa:  cf 93         push  r28
3
  ac:  df 93         push  r29
4
  uart_init();
5
  ae:  0e 94 41 00   call  0x82  ; 0x82 <uart_init>
6
  b2:  c0 e6         ldi  r28, 0x60  ; 96
7
  b4:  d0 e0         ldi  r29, 0x00  ; 0
8
  s++;
9
  uart_putc(*s);
10
  s++;
11
  uart_putc(*s);
12
  */
13
  while ( *t != '\0' ) { 
14
  b6:  02 c0         rjmp  .+4        ; 0xbc <main+0x12>
15
    uart_putc(*t);
16
  b8:  0e 94 4e 00   call  0x9c  ; 0x9c <uart_putc>
17
  s++;
18
  uart_putc(*s);
19
  s++;
20
  uart_putc(*s);
21
  */
22
  while ( *t != '\0' ) { 
23
  bc:  89 91         ld  r24, Y+
24
  be:  88 23         and  r24, r24
25
  c0:  d9 f7         brne  .-10       ; 0xb8 <main+0xe>
26
  c2:  ff cf         rjmp  .-2        ; 0xc2 <main+0x18>
27
28
000000c4 <_exit>:
29
  c4:  f8 94         cli
30
31
000000c6 <__stop_program>:
32
  c6:  ff cf         rjmp  .-2        ; 0xc6 <__stop_program>

ausgabe von avr-gcc.
compiliert und gelinkt..
1
Using built-in specs.
2
COLLECT_GCC=avr-gcc
3
COLLECT_LTO_WRAPPER=/usr/lib/gcc/avr/4.5.3/lto-wrapper
4
Target: avr
5
Configured with: ../src/configure -v --enable-languages=c,c++ --prefix=/usr/lib --infodir=/usr/share/info --mandir=/usr/share/man --bindir=/usr/bin --libexecdir=/usr/lib --libdir=/usr/lib --enable-shared --with-system-zlib --enable-long-long --enable-nls --without-included-gettext --disable-libssp --build=i686-linux-gnu --host=i686-linux-gnu --target=avr
6
Thread model: single
7
gcc version 4.5.3 (GCC) 
8
COLLECT_GCC_OPTIONS='-Wall' '-c' '-o' 'o/uart.o' '-Os' '-g' '-mmcu=avr5' '-D__AVR_ATmega328P__' '-v'
9
 /usr/lib/gcc/avr/4.5.3/cc1 -quiet -v -imultilib avr5 -D__AVR_ATmega328P__ uart.c -quiet -dumpbase uart.c -mmcu=avr5 -auxbase-strip o/uart.o -g -Os -Wall -version -o /tmp/ccd9hlQi.s
10
GNU C (GCC) version 4.5.3 (avr)
11
  compiled by GNU C version 4.6.2, GMP version 5.0.2, MPFR version 3.1.0-p3, MPC version 0.9
12
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
13
ignoring nonexistent directory "/usr/lib/gcc/avr/4.5.3/../../../avr/sys-include"
14
#include "..." search starts here:
15
#include <...> search starts here:
16
 /usr/lib/gcc/avr/4.5.3/include
17
 /usr/lib/gcc/avr/4.5.3/include-fixed
18
 /usr/lib/gcc/avr/4.5.3/../../../avr/include
19
End of search list.
20
GNU C (GCC) version 4.5.3 (avr)
21
  compiled by GNU C version 4.6.2, GMP version 5.0.2, MPFR version 3.1.0-p3, MPC version 0.9
22
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
23
Compiler executable checksum: 591284b680435834ad2fbe6642ff4fee
24
COLLECT_GCC_OPTIONS='-Wall' '-c' '-o' 'o/uart.o' '-Os' '-g' '-mmcu=avr5' '-D__AVR_ATmega328P__' '-v'
25
 /usr/lib/gcc/avr/4.5.3/../../../avr/bin/as -mmcu=avr5 -o o/uart.o /tmp/ccd9hlQi.s
26
COMPILER_PATH=/usr/lib/gcc/avr/4.5.3/:/usr/lib/gcc/avr/4.5.3/:/usr/lib/gcc/avr/:/usr/lib/gcc/avr/4.5.3/:/usr/lib/gcc/avr/:/usr/lib/gcc/avr/4.5.3/../../../avr/bin/
27
LIBRARY_PATH=/usr/lib/gcc/avr/4.5.3/avr5/:/usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/:/usr/lib/gcc/avr/4.5.3/:/usr/lib/gcc/avr/4.5.3/../../../avr/lib/
28
COLLECT_GCC_OPTIONS='-Wall' '-c' '-o' 'o/uart.o' '-Os' '-g' '-mmcu=avr5' '-D__AVR_ATmega328P__' '-v'
29
Using built-in specs.
30
COLLECT_GCC=avr-gcc
31
COLLECT_LTO_WRAPPER=/usr/lib/gcc/avr/4.5.3/lto-wrapper
32
Target: avr
33
Configured with: ../src/configure -v --enable-languages=c,c++ --prefix=/usr/lib --infodir=/usr/share/info --mandir=/usr/share/man --bindir=/usr/bin --libexecdir=/usr/lib --libdir=/usr/lib --enable-shared --with-system-zlib --enable-long-long --enable-nls --without-included-gettext --disable-libssp --build=i686-linux-gnu --host=i686-linux-gnu --target=avr
34
Thread model: single
35
gcc version 4.5.3 (GCC) 
36
COMPILER_PATH=/usr/lib/gcc/avr/4.5.3/:/usr/lib/gcc/avr/4.5.3/:/usr/lib/gcc/avr/:/usr/lib/gcc/avr/4.5.3/:/usr/lib/gcc/avr/:/usr/lib/gcc/avr/4.5.3/../../../avr/bin/
37
LIBRARY_PATH=/usr/lib/gcc/avr/4.5.3/avr5/:/usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/:/usr/lib/gcc/avr/4.5.3/:/usr/lib/gcc/avr/4.5.3/../../../avr/lib/
38
COLLECT_GCC_OPTIONS='-Wall' '-o' 'elf/uart.elf' '-mmcu=avr5' '-D__AVR_ATmega328P__' '-v'
39
 /usr/lib/gcc/avr/4.5.3/collect2 -m avr5 -o elf/uart.elf /usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5/crtm16.o -L/usr/lib/gcc/avr/4.5.3/avr5 -L/usr/lib/gcc/avr/4.5.3/../../../avr/lib/avr5 -L/usr/lib/gcc/avr/4.5.3 -L/usr/lib/gcc/avr/4.5.3/../../../avr/lib o/uart.o -lgcc -lc -lgcc

von Carl D. (jcw2)


Bewertung
0 lesenswert
nicht lesenswert
Der String liegt (hier unsichtbar) hinter dem Code und wird in der 
Startup-Routine ins RAM ab 0x60 kopiert.
Code scheint Ok.
Ist der WatchDog aktiv? Fuse!

von M. K. (sylaina)


Bewertung
0 lesenswert
nicht lesenswert
Schaut euch den Zeiger-Spass in C nochmal an. Ist doch klar, dass das so 
nicht klappen kann.

von Marc V. (Firma: Vescomp) (logarithmus)


Bewertung
0 lesenswert
nicht lesenswert
Flo G. schrieb:
> Mein String "halo" taucht übrigens indem ganze *.lss-File nicht auf!
> Sollte er das?!?

 Nein.
 Muss aber im .hex File sein (ist es wahrscheinlich auch).

von MaWin (Gast)


Bewertung
0 lesenswert
nicht lesenswert
M. K. schrieb:
> Ist doch klar, dass das so
> nicht klappen kann.

Würdest du das mal bitte näher beschreiben?

von Stefan E. (sternst)


Bewertung
2 lesenswert
nicht lesenswert
Was ist deine Build-Umgebung? Eigenes Makefile?
Der Code im .lss-File wurde nämlich nicht für einen Atmega328 gelinkt. 
Dessen RAM beginnt nämlich bei 0x100, nicht 0x60.

von M. K. (sylaina)


Bewertung
-5 lesenswert
nicht lesenswert
MaWin schrieb:
> Würdest du das mal bitte näher beschreiben?

Ich würde mal sagen, dass so ein t++; ein Versuch ist, dass "h" um eins 
zu erhöhen was aber nicht geht da durch cahr *s = "halo"; das "h" eine 
Konstante ist und somit das Programm schlicht vor die Wand fährt da 
versucht wird eine Konstante um eins zu erhöhen.

: Bearbeitet durch User
von Flo G. (flolix)


Bewertung
0 lesenswert
nicht lesenswert
Carl D. schrieb:
> Der String liegt (hier unsichtbar) hinter dem Code und wird in der

habe ihn gefunden! :)
1
avr-objdump -j .data  -d -S elf/uart.elf

Watchdog ist aus!

Fuses 17 mal überprüft..
lfuse reads as FF
hfuse reads as D9
efuse reads as 7


@sylaina
Könntest Du das etwas näher erklären?

@Marc
ja im hex file ist der String... gerade geschaut..

von Flo G. (flolix)


Bewertung
0 lesenswert
nicht lesenswert
Stefan E. schrieb:
> Was ist deine Build-Umgebung? Eigenes Makefile?
> Der Code im .lss-File wurde nämlich nicht für einen Atmega328 gelinkt.
> Dessen RAM beginnt nämlich bei 0x100, nicht 0x60.

Ja eigenes Makefile, eigentlich nur ein kleines Script. Hat bisher immer 
tadellos funktioniert! Werde ich gleich überprüfen..

von Joe S. (joesch)


Bewertung
0 lesenswert
nicht lesenswert
@m.k.
t++ erhöht den zeiger um 'sizeof' char nicht den wert der durch *t 
addressiert wird.

von MaWin (Gast)


Bewertung
0 lesenswert
nicht lesenswert
M. K. schrieb:
> Ich würde mal sagen, dass so ein t++; ein Versuch ist, dass "h" um eins
> zu erhöhen

Du solltest das Programm noch einmal lesen und verstehen was 
Zeigerarithmetik ist.
Das Programm ist i.O.

von Carl D. (jcw2)


Bewertung
0 lesenswert
nicht lesenswert
MaWin schrieb:
> M. K. schrieb:
>> Ich würde mal sagen, dass so ein t++; ein Versuch ist, dass "h" um eins
>> zu erhöhen
>
> Du solltest das Programm noch einmal lesen und verstehen was
> Zeigerarithmetik ist.
> Das Programm ist i.O.

Bis auf den RAM-Start bei 0x60 statt 0x100.
Ob das am selbstgebastelten makefile liegt?

von Flo G. (flolix)


Bewertung
0 lesenswert
nicht lesenswert
Ja, daran lag es:

Ich hatte -mmcu=avr5 statt atmega328p gesetzt. Wo auch immer ich das 
gelesen habe.


Jetzt gehts!


Vielen herzlichen Dank für die schnelle Hilfe und schönen Abend euch 
allen!

Flolix

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]
  • [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.