Forum: Mikrocontroller und Digitale Elektronik Problem mit _delay_ms() (Überschreitung des Datenspeichers)


von H. G. (ledi)


Angehängte Dateien:

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
}

von Karl H. (kbuchegg)


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
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.