Warum wird Hex-File für ATTINY13 nach setzen eines Portes rießig?

Gast #2376657
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;
}
#2376667
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?!
Gast #2376673
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.
#2376676
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

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