HEX Größe verzehnfacht durch if Abfrage

Gast #3741570
Lesenswert?

Hallo,

ich scheitere gerade am programmieren eines ATTINY13a im AVR Studio 4 
mit avr-gcc. Für eine Berechnung benötige ich eine 32Bit Variable, die 
ich global anlege. Wenn ich nun nach der Berechnung den Wert abfrage, 
bekomme ich die Meldung: "the selected hex file does not fit in the 
selected device". Und tatsächlich wächst des hex file sobald ich die 
Abfrage drin habe von 1KB auf 10KB an. Wie kann das sein?
1
//vor der main
2
uint32_t summe;
3

4
//in der main
5
if(summe > MAX_VAL)    
6
{
7
    ende = 1;
8
}
Gast #3741604
Lesenswert?

Tut mir Leid, ich wollte euch nicht mit dem ganzen Code erschlagen, da 
er noch nicht richtig strukturiert ist.
MAX_VAL ist 100000

summe wird vor der Abfrage in einer Schleife aufsummiert.
1
//vor main
2
uint32_t dif;
3
uint32_t summe;
4
uint8_t ende;
5

6

7
//in main
8
ende=0;
9
while(!ende)
10
{
11
dif = (542 * ADC_Read()) - 22222;
12
summe += (uint32_t)sqrt(dif));
13
if(summe > 100000)    
14
{
15
    ende = 1;
16
}
17
}

wenn ich nun die Berechnung mit der Wurzel auskommentiere funktioniert 
es. Wenn ich die if Abfrage auskommentiere funktioniert es auch. Nur 
zusammen nicht.
#3741614
Lesenswert?

@ Georg (Gast)

>dif = (542 * ADC_Read()) - 22222;
>summe += (uint32_t)sqrt(dif));

Das ist eine FLießkommafunktion, die braucht satt Flash-Speicher!

>wenn ich nun die Berechnung mit der Wurzel auskommentiere funktioniert
>es.

Was aber ein VOLLKOMMEN andere Fehlerbeschreibung als in deinem 1. 
Beitrag ist!
Gast #3741686
Lesenswert?

Martin K. schrieb:
>> Optimierungen sind an?
>
> Wie schauts mit der Antwort auf die Frage aus?

Entschuldige, ganz vergessen. Ich habe die Einstellungen dazu noch nicht 
ganz verstand. In dem Feld rechts unter Project/Config Options/ Custom 
Options steht unter anderem -Os. mit -O0 habe ich es auch schon 
probiert. Das habe ich so bei google gefunden. Wofür genau die Symbole 
stehen habe ich noch nicht herausgefunden...

Mathe Freak schrieb:
> Dann rechne mal die Wurzel von z.B. 10 als Ganze Zahl aus ...
Schon klar. Es muss eben gerundet werden.

In AVR Arithmetik bin ich auf die sqrt32_round Funktion gestoßen. 
Ich habe aber noch Probleme beim einbinden.
Gast #3742706
Lesenswert?

Holger L. schrieb:
> Was geschieht eigentlich wenn ADC_Read() <= 41 ist ?
Gut mitgedacht ;)
Vielleicht fange ich den Fall noch ab. Eigentlich kann das aber nie 
vorkommen, da am ADC ein Sensor hängt, der einen Offset von 0,2V (41) 
hat. Außerdem sollte die untere Grenze eigentlich nie erreichen.

Danke euch nochmal! Ich habe den Wertebereich jetzt erstmal mit if 
Abfragen geclustert und die Funktion dazwischen entsprechend 
linearisiert. Falls ich doch noch Probleme damit bekomme, muss ich 
nochmal eine Wurzelfunktion suchen, es sieht aber soweit ganz gut aus. 
:)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren