Forum: Compiler & IDEs Attiny 4313 - gcc - Warum verbraucht eine einfache Addition soviel Speicherplatz?


von Jojo (Gast)


Lesenswert?

Hallo,

ich spiele gerade ein wenig mit nem attiny 4313 herum und jetzt stell 
ich mir die Frage warum eine einfache Addition so viel Speicherplatz 
verbraucht.
Ich kann Unmengen an Zeilen schreiben ohne das viel Speicher verbraucht 
wird, aber kaum mach ich die Addition ist das Ding voll.
Ich hab versucht ne Antwort zu "ergooglen" aber ohne Erfolg.
Kann mir jemand sagen/erklären woran das liegt.

Vorab schon mal vielen Dank,

Jojo.

von Hmm... (Gast)


Lesenswert?

Zeig doch mal etwas Code dazu....

Benutzt du vielleicht ein printf?

von Karl H. (kbuchegg)


Lesenswert?

Lass mich raten: Du machst eine Floating Point Addition?

von Jojo (Gast)


Lesenswert?

#include <avr/io.h>

#include <util/delay.h>



 int main()
{


  DDRB = 0xff;
  DDRD = 0x00;

  int t=200;

 while (1)
 {


if ( PIND & (1<<PD0) )
{
 t++;
}

von Karl H. (kbuchegg)


Lesenswert?

abgesehen davon, dass das Programm nicht vollständig ist (zähl mal die { 
und die }), wo ist da jetzt die Addition?

t++ ist ein Inkrement. Ist zwar so ähnlich wie eine Addition, aber dann 
doch was anderes.

Aber ich rate mal weiter.
Im restlichen Code kommt dann irgendwann

   _delay_ms( t );

Tja. Und da hätten wir dann den Kandidaten. _delay_ms hätte gerne einen 
konstanten Ausdruck und keine Variable. Zuwiederhandeln wird mit 
Unmengen von Code und nicht stimmenden Wartezeiten bestraft.

von Jojo (Gast)


Lesenswert?

ja stimmt, ist nicht das komplette Programm. In dem Text ist die Zeile 
t++; mein Problem. Ich kann da ja auch t=t+1 schreiben.

von Jojo (Gast)


Lesenswert?

He, du solltest Hellseher werden :-) genau das hab ich im weiteren 
Verlauf gemacht.

Echt super! Tausend Dank!!

von Jojo (Gast)


Lesenswert?

Gibt es denn ne elegantere Möglichkeit sowas zu machen? Hier nochmal der 
Programmtext

#include <avr/io.h>

#include <util/delay.h>



 int main()
{


  DDRB = 0xff;
  DDRD = 0x00;

  int t=200;

 while (1)
 {


if ( PIND & (1<<PD0) )
{
 t++;
}






PORTB = 0b00000100;    //0
_delay_ms(t);
PORTB = 0b10011111;    //1
_delay_ms(t);
PORTB = 0b00100011;    //2
_delay_ms(t);
PORTB = 0b00001011;    //3
_delay_ms(t);
PORTB = 0b10011001;    //4
_delay_ms(t);
PORTB = 0b01001001;    //5
_delay_ms(t);
PORTB = 0b01000001;    //6
_delay_ms(t);
PORTB = 0b00011111;    //7
_delay_ms(t);
PORTB = 0b00000001;    //8
_delay_ms(t);
PORTB = 0b00001001;    //9
_delay_ms(t);
}
}


ich steuere damit ne 7 segment Anzeige an und übers delay die 
Geschwindigkeit mit der die 0-9 durchläuft.
Wenn ich jetzt mit nem Taster die Geschw. ändern möchte, wie könnte ich 
das machen?

von g457 (Gast)


Lesenswert?

> Gibt es denn ne elegantere Möglichkeit sowas zu machen?
1
void delay_var_ms(int t) { for (int i = 0; i < t; i++) _delay_ms(1); }
..oder so ähnlich. Für hinreichend kleine t hinreichend genau genug. Das 
restliche Feintuning überlasse ich dem geneigten Bastler.

HTH

von ich (Gast)


Lesenswert?

Wenn der Tiny einen Timer hat,
nimm den.

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.