mikrocontroller.net

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


Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

int main( void ) {
  DDRC = 0xFF;
  
  while ( 1 ) {
    PORTC = 0x00;
  }

  return 0;
}

Grüße Alex

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versorgungsspannung bricht nicht ein.

Der RESET Jumper auf der STK500 ist nicht gesetzt.

Grüße

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hoger, danke der wtd war an

Autor: Obelix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Normalerweise besteht main{} aus einer Endlosschleife.

Autor: Puppetmaster (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
int main( void )
 {
  DDRC = 0xFF;
  PORTC = 0x00;
  while (1);
 }

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?

Autor: holger (Gast)
Datum:

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

Da kommt er NIE hin.

Autor: Obelix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Puppetmaster

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

Autor: Michael Löffler (zvpunry)
Datum:

Bewertung
0 lesenswert
nicht 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>

Autor: Puppetmaster (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ^^

Autor: Puppetmaster (Gast)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael Löffler (zvpunry)
Datum:

Bewertung
0 lesenswert
nicht 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. ;-)

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.