delay Funktion arbeitet falsch??

Gast #1025722
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
#1025761
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
Gast #1025773
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);
}

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