LED blinken lassen - Falscher Rhytmus

Gast #1474475
Lesenswert?

Freude herrscht, ich habe gerade mein erstes LED blinken lassen. Nur 
leider überhaupt nicht im Takt den ich wollte. Eigtnlich wollte ich 
immer eine Sekunde Licht und eine Sekunde dunkel.

Kann mir jemand sagen wieso das LED viel schneller wechselt?
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#include <stdint.h>
4

5
void sleep_ms(uint16_t ms);
6

7
#define LED_DDR    DDRB
8
#define LED_PORT  PORTB
9
#define LED_PORTPIN  PB0
10

11
int main(void){
12
  LED_DDR |= (1<<LED_PORTPIN);
13
  
14
  while(1){
15
    LED_PORT |= (1<<LED_PORTPIN);
16
    sleep_ms(1000);
17
    LED_PORT &= ~(1<<LED_PORTPIN);
18
    sleep_ms(1000);
19
  }
20
}
21

22
void sleep_ms(uint16_t ms){
23
  while(ms){
24
    ms--;
25
    _delay_ms(1);
26
  }
27
}

Ausgeführt wird das ganze auf dem STK500 mit einem Atmeag8515.

MFG
Persönliche Seite #1474515
Lesenswert?

blabla schrieb:

> Vielen Dank. Es stimmt nun mehr oder weniger. Gibt es auch ein System
> wie man diese Zahl genau heraus findet und nicht nur abschätzt?

Man schaut sich seine Schaltung an und identifiziert die Taktquelle. 
Wenn es ein Quarz oder ein Oszillator ist, ist die Frequenz in MHz 
aufgedruckt. Wenn nicht kommt man mit einfachen Mitteln nicht weiter; 
man bräuchte einen Frequenzmesser oder ein Oszilloskop um die 
Taktfrequenz zu messen.

Wenn zusätzlich die AVR Fuses richtig auf diese externe Taktquelle 
eingestellt ist, ist man fertig: Die abgelesene Angabe in Hz trägt man 
als F_CPU ein.

Wenn die AVR Fuses noch in Werkseinstellung sind, dann passt 1000000 
Hz.
Gast #1474520
Lesenswert?

Hi blabla,
welchen Takt verwendest du denn?
Extern oder intern?

Wenn du einen externen Takt verwendest wirf ein Blick auf den 
verwendeten Quarz, bzw. Resonator. Wenn du den internen Takt verwendet 
solltest du die FUSE Bits checken. Das können wir von hier nicht 
machen:)

Wenn sie in diesen Beispiel 16MHz verwenden liegt es daran das dort ein 
16MHz Quarz verwendet wird.

Servus
Andreas
Persönliche Seite #1474543
Lesenswert?

Stefan B. schrieb:
> blabla schrieb:
>
>> Vielen Dank. Es stimmt nun mehr oder weniger.
>
> Das mehr oder weniger liegt daran, dass du 1000x einen Funktionsaufruf
> und weiteren Code um die Wartefunktion (_delay_ms()) gepackt hast.

Naja ne daran liegt es sicher nicht, sondern dass hier nicht klar ist, 
mit welchem Takt die MCU nun ueberhaupt laeuft.
Gast #1474545
Lesenswert?

Noch als Ergaenzung: Die Controller sind im Auslieferungszustand auf 
einen internen Takt gestellt, der 8515, der mit dem Board mitgeliefert 
wird, steht schon auf extern (und wird somit vom Board getaktet). Wenn 
Du nichts verstellt hast, mit oben genannter Frequenz.

Das Board liefert den Takt uebrigens ueber einen Controller, nicht ueber 
ein Quarz oder Oszillator.. deswegen kann man den auch so prima 
verstellen. ;)

Ansonsten kann ich Dir nur das AVR Tutorial an's Herz legen. Da sind 
viele Fragen schon beantwortet.
Persönliche Seite #1474553
Lesenswert?

Michael G. schrieb:
> Stefan B. schrieb:
>> blabla schrieb:
>>
>>> Vielen Dank. Es stimmt nun mehr oder weniger.
>>
>> Das mehr oder weniger liegt daran, dass du 1000x einen Funktionsaufruf
>> und weiteren Code um die Wartefunktion (_delay_ms()) gepackt hast.
>
> Naja ne daran liegt es sicher nicht, sondern dass hier nicht klar ist,
> mit welchem Takt die MCU nun ueberhaupt laeuft.

Wieso nicht? Er meint sicher den Schleifenoverhead. Aber den merkt man 
wahrscheinlich nicht.

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