Forum: Mikrocontroller und Digitale Elektronik Warum wird Hex-File für ATTINY13 nach setzen eines Portes rießig?


von Matze (Gast)


Lesenswert?

Hallo zusammen,

ich habe folgendes Problem, ich will mit einem ATTINY13 mithilfe des 
ADC1- Einganges eine Gleichspannung "voltage" messen und bei 
unterschreiten eines gewissen Grenzwertes "limit" den PB4 des PORTBs 
setzten.
Nun ergibt sich folgendes Problem, wenn ich nach der if-Abfrage von 
"voltage<limit" den PORTB setzte explodiert die Hex-File auf größe von 
ca. 7,7KB und passt somit nicht mehr auf den ATTINY13. Wenn ich nun aber 
nur das setzen des PORTB aus der Anweisung der if-Abfrage kommentiere 
beträgt die Größe der Hex-File nur noch ca. 450 byte. Woher kommt das? 
Kann mir jemand weiterhelfen?

Über Antworten freue ich mich!! :)


Hier der Quelltext:


#define XTAL  8e6
#define F_CPU  XTAL
#define limit 17.4368


#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "C:\AVR\Includes\BitUtilities.h"


float voltage;              //Variable für ADC-Ergebnis

int main(void)
{

  DDRB = 0b010000;        // PortB4 as output
  PORTB = 0b000000;       // portB4 setzten

  // initialize ADC Prescaler=64 (8 MHz/64=125 kHz)
  ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);

                                         // activate ADC
  ADMUX = 0x01;                          // select channel (ADC1)
  ADMUX |= (1<<REFS0);                   // internal reference


  // first = dummy conversion
    ADCSRA |= (1<<ADSC);              // single converson
    while ( ADCSRA & (1<<ADSC) );     // wait for ADC ready
    voltage = ADCW;                   // get value
    voltage = 0;                      // discard dummy value

  while (1)

  {
    // get ADC data  - AREF=2.56V, 10 Bit A/D-Converter: 2^10-1=1023
    ADMUX = 0x01;                   // select channel (ADC1)
    ADMUX |= (1<<REFS0);            // internal reference

    // start conversion - 4 times averaging
    voltage = 0.0;

    for(unsigned int i=0;i<4;i++)
    {  ADCSRA |= (1<<ADSC);             // single conversion
      while ( ADCSRA & (1<<ADSC) );     // wait for ADC ready
      voltage += ADCW;
    }

     _delay_ms(500);

     if (voltage < limit)

      ;                      //Semikolon für leere if-Anweisung
      //PORTB = 0b010000;    //Rücksetzen des PORTB4

  }

  return 0;
}

von A. B. (funky)


Lesenswert?

ich könnte mir denken, das der compiler merkt, das das voltage sonst 
nicht benötigt wird und es wegoptimiert.
und voltage ist vom variablentyp float, was deutlich mehr speicherplatz 
benötigt

warum float für das voltage? kein int oder long? dein ADC liefert dir 
doch eh keine float werte zurück?!

von Achim M. (minifloat)


Lesenswert?

Matze schrieb:
> rießig

Matze schrieb:
> float voltage;

Was soll ich dazu sagen...
Benutz doch Festkommaarithmetik, das spart Rechenzeit und Flash.
Einfach die verfügbaren 65535 gedanklich auf die maximale Spannung 
abbilden.
mfg mf

von Michael A. (Gast)


Lesenswert?

Vermutlich wird für den Vergleich
   if (voltage < limit)
die Floatingpoint Library dazu gelinkt. Ohne deine Portausgabe wird die 
ganz if-Abfrage wegoptimiert, weil dadrin sowieso nichts passiert.

von A. B. (funky)


Lesenswert?

also wenn du den Port nicht setzt, dann ist auch die Abfrage mit voltage 
< limit überflüssig und auch die komplette Variable voltage da sie sonst 
nirgendwo benötigt wird.

schau dir mal den generierten Quellcode an, oder mach voltage testweise 
mal volatile(darf somit nicht wegoptimiert werden)...dann müsste das 
Hexfile auch noch deutlich grösser sein, auch wenn du den Port nicht 
setzt

von Achim M. (minifloat)


Lesenswert?

Man kann übrigens auch den Compiler die realen Spannungen auf 
16bit-Variablen umrechnen lassen(die Genauigkeit schient hier vonnöten 
zu sein).
Der Tiny muss sich dann nicht mit float rumplagen.
Dazu muss man nur wissen, dass 1024 ADC-Zähler eben 2,56V entsprechen.
mfg mf

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.