C _delay_ms

omtom

Neues Mitglied
09. Mai 2012
15
0
0
Sprachen
  1. ANSI C
Ich habe folgendes kompliziertes Programm geschrieben:

#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRB = 18;
while (1)
{
PORTB = 2;
_delay_ms(500);
PORTB = 16;
_delay_ms(500);
}
return(0);
}



Bloß jede LED ist ca 3-4 Sekunden an und nicht 500ms.
Was mach ich falsch (mit AVR Libc 1.6.7)?



Danke für die Hilfe!
Tom
 
Tom,

die Usache könnte ein zu niediger Systemtakt sein. Verwendest du einen Mikrocontroller mit Fusebit CKDIV8? Von Werk aus ist dieses Fusebit programmiert und der Oszillatortakt wird dann durch 8 geteilt.
Wenn das so ist, werden aus den 500ms 4s.


Gruß,
Dirk

---

Noch ein Hinweis zu deiner Programmschreibweise.
Am besten du verwendest folgende Schweibweise ...

Bits setzen:
DDRB |= (1<<PB4) | (1<<PB1); // PB4 und PB1 Ausgang

Bits löschen:
PORTB &= ~((1<<PB4) | (1<<PB1)); // PB4 und PB1 low

Das läßt sich dann besser lesen.
 
Danke Dirk,

ich benutze einen ATtiny13.
Im makefile habe ich die Frequenz F_CPU = 8000000 einfach übernommen.
Ansonsten habe ich alles so gelassen, wie vom Werk eingestellt.

Thomas
 
Ja Thomas, daran liegt es.

Der ATtiny13 wird mit folgender Systemtakteinstellung ausgeliefert:

- interner 9,6MHz RC-Oszillator als Quelle
- CKDIV8 Fusebit programmiert (Oszillatortakt wird durch 8 geteilt)

Du hast also eine Systemfrequenz von 1,2MHz = 9,6MHz / 8.

Wenn du im Makefile F_CPU = 1200000 angibst, stimmen die 500ms.

Gruß,
Dirk
 
Hallo Dirk,

geht!!

Ich fasse zusammen:
ATtiny13 -> interner Oszillator 9,6 MHz
Fusebit CKDIV8 (wohl ClocK DIVidiert durch 8) steht werksseitig auf 1 -> 9,6 Div 8 = 1,2
diese 1,2 MHz müssen im makefile angegeben werden unter F_CPU.
Dann geht's.
Kann man diese 1,2 MHz sozusagen als Standard-Wert betrachten, den man bei so einfachen Sachen angeben kann?

Da habe ich mir extra 2 schlaue Bücher gekauft, aber solche wichtigen Sachen werden niht (genug) berücksichtigt.
Gut, dass es dieses Forum gibt.

Thomas
 
Hi Thomas,

gut :D

...
Fusebit CKDIV8 (wohl ClocK DIVidiert durch 8) steht werksseitig auf 1 -> 9,6 Div 8 = 1,2
...

Achtung: steht werksseitig auf "0".

Bei den Fusebits und Lockbits wird negierte Logik verwendet.

"0" = programmiert = aktiv
"1" = nicht programmiert = nicht aktiv

... nur damit du da mal nicht reinfällst, wenn du Fusebits verstellen solltest. :)

Dirk
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)