Hallo, das Argument channel (function messung) wird nur übergeben, wenn ich die Compiler Optimierung auf -O0 schalte ... bei allen anderen Einstellungen wird mir immer nur 0 übergeben ... Das Ganze teste ich mit dem AVR Studio 5. Wenn ich das auf den uc übertrage, scheint es sich irgendwie anders zu verhalten ... hat hier jemand eine Idee? Gruß aus Salzgitter Markus 73 de Markus, do9mbs #define F_CPU 3686400 #include <avr/io.h> #include <util/delay.h> #include <string.h> #include <stdio.h> //#include "lcd_display.h" int messung(int channel){ /* Register ADMUX: Bit 7: REFS1 "Auswahl der Referenzspannung" Bit 6: REFS0 "Auswahl der Referenzspannung" Bit 5: ADLAR "Ausgabeformat" 0=Ausgabe rechtsbündig in ADCH/ADCL Bit 4: Bit 3: MUX3 "Kanalauswahl" Bit 2: MUX2 "Kanalauswahl" Bit 1: MUX1 "Kanalauswahl" Bit 0: MUX0 "Kanalauswahl" */ ADMUX = 0x40; //jetzt noch den richtigen Eingang setzen channel &= 0x0f; ADMUX |= channel; /* Register ADCSRA: Bit 7:ADEN "ADC Enable" :1 Bit 6:ADSC "ADC Start Conversion" :1 Bit 5:ADFR "ADC Free Running" :0 Bit 4:ADIF "ADC Interrupt Flag" :0 auf 1 warten Bit 3:ADIE "ADC Interrupt Enable" 0 Bit 2:ADPS2 "ADC Prescaler" :1 Bit 1:ADPS1 "ADC Prescaler" :0 Bit 0:ADPS0 "ADC Prescaler" :1 */ ADCSRA = 0xc5; /* Auf Ergebnis warten */ int readySignal=0; uint16_t result; do { readySignal=ADCSRA; readySignal &=0x10; } while (readySignal==0); /* Ergebnis in eine 16 Bit Zahl konvertieren */ //ADCL=0xEF; //ADCH=0x03; --> Ergebnis ist 1007 result = ADCL; result +=(ADCH<<8); return result; } int main(void) { messung(1); while(1) { //TODO:: Please write your application code } }
Markus schrieb: > bei allen anderen Einstellungen > wird mir immer nur 0 übergeben ... woher weisst du das? Da du den Return deiner funktion überhaupt nicht auswertest, hat der Optimier hier sehr viel spielraum.
> das Argument channel (function messung) wird nur übergeben, wenn ich die > Compiler Optimierung auf -O0 schalte ... bei allen anderen Einstellungen > wird mir immer nur 0 übergeben ... Im Simulator (?) an welcher Position im Code festgestellt? channel ist im Simulator nur bis zur Stelle ADMUX |= channel; relevant. Danach ist dem Compiler die Variable eh wurscht. Bei eingeschalteter Optimierung kann dem Compiler sogar die Variable insgesamt wurscht sein, wenn er "aggressiv" messung() als inline Funktion erzeugt und gleich den unveränderlichen Wert channel=1 bei der Codeerzeugung berücksichtigt. Kurzfassung - Simulieren mit Codeoptimierung kann man machen, muss man aber öfter überlegen was passiert.
Hallo Peter, ich habe mir das mit dem Debugger angesehen ... und da hat die Variable channel immer den Wert 0. Das ist hier nur ein Auszug aus dem kompletten Code ... das Ganze funktioniert aber auch nicht mit: uint16_t fswr=0; /* Vorlaufende Welle */ uint16_t bswr=0; /* Ruecklaufende Welle */ float swr=0; /* SWR */ fswr = messung(0); bswr = messung(1); swr = (float)(fswr+bswr) / (float)(fswr-bswr); Gruß Markus
Bei saftiger Optimirung ist messung() überhaupt nicht mehr vorhanden! Also wird auch nix übergeben... Compiliert mit avr-gcc-4.5.2 -combine -fwhole-program -S messung.c -mmcu=atmega88 -Os
1 | .file "messung.c" |
2 | __SREG__ = 0x3f |
3 | __SP_H__ = 0x3e |
4 | __SP_L__ = 0x3d |
5 | __tmp_reg__ = 0 |
6 | __zero_reg__ = 1 |
7 | .text |
8 | .global main |
9 | .type main, @function |
10 | main: |
11 | /* prologue: function */ |
12 | /* frame size = 0 */ |
13 | /* stack size = 0 */ |
14 | .L__stack_usage = 0 |
15 | ldi r24,lo8(64) |
16 | sts 124,r24 |
17 | lds r24,124 |
18 | ori r24,lo8(1) |
19 | sts 124,r24 |
20 | ldi r24,lo8(-59) |
21 | sts 122,r24 |
22 | .L2: |
23 | lds r24,122 |
24 | sbrs r24,4 |
25 | rjmp .L2 |
26 | lds r24,120 |
27 | lds r24,121 |
28 | .L3: |
29 | rjmp .L3 |
30 | .size main, .-main |
Markus Bühler schrieb: > ich habe mir das mit dem Debugger angesehen ... und da hat die Variable > channel immer den Wert 0. wenn optimierun eingeschaltet ist, kann man sich nicht auf dem debugger verlassen. Welcher wert steht denn in ADMUX nach der Messung?
Peter II schrieb: > Markus Bühler schrieb: >> ich habe mir das mit dem Debugger angesehen ... und da hat die Variable >> channel immer den Wert 0. > wenn optimierun eingeschaltet ist, kann man sich nicht auf dem debugger > verlassen. > > Welcher wert steht denn in ADMUX nach der Messung? Hallo Peter, in ADMUX steht immer 0x40 ...
So ist das doch nur Rumgestocher. Sag doch einfach mal, welche Compiler-Optionen und -Version zum Einsatz kommen.
Hallo, vielen Dank für eure schnelle Hilfe! Vorerst kann ich mir mit volatile behelfen ... dann sehe ich trotz eingeschalteter Optimierung die Werte im Debugger ... Jetzt kann ich den eigentlichen Fehler suchen :-). Markus
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.