www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik delay Funktion in AVR Studio


Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!
Ich habe auch schon die Suchfunktion benutzt, aber die hat mir bis jetzt 
nicht helfen können.

Mein kleienr Quelltext sieht so aus, ich evrwende übrigens AVRStudio.
int main()
{
  DDRA |= (1<<PA0); // Pin als Ausgang definieren
  
  while(1)
  {
    _delay_ms(1);
    PORTA ^= (1<<PA0);
  }
}

Wenn ich jetzt mit dem Oszi schaue, zeigt er mir 1,666666 kHz an anstatt 
die eingestellten 1 kHz. Woran könnte dies liegen?

Ich habe bereits mehrer Optimeirungen durchprobiert.
Eigentlich sollte sie ja auf Os sein. Habe ichschon probiert. Auch bei 
O0 bis O3 war die Frequenz immer 1.6666 KHz.

Woran könnte es denn noch liegen=?

Autor: Armin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
richtige Oszillatorfrequenz eingestellt? Muss sehr nahe bei den 
Optimierungen sein ;)

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast einen gewissen Codeoverhead durch das while() und das 
Lesen/Ändern/Schreiben des PORTA-Pins. Das Timing ist deswegen nicht 
100% genau, selbst wenn _delay_ms(1) exakt 1 ms verzögern würde.

_delay_ms(1) arbeitet nur exakt, wenn F_CPU exakt definiert ist und 
hardwaremässig exakt arbeitet. Die Hardwaregenauigkeit ist bei 
verschiedenen Taktquellen (interner RC-Oszillator, externe Oszillatoren, 
Quarz) unterschiedlich.

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich verwende den ATmega16 mit einem 14.7456 MHz Quarz.

Bei "communication Project options" hatte ich bei Frequency erst nichts 
stehen, es änderte sich aber auch nichts, als ich 14745600 
reingeschrieben habe.

Autor: Armin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kannst du mit deinem oszi den Quarz direkt messen?
while dürfte höchstens 1, 2 zyklen dauern. Das ist ja nurn jump-Befehl. 
Wie lange das Auslesen dauert, wei ich nicht. Kann mir aber nicht 
vorstellen, dass das so viel ausmacht...


sonst hast du keine weiteren Sachen, die währenddessen ausgeführt 
werden; beispielsweise interrupts, die etwas rechenzeit brauchen?

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi ich hatte vorhin geschrieben, dass beim Oszi 1kHz herauskommen 
müsste.

Wenn ich den Pin jede jede ms toggle, müsste die Frequenz natürlich 
500Hz sein. D.h. der Fehler ist ja noch größer...

1.6 kHz anstatt 500 Hz...

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hans schrieb:
> Also ich verwende den ATmega16 mit einem 14.7456 MHz Quarz.
>
> Bei "communication Project options" hatte ich bei Frequency erst nichts
> stehen,

Verstehe ich nicht. Es sollte dann beim Übersetzen im Build-Fenster die 
Warnung kommen, dass F_CPU undefiniert ist und auf einen Defaultwert 
gesetzt wird.

> es änderte sich aber auch nichts, als ich 14745600
> reingeschrieben habe.

Bist du sicher, dass der Atmega16 auch die 14745600 Hz Taktquelle 
benutzt? Ist da z.B. ein externer Quarz richtig angeschlossen und sind 
die AVR Fuses entsprechend gesetzt?

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
JA, den Quarz habe ich auch gemesse...das sind genau die angegebenene 
14,7456 Mhz

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm also ich habe die Fuses korrekt gesetzt. Das auf jeden Fall.

Habe es so gemacht wie hier:
Beitrag "Richtige Fuses mega16 & 16mhz quarz"

Klappte dann auch alles. habe ja auch schon größere Programme 
geschrieben. Die Timer haben auch perfekt funktioniert.

Aber F_CPU habe ich nirgends definiert. Die Timer liefen dennoch 
wunderbar.
Das delay klappt aber nicht....

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was kommt raus, wenn du
_delay_ms(10);
schreibst?


> Aber F_CPU habe ich nirgends definiert.
Das ist schlecht, woher soll der Compiler wissen, wieviele Zyklen er 
verplempern soll?
> Die Timer liefen dennoch wunderbar.
Die berechnest ja auch du selber.

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay. Und wo muss ich dann die Frequenz definieren?
Dieses makefile wird ja von AVR Studio selbst erstellt. Wie kann ich das 
denn darin ändern?

Oder schreib ich mir in die main.h einfach hin #define F_CPU 14745600

?

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
avr-gcc.exe  -mmcu=atmega16 -Wall -gdwarf-2 -std=gnu99 
-DF_CPU=14745600UL -Os -funsigned-char -funsigned-bitfields 
-fpack-struct -fshort-enums -MD -MP -MT main.o -MF dep/main.o.d  -c 
../main.c


Hier, nur diese Meldung bekomme ich. Damit kann ich aber nichts anfangen 
:-|

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hans schrieb:
> Okay. Und wo muss ich dann die Frequenz definieren?
> Dieses makefile wird ja von AVR Studio selbst erstellt. Wie kann ich das
> denn darin ändern?

Project -> Configuration options -> Frequency (Wert eintragen)

> Oder schreib ich mir in die main.h einfach hin #define F_CPU 14745600

Ja, Vor das #include <util/delay.h> und mit der Typkennzeichnung UL 
oder L oder in Exponentialschreibweise

#define F_CPU 14.7456E6
#include <util/delay.h>

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jo, es passt auf einmal.
Habe es geschafft. Ich hatte den fehler gemacht, dass in einer schleife 
irgendwo doppelt F_CPU definiert war. Sorry für den Aufruhr hier.
Dachte, dei warnings sind wegen unused variablen

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hans schrieb:

> avr-gcc.exe  -mmcu=atmega16 -Wall -gdwarf-2 -std=gnu99
> -DF_CPU=14745600UL -Os -funsigned-char -funsigned-bitfields
> -fpack-struct -fshort-enums -MD -MP -MT main.o -MF dep/main.o.d  -c
> ../main.c

Sieht doch gut aus. F_CPU wird in der Kommandozeile übergeben 
(-DF_CPU=14745600UL).

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.