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
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.
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
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); }
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.
-Os Stellt man irgendwo im Studio oder im Makefile ein, je nachdem wie man arbeitet.
>PORTC = (1<<3); >PORTC = (0<<3); Das funktioniert aber nur zufälligerweise richtig.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.