Hallo,
ich bin hier seit einigen Tagen total am Verzweifeln. Ich starte gerade
ein neues µC-Projekt (Habe schon sehr viele Projekte gemacht) und
scheitere an den ersten drei Zeilen und weiß absolut nicht mehr weiter
woran es liegen könnte.
Mein Projekt besteht aus folgenden drei Dateien:
main.c:
1 | #include <avr/io.h>
|
2 |
|
3 | #include "stuff.h"
|
4 |
|
5 | int main(void)
|
6 | {
|
7 |
|
8 | DDRA |= 0x08;
|
9 |
|
10 | while(1)
|
11 | {
|
12 | waitms(4);
|
13 | PORTA ^= 0x08;
|
14 | }
|
15 |
|
16 | return 0;
|
17 |
|
18 | }
|
stuff.c:
1 | #include <util/delay.h>
|
2 |
|
3 | #include "stuff.h"
|
4 |
|
5 |
|
6 | void waitms(uint16_t milliseconds)
|
7 | {
|
8 | uint16_t i;
|
9 |
|
10 | for(i=0;i<milliseconds;i++)
|
11 | {
|
12 | _delay_ms(1);
|
13 | }
|
14 | }
|
stuff.h:
1 | #ifndef STUFF_H
|
2 | #define STUFF_H
|
3 |
|
4 | void waitms(uint16_t milliseconds);
|
5 |
|
6 | #endif
|
Hier sollte ja der Pin PA3 alle 4ms Toggeln.
Statt dessen macht er gar nichts. Über mehrere Tests habe ich nun
herausgefunden: Die Funktion waitms wird aufgerufen und auch bis zum
Ende durchlaufen. Doch danach springt er nicht in die main-while zurück,
sondern startet das Programm von Anfang an neu, aber ohne Reset
Das zeigt sich daran, das wenn ich den Pin-Toggel befehl direkt nach
DDRA |= 0x08; schreibe, dann Toggelt der Pin tatsächlich alle 4ms...
Und es kommt noch besser: Wenn ich die Funktion waitms direkt in die
main.c mit rein nehme funktioniert das Programm tadellos. Probleme
Treten erst auf wenn die Funktion in der stuff.c liegt.
Ich finde das langsam sehr kurios. Habe das Projekt schon zwei mal neu
aufgesetzt, ohne Erfolg. Mit der vorliegenden Entwicklungsumgebung und
Compiler habe ich vor ein paar Wochen noch ein anderes Projekt
fehlerfrei Kompiliert und genutzt.
Zu dem Workaround:
- ATMega128 (Brownout und Watchdog sind aus, Externer Quarz 8MHz)
- WinAVR20090313
- Editor: Codeblocks
Vielleicht kennt jemand das Problem und kann mir helfen?