Forum: Compiler & IDEs AVR mit seltersame main-Funktion


von P. F. (pfuhsy)


Lesenswert?

Hallo zusammen,

ich beschäftige mich gerade ein weniger mit einem Atmega8 und wunder 
mich wie der µC die main-Funktion durchläuft. Laut Ergebnis über UART, 
läuft er 1x durch die main-Funktion, dann 5x in der while-Schleife und 
dann wieder raus aus der while-Schleife. Ich bin zwar kein 
Profi-Programmer, jedoch reicht mein C-Wissen aus, um sagen zu können, 
dass der µC bis in alle Ewigkeiten in der while-Schleife verbleiben 
sollte. Der µC hängt auf dem mySmart USB MK2 und die Software ist mit 
myAVrWordpad Plus geschrieben.

Kann mir das jemand erklären ?



1
#define F_CPU 3686800L      //Taktfrquenz
2
#define BAUD 19200        //einstellte Baudrate
3
4
char text[10];
5
//-----------------------------
6
#include <string.h>
7
#include <avr\io.h>
8
#include <avr\delay.h>
9
//----------------------------------------------------------------------
10
//----------------------------------------------------------------------
11
void initPorts() 
12
{
13
  DDRB = 0xFF;                       // PORTB = Ausgang
14
  DDRD = 0x00;                       // PORTD = Eingang
15
  PORTD = 0x04;                      // PORTD = PULL-UP für den Taster
16
}
17
void initUART() 
18
{
19
  UBRRL  = (F_CPU / BAUD - 16) / 16;  //Baudberchnnung
20
  UCSRB = 0x08;                 //Transmitter Enable
21
}
22
//----------------------------------------------------------------------
23
void putChar(char data) 
24
{
25
  while (!(UCSRA&32));        //warte bis UDR leer ist
26
  UDR = data;              //senden
27
}
28
//----------------------------------------------------------------------
29
void Senden(char buffer[]) 
30
{
31
  for (int i=0 ; buffer[i] !=0 ; i++)
32
    putChar(buffer[i]);
33
}
34
35
//----------------------------------------------------------------------
36
//----------------------------------------------------------------------
37
main () //Main-Schleife
38
{
39
  initPorts();
40
  initUART();
41
  int i = 48;
42
43
  text[0] = 'A';
44
  text[1] = ':';
45
  text[2] = i;
46
  text[3] = ' ';
47
  Senden(text);
48
49
  while(1) 
50
  {
51
    text[0] = 'B';
52
    text[1] = ':';
53
    text[2] = i;
54
    text[3] = ' ';
55
    Senden(text);
56
    i++;
57
  }
58
59
  text[0] = 'C';
60
  text[1] = ':';
61
  text[2] = i;
62
  text[3] = ' ';
63
  Senden(text);
64
}

Ergebnis über UART:

A:0 B:0 B:1 B:2 B:3 B:4 B:A:0 B:0 B:1 B:2 B:3 B:4 B:A:0 B:0 B:1 B:2 B:3 
B:4 B:A:0 B:0 B:1 B:2 B:3 B:4 B:A:0 B:0 B:1 B:2 B:3 B:4 B:A:0 B:0 B:1 
B:2 B:3 B:4 B:A:0 B:0 B:1 B:2 B:3 B:4 B:A:0 B:0 B:1 B:2 B:3 B:4 B:A:0 
B:0 B:1 B:2 B:3 B:4 B:

von (prx) A. K. (prx)


Lesenswert?

Du kriegst Resets. Watchdog? Kurzschluss von Ausgang?

von P. F. (pfuhsy)


Lesenswert?

Ja der Watchdog wars, danke.
Ich hab den Fuse "Watch-dog Timer always on" ausgeschaltet jetzt geht 
es.

Wofür ist den der gedacht, wenn er als Standard eingeschaltet ist ?

von (prx) A. K. (prx)


Lesenswert?

Peter F. schrieb:

> Wofür ist den der gedacht, wenn er als Standard eingeschaltet ist ?

Das ist sinnvoll, denn sonst gibt es zwischen Reset und Initialisierung 
des Watchdog ein Fenster, in dem der Controller dauerhaft hängen bleiben 
kann.

von Hans (Gast)


Lesenswert?

Du hast das \0 am Ende der Strings vergessen.
Deine Senderoutine findet kein Ende und gibt alles aus
bis im Speicher eine 0 steht.

Gruß
Hans

von (prx) A. K. (prx)


Lesenswert?

Hans schrieb:

> Du hast das \0 am Ende der Strings vergessen.

Hat er nicht. Das Array ist statisch und damit von Haus aus 0.

von Karl H. (kbuchegg)


Lesenswert?

Hans schrieb:
> Du hast das \0 am Ende der Strings vergessen.
> Deine Senderoutine findet kein Ende und gibt alles aus
> bis im Speicher eine 0 steht.
>

In seinem Fall hat er ganz zufällig allerdings tatsächlich eine 0 da 
drinnen. Globale Variablen werden automatisch mit 0 initialisiert.

Wenn du allerdings sagst, dass das höchst wahrscheinlich lediglich 
Zufall und keineswegs beabsichtigt ist, dann hast du meine Unterstützung 
:-)

von Karl H. (kbuchegg)


Lesenswert?

Peter F. schrieb:

> Wofür ist den der gedacht, wenn er als Standard eingeschaltet ist ?

Welcher Prozessor?
Normalerweise ist die ab Werk nicht eingeschaltet.

von P. F. (pfuhsy)


Lesenswert?

Ämm Prozessor ? Keine Ahnung ?
Ich benutze die myAVr WordPad Soaftware. Ich habe ein paar mal die Fuses 
auf "Standard" gesetzt und geschrieben. Da sind die Watchdogs 
aufjedenfall auf eingeschaltet. Ob das vom Werk aus anders ist, kann ich 
jetzt nicht beurteilen.

Die Funktion des Watchdogs, hab ich leider nicht verstanden. Kannst Du 
mir das bitte nochmal für Nicht-Profi erklären ?

von (prx) A. K. (prx)


Lesenswert?

Peter F. schrieb:

> Die Funktion des Watchdogs, hab ich leider nicht verstanden. Kannst Du
> mir das bitte nochmal für Nicht-Profi erklären ?

Wenn man diesen Wachhund nicht regelmässig füttert (bei AVRs ist das ein 
spezieller Befehl) dann beisst er zu (Reset). Und sorgt so dafür, dass 
ein hängendes Programm wieder startet.

Wenn du einen Controller aufs Dach deines Hauses hängst und das Programm 
aufgrund eines obskuren Programmfehlers oder entfernter Blitze sich alle 
paar Wochen mal aufhängt, dann willst du nicht jedesmal aufs Dach 
klettern um ihn von Hand zurückzusetzen.

von P. F. (pfuhsy)


Lesenswert?

Aaaaaa....das war verständlich, danke.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Nur nebenbei:

Nicht <avr\io.h>, sondern immer <avr/io.h> schreiben, dann ist das
portabel auch zu nicht-Windows-Systemen.

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.