www.mikrocontroller.net

Forum: Compiler & IDEs Neueste WinAVR Version, Problem mit for(;;)


Autor: Mattias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo liebe Leute,
habe gerade die neueste Version von WINAVR auf einen XP Rechner 
installiert und ein Testprogramm geschrieben. Es gibt nur einen Pieps 
heraus und sonst nichts mehr.

.
.
.
int main(void){
piep();

 for(;;){

 }// for(;;)
}// main()

Controller ist ein mega8.
Optimierung steht auf s.

Anstatt nur einmal zu Piepsen, piepst er permanent, bootet also immer 
neu.
Was kann das denn sein ?

Danke schon im voraus.
Mattias

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem liegt ziemlich sicher nicht beim for(;;)

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was geschieht denn bei piep()?

Autor: Mattias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
piep(){
PORTD = PIND & 0xFD;
_delay_ms(1000);
PORTD = PIND | 0x02;
}

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

Bewertung
0 lesenswert
nicht lesenswert
Mattias wrote:
> piep(){
> PORTD = PIND & 0xFD;
> _delay_ms(1000);

Das geht schon mal gar nicht. Für _delay_ms gibt es eine
Obergrenze abhängig von der Taktfrequenz. Ist in delay.h
dokumentiert.

> PORTD = PIND | 0x02;
> }

Das dürfte aber nicht dein Problem sein.
Wenn es ständig piepst, dann wird wahrscheinlich
der Controller ständig resettet. Das wiederrum könnte
seine Ursache in Störungen der Versorgungsspannung haben,
verursacht durch das Einschalten des Piepsers.

Autor: MartinH (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Watchdog schon abgestellt?

Autor: Daniel C. (cecky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm,

ich dachte seit der neusten Version (avr-libc ab Version 1.6) sollten 
auch längere Delay's möglich sein. Hab's zwar noch nicht getestet, aber 
das Tutorial sagt das zumindest auch.

http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Cecky

Autor: Mattias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fehler gefunden,
habe timer interrupt eingestellt ohne die Service Funktion geschrieben 
zu haben. Der Arme hat dann die Funktion nicht gefunden und lief ins 
Leere.

Danke trotzdem.
Matias

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nur am Rande: Ich würde

  PORTD = PIND & 0xFD;

durch

  PORTD &= ~(1<<PD1);

und

  PORTD = PIND | 0x02;

durch

  PORTD |= ~(1<<PD1);

ersetzen. Ein Lesezugriff auf das PORTD-Register liefert immer die
aktuellen Zustände der Ausgangsflipflops, und der Compiler übersetzt
die obigen Anweisungen jeweils in einen einzigen Maschinenbefehl. Das
Zurücklesen über den Porteingang PIND geht zwar auch, ist aber ein
Umweg und braucht mehr Befehle und Taktzyklen.

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.