Neueste WinAVR Version, Problem mit for(;;)

Gast #814699
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
#814726
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.
Gast #814761
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren