HEX Größe verzehnfacht durch if Abfrage

Gast #3741570
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 #3741573
Ohne zu wissen, was in MAX_VAL steht, kann man dazu nichts sagen. Meine 
Glaskugel meint, es könnte ein float sein, wodurch die float-Library mit 
gelinkt wird.
Gast #3741604
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
@ 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
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
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

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.