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


von Mattias (Gast)


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

von yalu (Gast)


Lesenswert?

Das Problem liegt ziemlich sicher nicht beim for(;;)

von Patrick (Gast)


Lesenswert?

was geschieht denn bei piep()?

von Mattias (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


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.

von MartinH (Gast)


Lesenswert?

Watchdog schon abgestellt?

von Daniel C. (cecky)


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-Tutorial#avr-libc_Versionen_ab_1.6

Cecky

von Mattias (Gast)


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

von yalu (Gast)


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.

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.