Forum: Mikrocontroller und Digitale Elektronik Programmgröße


von sandmann (Gast)


Lesenswert?

Hallo,

ich habe folgendes Programm:
1
#include <avr/io.h>        // Pins
2
#include <util/delay.h>    // Verzögerung
3
int main()
4
{
5
  DDRB |= (1 << DDB4);     // PortB Pin4 als Ausgang einstellen
6
7
        char brightness = 100;
8
  while (1)
9
  {
10
    PORTB |=  (1 << PB4);
11
          _delay_us(brightness);
12
          PORTB &= ~(1 << PB4);
13
          _delay_us(255 - brightness);
14
  }
15
}

dann hat das Programm folgende Größe:
1
avr-size --format=berkeley -t eiscube.elf
2
   text     data      bss      dec      hex  filename
3
    100        0        0      100       64  eiscube.elf
4
    100        0        0      100       64  (TOTALS)

Wenn ich allerdings die PWM-Funktion auslagere:
1
#include <avr/io.h>        // Pins
2
#include <util/delay.h>    // Verzögerung
3
4
void pwm(char brightness)  // PWM
5
{
6
  PORTB |=  (1 << PB4);
7
  _delay_us(brightness);
8
  PORTB &= ~(1 << PB4);
9
  _delay_us(255 - brightness);
10
}
11
12
int main()
13
{
14
  DDRB |= (1 << DDB4);     // PortB Pin4 als Ausgang einstellen
15
16
  while (1)
17
  {
18
    pwm(100)
19
  }
20
}

hat das Programm folgende Größe:
1
avr-size --format=berkeley -t eiscube.elf
2
   text     data      bss      dec      hex  filename
3
   4186      264        0     4450     1162  eiscube.elf
4
   4186      264        0     4450     1162  (TOTALS)

was bereits zu groß für meine ATtiny13 ist. Was kann ich machen, um die 
Programmgröße kleinzuhalten und trotzdem nicht auf Funktionen verzichten 
zu müssen?

von Sven P. (Gast)


Lesenswert?

Es wär ein Anfang, die Anleitung zur C-Bibliothek zu lesen. Da steht zum 
Beispiel drinne, dass man _delay_us und _delay_ms nur mit konstanten 
Werten benutzen soll.

Ansonsten empfiehlt sich für PWM ganz ungemein die Verwendung der 
PWM-Module des Prozessors.

von Z8 (Gast)


Lesenswert?

besorgs mir in "ASM" baby! :)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Das delay-Zeug mit Werten aufrufen, die zur Compilezeit bekannt sind. 
Bzw. wenn die Werte bekannt sind, nicht vor dem Compiler verstecken.

Johann

von sandmann (Gast)


Lesenswert?

Alles klar, vielen Dank!

ist hieran etwas auszusetzen?
1
void delay_ms(int time)
2
{
3
    char i;
4
    for (i = 0; i < time; i++)
5
    {
6
        _delay_ms(1);
7
    }
8
}

von Sven P. (Gast)


Lesenswert?

Ja, es wird immer ungenau sein.

von sandmann (Gast)


Lesenswert?

Ok... also vielleicht mit einem Switch vorher prüfen in welcher 
Größenordnung das Delay liegt, solange warten und dann noch ein paar 
1ms-Delays hintendran. Damit könnte ich die Genauigkeit doch steigern, 
oder?

von Micha (Gast)


Lesenswert?

Wenn du es genau haben willst: nimm nen Timer...

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> ist hieran etwas auszusetzen?

Jede Pause grösser 127 ms ist unendlich lang.

von sandmann (Gast)


Lesenswert?

Dankeschön! :-)

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.