Servus beieinander,
ich hab gerade eine große auseinandersetzung mit meinem Compiler.
sobald irgend eine Optimierung aktiv ist funktioniert meine if-Bedingung
nicht mehr (ist nie oder immer wahr, je nach optimierung)
Ich nutze ganz normal das AVR Studio V4.15
In einer ISR wird ein status auf 0x03 gesetzt und später in der main()
abgerufen.
1 | #define F_CPU 10000000 // Clock in Hz ( 10 MHz )
|
2 | #include <avr/io.h>
|
3 | #include <avr/interrupt.h>
|
4 |
|
5 |
|
6 | uint8_t status = 0b00000000;
|
7 |
|
8 |
|
9 | void initialize (void) {
|
10 |
|
11 |
|
12 | // Timer/Counter0 (8-bit) deaktiv
|
13 | TCNT0 = 0x00;
|
14 | OCR0 = 0;
|
15 | TCCR0 = 0;
|
16 |
|
17 | // Timer/Counter1 (16-bit)
|
18 | TCNT1 = 0;
|
19 | OCR1A = 0;
|
20 | OCR1B = 0;
|
21 | TCCR1A = 0; // Normal mode, normal Port operation
|
22 | TCCR1B = (1<<ICNC1) | (1<<CS11) | (1<<CS10); // Noise Canceler, Input Capture on falling Edge, prescaling by 64
|
23 |
|
24 | // Interrupt Enable Register
|
25 | TIMSK = (1<<TICIE1); // Timer/Counter0 Overflow, Timer/Counter1 Overflow, Timer/Counter1 Input Capture
|
26 |
|
27 | // I/O Ports
|
28 | DDRA = 0xFF;
|
29 | DDRB = 0xFF;
|
30 | DDRC = 0xFF;
|
31 | DDRD = 0xFF;
|
32 | DDRE = 0;
|
33 |
|
34 | PORTA = 0xFF;
|
35 | PORTB = 0xFF;
|
36 | PORTC = 0xFF;
|
37 | PORTD = 0xFF;
|
38 | PORTE = 0xFF;
|
39 |
|
40 | }
|
41 |
|
42 | ISR ( TIMER1_CAPT_vect ) { // Input Capture
|
43 | ...
|
44 | status = 0x03;
|
45 | }
|
46 | int main (void) {
|
47 |
|
48 |
|
49 | initialize();
|
50 |
|
51 | sei();
|
52 |
|
53 | while(1) {
|
54 |
|
55 | PORTB = (( PORTB & 0xF8 ) ^ 0x80) | ( ~status & 0x07 );
|
56 |
|
57 | if ( status & 0x03 ) {
|
58 | status &= ~(1<<1);
|
59 | PORTC = 0xAA;
|
60 | }
|
61 |
|
62 | }
|
63 | return 0;
|
64 | }
|
Mit der Compilereinstellung -O0 funktioniert das, mit allen anderen ist
die if-Bedingung immer oder nie wahr!???
Warum?????
Ach ja, im Simulator wie auch auf meiner Hardware das selbe Problem!