mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik delay Funktion arbeitet falsch??


Autor: flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich will ein Taktsignal am Port C ausgeben. Ich benötige ein Taktsignal 
von ungefähr 125 kHz. wenn ich die Funktion _delay_us() nehme, komme ich 
aber nur auf eine Freqeunz von ungefähr 1 kHz.
Nehme ich dann lieber einen Timer und wie bekomme ich dann an meinem 
Port den Takt.(habe schon was gelesen mit Timer und Interrupt) wenn ich 
den Timer0 fcpu/64 nehme habe ich ja meine Frequenz die ich haben will, 
aber ich blicke da durch den Quelltext noch nicht ganz durch.
Wäre schön wenn ihr mir helfen könntet...
achso Atmel ATmega48

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
CPU-Takt (F_CPU) falsch spezifiziert, oder vergessen die Fuses auf den 
gewünschten Takt einzustellen.

Ohne Quelltext blickt bei deinem Quelltext auch sonst niemand durch.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Neben den von A. K. angesprochenen Dingen wäre noch zu erwähnen, dass 
eine aktivierte Compiler-Optimierung für eine korrekte Funktion von 
_delay_xx() unbedingt erforderlich ist.

Aber generell erzeugt man Takte (v.a. in dem genannten Frequenzbereich) 
mit einem Timer. Interrupt ist dafür gar nicht erforderlich (wenn man 
den Takt nicht unbedingt an einem ganz bestimmten Portpin braucht, auf 
den der Timer nicht direkt zugreifen kann), den Takt kann der Timer, 
wenn er einmal konfiguriert ist, auch direkt an dem dazugehörigen 
Portpin ausgeben. Dafür empfiehlt sich die CTC-Betriebsart des Timers 
(falls vorhanden).

s. a.:
AVR-GCC-Tutorial

Autor: flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
f_cpu ist auf 8 MHz definiert, auch die Fuses auf 8 MHz im AVR Studio.
es kommt mir so vor als würde irgendwas blockieren... den Takt brauche 
ich an einem festgelegten Pin...

PORTC =   (1<<3);
_delay_us(4);
PORTC =  (0<<3);
_delay_us(4);

statt den eingebenen 4 us sind es aber 400 - 600 us.

delay.h

void
_delay_us(double __us)
{
  uint8_t __ticks;
  double __tmp = ((F_CPU) / 3e6) * __us;
  if (__tmp < 1.0)
    __ticks = 1;
  else if (__tmp > 255)
    __ticks = 0;  /* i.e. 256 */
  else
    __ticks = (uint8_t)__tmp;
  _delay_loop_1(__ticks);
}

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
flo wrote:

> statt den eingebenen 4 us sind es aber 400 - 600 us.

Dann hast du die Optimierung vergessen, und er rechnet die Delays per 
Fliesskommarechnung zur Laufzeit aus.

Autor: flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was meint ihr mit Optimierung?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
-Os
Stellt man irgendwo im Studio oder im Makefile ein, je nachdem wie man 
arbeitet.

Autor: flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja das habe ich

Autor: Skua C:\> (skua)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>PORTC =  (1<<3);
>PORTC =  (0<<3);
Das funktioniert aber nur zufälligerweise richtig.

Autor: flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie mache ich es denn "besser" oder korrekter??

Autor: Stefan P. (form)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
flo wrote:
>>PORTC =  (1<<3);
>>PORTC =  (0<<3);
> wie mache ich es denn "besser" oder korrekter??

PORTC |= (1<<PC3);   // High
PORTC &= ~(1<<PC3);  // Low

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.