Forum: Mikrocontroller und Digitale Elektronik Ganz einfach Rechteck generieren


von Bastian (Gast)


Lesenswert?

while (1)
{
  PORTD &= ~(1<<PD0);  //ausschalten
  _delay_us (1);
  PORTD=(1<<PD0);    //einschalten
  _delay_us (300);
}

Hallo,
kann mir einer sagen warum ich bei diesem Code eine Rechteckspannung mit 
einem Tastverhältnis von 0,5 bekomme??

MfG
Bastian

von Daniel R. (sliderbor)


Lesenswert?

Ist das Delay nicht von der Frequenz abhängig, mit der der uC läuft? 
Vielleicht falsche Frequenz eingestellt?

von Uhu U. (uhu)


Lesenswert?

PORTD &= ~(1<<PD0) erzeugt erst eine Leseoperation auf dem Port, 
anschließend eine Schreiboperation.

Wenn das Port lesen irgendwelche Auswirkungen auf die Hardware hat, wäre 
das zumindest mal ein Hinweis.

von Alan (Gast)


Lesenswert?

Wenn du den internen RC Oszillator benutzt, dann ist die Genauigkeit 
hinsichtlich der Zeit unter aller Kanone.

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

wie groß ist denn deine Quarzfrequenz ??

Wenn du mal in die Sourcen von delay.h schaust, steht da:
 "The maximal possible delay is 768 us / F_CPU in MHz."

bei 4MHz kann die Pause z.B. nicht mehr als 192us !


Sascha

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Schnellschuss:

Weil in deinem Programm die _delay_us nicht wie beabsichtigt arbeiten.

Das kann die triviale Ursache haben, dass die Funktion ein falsch 
gesetztes F_CPU sieht oder die Optimierung beim Kompilieren 
ausgeschaltet ist.

Bei einer avr-libc < 1.6 ist auch zu prüfen, ob 300 noch ein legaler 
Wert ist (abhängig von F_CPU).

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.