Hallo,
ich bin nicht ganz fit in GCC, und hätte da mal eine Frage zu
Optimierungen. In meinem kleinen Testprogramm möchte ich für
Versuchsmessungen die sechs möglich Zustände an einem BLDC-Motor via
Taster durchschalten.
Eine LED zeigt "Schaltzustand Eins". Ein Pwm Ausgang ist mit den anderen
Ausgängen Hardwareseite verknüpft und eine Leistungsstufe
nachgeschaltet.
Das Programm macht eigentlich schon genau das was es soll, nur kann ich
es nicht optimiert kompilieren. Os, O1, O2 sowie O3 rationalisieren
scheinbar meinen durch den Taster an PD2 generiert Interrupt weg...
In der Simulation laufen alle Optimierungen, aber auf dem Atmega8 nur
das unoptimierte Programm O0.
Da das spätere Programm etwas umfangreicher seien soll, wäre es gut,
wenn die Optimierung laufen würde.
Vielleicht kann mir ja jemand helfen...
MfG Markus
Hier mein Programm:
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include "bldc.h"
|
4 |
|
5 |
|
6 | // Ausgangszustände der Ports
|
7 | static const uint8_t portout[8] =
|
8 | {0,0b00011000,0b00010010,0b00000110,0b00100100,0b00100001,0b00001001,0b00010101};
|
9 |
|
10 |
|
11 | uint8_t var1;
|
12 |
|
13 |
|
14 | int main(void){
|
15 |
|
16 | DDRB = 0b00111000;
|
17 | DDRC = 0b00111111;
|
18 | DDRD = 0x00;
|
19 |
|
20 | //waits(10);
|
21 |
|
22 | pwmein();
|
23 | pwmpower(60);
|
24 |
|
25 | int0_ein(1);
|
26 | sei();
|
27 |
|
28 | var1 = 1;
|
29 |
|
30 | while(1){
|
31 |
|
32 | PORTC = portout[var1];
|
33 | if(var1 == 1){
|
34 | PORTB |= (1 << PB5);}
|
35 | else{
|
36 | PORTB &= ~(1 << PB5);}
|
37 |
|
38 | //waits(1);
|
39 | }
|
40 | }
|
41 |
|
42 |
|
43 | ISR(INT0_vect){
|
44 | if(var1 < 6){
|
45 | var1 ++;}
|
46 |
|
47 | else{
|
48 | var1 = 1;};
|
49 | }
|
und hier die selbstgefuschte bldc.h
1 | // PWM einrichten und Leistung einstellen
|
2 | void pwmein(){
|
3 | TCCR2 = ((1 << WGM20) | (1 << COM21) | (1 << CS21));}
|
4 |
|
5 | void pwmpower(uint8_t temp){
|
6 | OCR2 = temp;}
|
7 |
|
8 |
|
9 |
|
10 | // Mal nen bissel warten....
|
11 | // x us warten
|
12 | void waitus(uint16_t time){
|
13 | TCNT1 = 0x00;
|
14 | OCR1A = time;
|
15 | TCCR1B = 0b00000010;
|
16 |
|
17 | while ( !(TIFR & ( 1 << OCF1A))) {;}
|
18 |
|
19 | TCCR1B = 0x00;
|
20 | OCR1A = 0x00;
|
21 | TIFR &= (1 << OCF1A);
|
22 | }
|
23 |
|
24 | // x s warten
|
25 | void waits(uint16_t time){
|
26 |
|
27 | uint16_t temp;
|
28 | for(temp = 1;temp <= time;temp ++){
|
29 | TCNT1 = 0x00;
|
30 | OCR1A = 31250;
|
31 | TCCR1B = 0b00000100;
|
32 |
|
33 | while ( !(TIFR & ( 1 << OCF1A))) {;}
|
34 |
|
35 | TCCR1B = 0x00;
|
36 | OCR1A = 0x00;
|
37 | TIFR &= (1 << OCF1A);
|
38 | }
|
39 | }
|
40 |
|
41 |
|
42 | void int0_ein(uint8_t option){
|
43 | // Option 0: Pegel fällt auf logisch 0
|
44 | // Option 1: Pegel steigt auf logisch 1
|
45 | // Option 2: Logikpegel ändert sich
|
46 |
|
47 | if(option == 1){
|
48 | MCUCR |= ((1 << ISC01)|(1 << ISC00));
|
49 | }
|
50 |
|
51 | if(option == 0){
|
52 | MCUCR &= ~(1 << ISC00);
|
53 | MCUCR |= (1 << ISC01);
|
54 | }
|
55 |
|
56 | if(option == 2){
|
57 | MCUCR &= ~(1 << ISC01);
|
58 | MCUCR |= (1 << ISC00);
|
59 | }
|
60 |
|
61 | GICR |= (1 << INT0);
|
62 | }
|
63 |
|
64 |
|
65 | void int1_ein(uint8_t option){
|
66 | // Option 0: Pegel fällt auf logisch 0
|
67 | // Option 1: Pegel steigt auf logisch 1
|
68 | // Option 2: Logikpegel ändert sich
|
69 |
|
70 | if(option == 1){
|
71 | MCUCR |= ((1 << ISC11)|(1 << ISC10));
|
72 | }
|
73 |
|
74 | if(option == 0){
|
75 | MCUCR &= ~(1 << ISC10);
|
76 | MCUCR |= (1 << ISC11);
|
77 | }
|
78 |
|
79 | if(option == 2){
|
80 | MCUCR &= ~(1 << ISC11);
|
81 | MCUCR |= (1 << ISC10);
|
82 | }
|
83 |
|
84 | GICR |= (1 << INT1);
|
85 | }
|