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


von flo (Gast)


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

von (prx) A. K. (prx)


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.

von Johannes M. (johnny-m)


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

von flo (Gast)


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);
}

von (prx) A. K. (prx)


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.

von flo (Gast)


Lesenswert?

was meint ihr mit Optimierung?

von (prx) A. K. (prx)


Lesenswert?

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

von flo (Gast)


Lesenswert?

ja das habe ich

von Skua C. (skua)


Lesenswert?

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

von flo (Gast)


Lesenswert?

wie mache ich es denn "besser" oder korrekter??

von Stefan P. (form)


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

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.