_delay_ms timer dauert zu lange

Gast #4610614
Lesenswert?
• ▲
▼
Hallo,
ich möchte mit dem ARduino Uno zu beginn eine LED Toggeln lassen. Hier 
gibt es aber schon das Problem, welches ich nicht verstehe. ich habe 
zunächst
#define F_CPU 16000000UL (ist der Quarz auf dem Arduino)
in der while-schleife lasse ich mit _delay_ms(1000); ungefähr eine 
Sekunde warten und danach die LED an PB5 Togglen. Das Problem ist, dass 
die LED nur alle 2 Sekunden ihren Status wechselt.
Aber das _delay_ms benötigt doch nur F_CPU oder?

Mark
Gast #4610652
Lesenswert?
• ▲
▼
Matthias S. schrieb:
> Evtl. läuft der MC mit den internen 8Mhz. Wenn du die Möglichkeit
> hast,
> lies doch mal die Fuses aus. Du kannst auch mal F_CPU auf 8000000UL
> ändern und schauen, obs dann passt - das wäre der Beweis.

genau so war es auch. alle Fuses waren auf 0x00 (wurde mir zumindes im 
Atmel Studio so angezeigt).

allerdings passt das auch nicht wirklich.


wenn ich jetzt einen Timer initialisiere
1
...
2
// Timer 0
3
TCCR0A = (1 << WGM01); // CTC Modus
4
TCCR0B = (1 << CS01) | (1 << CS00); // clk/64 -> = 125kHz
5
OCR0A = 125-1; // -> 1ms Interrupt
6

7
// Overflow Interrupt allow
8
TIMSK0 |= (1 << OCIE0A);
9
...
10

11

12

13

14
ISR (TIMER0_COMPA_vect){
15
  unsigned int  millisekunde = 0;
16
  unsigned int sekunde = 0;
17
  
18
  millisekunde++;
19
  if(millisekunde == 1000){
20
    millisekunde = 0;
21
    sekunde++;
22
    TOGGLEBIT(PORTB, 5);
23
    if(sekunde == 60){
24
      sekunde = 0;
25
    }
26
  }
27
}

und die LED in der Interrupt Routiene Toggle (dort warte ich 1000 
Aufrufe ab, damit ich eine Sekunde habe), dann ist die ungefähr doppelt 
so schnell.
Wenn ich aber OCR0A auf 250 hochsetze, passiert auch nichts anderes.
(Firma: Vescomp) #4610741
Lesenswert?
• ▲
▼
Mark schrieb:
> genau so war es auch. alle Fuses waren auf 0x00 (wurde mir zumindes im
> Atmel Studio so angezeigt).
 Dann funktioniert auch der Bootloader nicht, wie programmierst du
 deinen Arduino ?

Mark schrieb:
> Wenn ich aber OCR0A auf 250 hochsetze, passiert auch nichts anderes.
 Das kann schon mal nicht sein.

 Nimm deine Variablen aus der ISR heraus, deklariere die als volatile
 und probiere es nochmal.
(Firma: Vescomp) #4610851
Lesenswert?
• ▲
▼
Frickelfritze schrieb:
> Aber das behebt in keiner Weise sein Problem so wie
> du es suggerierst:

 Sein Problem besteht darin, dass er Codeschnipsel zeigt, danach
 behauptet, dass das was drin ist in seinem Code ganz anders aussieht,
 dass seine Kommentare falsch sind, dass seine Aussagen, wie z.B:

Mark schrieb:
> genau so war es auch. alle Fuses waren auf 0x00 (wurde mir zumindes im
> Atmel Studio so angezeigt).
 Sicher, mit 0x00 funktioniert deine MEGA problemlos, vor allem geht
 programmieren über ISP klaglos...

> Das hatte/habe ich aber im code drinn. Muss wohl beim übertragen
> verloren gegangen sein.

 Ja, irgendwie rausgefallen und gleich beide...

 EDIT:
 Mit OCR0A auf 249 und 16MHz funktioniert das Ganze bei mir ohne
 Probleme.

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