Problem mit _delay_ms() (Überschreitung des Datenspeichers)

OP #2009213
Lesenswert?
• ▲
▼
Hallo!

Ich möchte die Blinkzeit (delay-time) einer RGB-Led stufenlos verändern.
Bei Tastendruck wird alle 35ms ein Interrupt ausgelöst. In der ISR 
erhöhe ich time solange ich die Taste 3 drücke und springe nach jeder 
Erhöhung um 1ms wieder in die Routine (Taste == 1). Mit Taste 4 soll die 
Zeit verringert werden (bis zu einem Zeitminimum von 10ms).

Mein Problem ist, dass sich sobald ich die Variable time in _delay_ms() 
einfüge, der Programm- und Datenspeicher schlagartig erhöht.(siehe Bild)

Wie kann ich das lösen?

Hier der Codeausschnitt:
1
while(1)
2
{  
3
  if (Taste == 1)
4
  {
5
       OCR1SA = valuetable[ 150 ];  // Blue
6
      _delay_ms(time);
7
       OCR0SA = valuetable[ 150 ];  // Red
8
      _delay_ms(time);
9
  }
10
}

Hier die Interrupt-Service_Rpoutine:
1
ISR(INT2_vect)  // Int.2 on PB5
2
{    
3
  Payload_RX(0x61, 0x00);  // Read FIFO payload
4

5
  Taste = SPDR;    // and store value in Taste
6

7
  Flush_RX();    // clear RX-FIFO
8

9
  if (Taste == 3)    // Speed ++
10
  {
11
     time++;
12
     Taste = 1;
13
  }
14

15
  else if (Taste == 4)  // Speed --
16
  {
17
     while (time >= 10)
18
     time--;
19
     Taste = 1;
20
  }
21
}
Angehängte Dateien:
#2009218
Lesenswert?
• ▲
▼
Heimo G. schrieb:

> Mein Problem ist, dass sich sobald ich die Variable time in _delay_ms()
> einfüge, der Programm- und Datenspeicher schlagartig erhöht.(siehe Bild)

Das ist richtig. _delay_ms funktioniert nur dann zuverlässig, wenn die 
Zahl die es bekommt, eine Konstante ist. Steht aber auch in der Doku zur 
Funktion.

> Wie kann ich das lösen?

zb mit einer Funktion.
35 mal 1ms gewartet ergibt in Summe auch 35ms
1
void wait( uint8_t time )
2
{
3
  uint8_t i;
4

5
  for( i = 0; i < time; ++i )
6
    _delay_ms( 1 );
7
}

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.