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; }
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?!
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.