www.mikrocontroller.net

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


Autor: H. G. (ledi)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
while(1)
{  
  if (Taste == 1)
  {
       OCR1SA = valuetable[ 150 ];  // Blue
      _delay_ms(time);
       OCR0SA = valuetable[ 150 ];  // Red
      _delay_ms(time);
  }
}

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

  Taste = SPDR;    // and store value in Taste

  Flush_RX();    // clear RX-FIFO

  if (Taste == 3)    // Speed ++
  {
     time++;
     Taste = 1;
  }

  else if (Taste == 4)  // Speed --
  {
     while (time >= 10)
     time--;
     Taste = 1;
  }
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
void wait( uint8_t time )
{
  uint8_t i;

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.