Habe mich jetzt ewig damit rumgeschlagen um rauszufinden dass es die Optimierung des Codes war, der mir sämtlichen Spaß genommen hat. Folgender Code ist mehr oder weniger aus dem Atmega-buch von G.Schmitt. Er funktioniert standardmäßig nicht, auch der Debugger überspringt einfach die nms Befehle. Nur wenn die Optimierungsstufe 0 ist, dann funktioniert es ungefähr. Bereits Stufe 1 (und voreingestelle S) rationalisieren die leere Schleife einfach weg. Was kann ich jetzt tun ohne auf meine Optimierung zu verzichten? Ich hatte es bereits mit __asm NOP; probiert, das kannte er nicht. P.S: Ich versuche es bewusst ohne Timer zur Übung..
1 | #include <avr/io.h> |
2 | //#include <avr/interrupt.h>
|
3 | #define TAKT 16000000UL /* 16 Mhz-Takt; hier richtigen Wert eintragen */ |
4 | |
5 | |
6 | |
7 | //Subroutinen
|
8 | void ms(void){unsigned int i; for (i=0; i<TAKT/6000; i++){};} |
9 | void nms(unsigned int count){unsigned int i; for(i=0;i<count;i++){ ms();}} |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | int main(void) |
17 | {
|
18 | unsigned int hell; |
19 | hell=0; |
20 | DDRD |= (1 << PD5); // PD0 als Ausgang festlegen |
21 | DDRD |= (1 << PD6); // PD0 als Ausgang festlegen |
22 | PORTD |= (1 << PD5); // PD0 aktivieren |
23 | PORTD |= (1 << PD6); // PD0 aktivieren |
24 | |
25 | |
26 | while(1) // Unendlich lang wiederholen |
27 | {
|
28 | PORTD |= (1 << PD5); // PD0 aktivieren |
29 | |
30 | nms(1000); |
31 | |
32 | PORTD &= ~(1 << PD5); |
33 | nms(1000); |
34 | |
35 | }
|
36 | |
37 | }
|