Forum: Mikrocontroller und Digitale Elektronik LED's Blinken anstatt zu leuchten


von Alex (Gast)


Lesenswert?

Hallo,
Ich habe ein kleines Programm geschrieben das alle LED's auf meinem STK 
500 zum leuchten bringen soll. Leider leuchten die LED's nicht sondern 
sie blinken nur. Ich habe mir mal einen einzigen Pink an PORTC am 
Oszilloskop angesehn. Es sieht aus wie ein Rechtecksignal. Ich verwende 
einen ATmega162.

1
int main( void ) {
2
  DDRC = 0xFF;
3
  
4
  while ( 1 ) {
5
    PORTC = 0x00;
6
  }
7
8
  return 0;
9
}

Grüße Alex

von Karl H. (kbuchegg)


Lesenswert?

Da vermute ich mal ganz stark, dass aus irgendeinem
Grund der µC ständig resettet wird.

Kann es zb sein, dass deine Versorgungsspannung immer
wieder einbricht?

von Alex (Gast)


Lesenswert?

Versorgungsspannung bricht nicht ein.

Der RESET Jumper auf der STK500 ist nicht gesetzt.

Grüße

von holger (Gast)


Lesenswert?

>Da vermute ich mal ganz stark, dass aus irgendeinem
>Grund der µC ständig resettet wird.

Könnte ne gesetzte WDT (Watchdog) Fuse sein.
Eventuell auch die BOREN (Brown-Out) Fuse wenn
die Versorgungsspannung zu klein ist.

von Alex (Gast)


Lesenswert?

hoger, danke der wtd war an

von Obelix (Gast)


Lesenswert?

Normalerweise besteht main{} aus einer Endlosschleife.

von Puppetmaster (Gast)


Lesenswert?

@Obelix
Falls mich nicht alles täuscht hat er da doch eine Endlosschleife. Aber 
ne andere Frage wie klug ist es einen Ausgang in einer Endlosschleife zu 
setzen. Das ist allerdings eine Frage da ich da selbst keine Antwort 
drauf weiß ^^
Ich würde aber trotzdem mal versuchen ob es besser geht wenn du die 
Sache so schreibst:
1
int main( void )
2
 {
3
  DDRC = 0xFF;
4
  PORTC = 0x00;
5
  while (1);
6
 }

Und noch eine Frage was passiert wenn der Controler das return = 0; 
erreicht? Startet er dann neu also quasi Reset oder macht er dann 
einfach garnix mehr?

von holger (Gast)


Lesenswert?

>Und noch eine Frage was passiert wenn der Controler das return = 0;
>erreicht?

Da kommt er NIE hin.

von Obelix (Gast)


Lesenswert?

@Puppetmaster

Oh, ja, hast Recht habe ich irgendwie übersehen.

von Michael L. (zvpunry)


Lesenswert?

Puppetmaster: Beim return 0 wird er main() verlassen, ist dann im 
startcode der libc welche dann in einer endlosschleife sich dreht.

Nachtrag:

Das ist aus dem Code der main() startet:
  86:   0e 94 49 00     call    0x92    ; 0x92 <main>
  8a:   0c 94 51 00     jmp     0xa2    ; 0xa2 <_exit>

Exit schaut so aus:

000000a2 <_exit>:
  a2:   ff cf           rjmp    .-2             ; 0xa2 <_exit>

von Puppetmaster (Gast)


Lesenswert?

@holger
Ich weiß, dass er bei dem Beispiel da nie hinkommt. Aber mich 
interessiert nur mal so was er dann macht, wenn es in einem anderen 
Programm erreichbar ist. Also wie reagiert der µC auf ein return = 0; ^^ 
und wie wahrscheinlich ist es eigendlich das ein Compiler MÖGLICHERWEISE 
die Schleife da wegoptimiert da der Ausgang sich eh nie verändert ob mit 
oder ohne Schleife. Allerdings weiß ich das nicht es interessiert mich 
aber und man will ja nicht dumm sterben ^^

von Puppetmaster (Gast)


Lesenswert?

Oh sry sehe grade über meinem Post steht ja die Antwort auf meine Frage 
^^ Danke und sry wegen des Doppelpost.

von Falk B. (falk)


Lesenswert?

@ Puppetmaster (Gast)

>Programm erreichbar ist. Also wie reagiert der µC auf ein return = 0; ^^

Aus main() heraus ist das Ergebnis auf einem uC nicht definiert. Manche 
Compiler laufen sicher in eine Endlosschleife, andere machen Müll.

Mfg
Falk

von Michael L. (zvpunry)


Lesenswert?

Falk Brunner wrote:
> Aus main() heraus ist das Ergebnis auf einem uC nicht definiert. Manche
Undefiniert ist gut, was ich geschrieben habe war nur ein Beobachtung 
beim avr-gcc/avr-libc. ;-)

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.