Problem mit Unterprogramm

OP #3099146
Lesenswert?
• ▲
▼
Hallo, ich hebe ein Problem mit Unterprogrammen im AVR-Studio 6. Ich 
schreibe:
1
#include <avr/io.h>
2

3
void init()
4
{
5
  DDRB = 0xFF;
6
  
7
}
8

9
int main()
10
{
11
  init();
12
  PORTB =0xFF;
13
  return 0;
14
}

Ich habe eine LED an PB0. Die müsste dann dunkel sein, da sie gegen Vcc 
geschaltet ist, ist aber hell. Wenn ich folgenden Code schreibe welcher 
eigentlich das selbe machen sollte
1
 #include <avr/io.h>
2

3
void init()
4
{
5
  DDRB = 0xFF;
6
  PORTB =0xFF;
7
}
8

9
int main()
10
{
11
  init();
12
  return 0;
13
}
 funktioniert es und die LED leuchtet nicht. Wieso kann das sein?
#3099165
Lesenswert?
• ▲
▼
Reinhard Kern schrieb:
> wie wärs wenn du das Unterprogramm mit return abschliesst?
Wozu soll das gut sein?

Florian Schuller schrieb:
> Wieso kann das sein?
Merkwürdig. Keine Ahnung. Ich hab das eben getestet. Beide Versionen 
machen das erwartet richtige. Allerdings Studio 4.19.

In deinen Progrämmchen steckt allerdings ein kapitaler Fehler:

int main()
{
  init();
  return 0;
}

Das Programm auf einem µC darf nie beendet werden.

int main()
{
  init();
  while(1);
}

mfg.
Gast #3099166
Lesenswert?
• ▲
▼
Florian Schuller schrieb:
> Wieso? Ich kann doch nichts zurückgeben wenn mein Unterprogramm void ist
> oder?

Du musst mit return auch nichts zurückgeben, du hast aber insofern 
recht, als bei void das return weggelassen werden kann, wenn der Code 
einfach bis zum Ende durchlaufen wird (sonst brauchst du nämlich eins). 
Aber was anderes fällt mir nicht ein ausser im Einzelschritt 
durchzusteppen.

Gruss Reinhard
#3099185
Lesenswert?
• ▲
▼
Reinhard Kern schrieb:
> Bei einem ordentlichen Compiler kommt dahinter eine Endlosschleife, es
> wird also nichts mehr verändert.
Doch. Die Interrupts werden abgeschaltet. Ist in diesem Fall zwar nicht 
von Bedeutung. Aber es wird was verändert. Deswegen ist auslaufen lassen 
und while(1); eben nicht das gleiche.
Und schon gar nicht ist das Standard.
Wie du selbst sagst:
> Könnte auch sein, dass ein Sprung auf Reset folgt,

Aber eine Erklärung ist das alles trotzdem nicht.

@Florian Schuller
Zeig mal von beiden Versionen das lss File.

mfg.
Gast #3099469
Lesenswert?
• ▲
▼
Ich tippe auf falschen Controller eingestellt.

Programm 1 funktioniert nicht weil der Stackpointer nicht stimmt,
bzw auf einer Adresse liegt die der verwendete uC gar nicht hat.
Beim verlassen von init() springt er in den Wald und führt
den Befehl zum setzen des Ports nicht mehr aus.

Programm2 funktioniert nur scheinbar weil der Port vor verlassen
von init() gesetzt wird. Danach springt er aber trotzdem in den
Wald. Könnte man mal testen indem man in der main() einen anderen Port 
setzt.
#3099681
Lesenswert?
• ▲
▼
Florian Schuller schrieb:
> Danke! Warum bin ich da nicht gleich draufgekommen
Na dann hat sich das ja geklärt.
Aber hättest du das gleich geschrieben, hätte vielleicht sofort bei 
irgendjemand die 109-Fuse-Glocke geläutet.

Florian Schuller schrieb:
> Warum ist die eigentlich standardmäßig gesetzt?
Warum gibt es die überhaupt?
Da hat wohl mal ein richtig großer Kunde die Muskeln spielen lassen.

mfg.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.