AVR mit seltersame main-Funktion

OP #2201465
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:
#2201501
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 
:-)
OP #2201516
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 ?
#2201522
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren