_delay_ms timer dauert zu lange

Gast #4610614
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
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
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.
Gast #4610789
Mark schrieb:
> TCCR0B = (1 << CS01) | (1 << CS00); // clk/64 -> = 125kHz

16Mhz / 64 = 250KHz !!
 8Mhz / 64 = 125KHz

Tatsächlich kommt in meinem Testablauf der Interrupt mit
2 KHz daher. Mein Arduino 328 läuft mit 16 MHz.
(Firma: Vescomp) #4610851
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

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.