kann mir bitte jemand helfen. Habe das folgende programm mit winavr ohne fehler kompiliert und das *.hex file mit einen isp Programmer in den atmega16 geschrieben. soweit alles wunderbar. das programm läuft aber nur einmal durch. Bitte um hilfe!!!!
Hallo, ich hasse Fortsetzungsromane. Besonders, wenn nicht drin steht, wann die nächste Fortsetzung (das Programm) erscheint... Gruß aus Berlin Michael
toggle.c. müsste im dateianhang sein. Ist ein Beispielprogramm bei WinAVR Habe schon sämtliche Sachen probiert. Fuses. Jtag auschalten usw. weiss nicht mehr weiter.
Das Beispielprogramm ist schlecht. Denn die "Warteschleifen" können vom Compiler wegoptimiert werden. BEsser so.
1 | // defines
|
2 | #define LED_DDR DDRB
|
3 | #define LED_PORT PORTB
|
4 | #define LED_PIN PINB
|
5 | #define LED PB2
|
6 | |
7 | #include <avr/io.h> |
8 | #ifndef F_CPU
|
9 | /* Definiere F_CPU, wenn F_CPU nicht bereits vorher definiert
|
10 | (z.B. durch Übergabe als Parameter zum Compiler innerhalb
|
11 | des Makefiles). Zusätzlich Ausgabe einer Warnung, die auf die
|
12 | "nachträgliche" Definition hinweist */
|
13 | #warning "F_CPU war noch nicht definiert, wird nun mit 3686400 definiert"
|
14 | #define F_CPU 3686400UL /* Quarz mit 3.6864 Mhz */ |
15 | #endif
|
16 | #include <util/delay.h> /* in älteren avr-libc Versionen <avr/delay.h> */ |
17 | |
18 | /*
|
19 | lange, variable Verzögerungszeit, Einheit in Millisekunden
|
20 |
|
21 | Die maximale Zeit pro Funktionsaufruf ist begrenzt auf
|
22 | 262.14 ms / F_CPU in MHz (im Beispiel:
|
23 | 262.1 / 3.6864 = max. 71 ms)
|
24 |
|
25 | Daher wird die kleine Warteschleife mehrfach aufgerufen,
|
26 | um auf eine längere Wartezeit zu kommen. Die zusätzliche
|
27 | Prüfung der Schleifenbedingung lässt die Wartezeit geringfügig
|
28 | ungenau werden (macht hier vielleicht 2-3ms aus).
|
29 | */
|
30 | |
31 | void long_delay(uint16_t ms) { |
32 | for(; ms>0; ms--) _delay_ms(1); |
33 | }
|
34 | |
35 | int main( void ) |
36 | {
|
37 | LED_DDR = ( 1 << LED ); // als Ausgang setzen |
38 | |
39 | while( 1 ) { // Endlosschleife |
40 | LED_PORT ^= ( 1 << LED ); // Toggle |
41 | long_delay(1000); // Eine Sekunde warten... |
42 | }
|
43 | |
44 | return 0; |
45 | }
|
MFG Falk
Hallo Falk! Vielen Vielen Dank. Jetzt habe ich mein erstes C Programm und es funktioniert. Arbeite in der Arbeit mit E-LAB (Pascal). Will aber für meine privaten sachen auf C umsteigen. Danke nochmals. MFG alex
Hallo, ich habe diesen Code in mein STK500 kopiert und ausgeführt. Leider blinkt LED viel langsamer als 1s Takt. Bei mir kommt wahrscheinlich etwa 4 bis 5s Takt. Woran kann es liegen? Ich habe Atmega16.
wie kann ich das überprüfen? bzw. wie kann ich den Code ändern, um das zu überprüfen? Die Zeile F_CPU 1000000UL bringt nichts!
AVR Studio stellt F_CPU ,,von außen'' ein, dadurch wird das Stück da oben nicht erreicht. (Heutige) AVRs werden mit dem internen 1-MHz-RC-Oszillator ausgeliefert. Wenn du das ändern willst, musst du die Fuses umprogrammieren. Da du einen STK500 hast, solltest du auf ,,external clock'' stellen, damit der Taktgeber vom STK benutzt wird.
Bei mir stand es "Int RC Osc. 1 MHz; Start-up time 6 CK + 64ms" Warum könnte ich nicht mit #define F_CPU Taktrate einstellen? Was muss ich jetzt ändern? Es gibt sehr viele Optionen mit Ext. RC Osc.... welche soll ich bei der Fuses-Programmierung wählen?
Tester wrote: > Warum könnte ich nicht mit #define F_CPU Taktrate einstellen? Kurze Antwort: Weil du dich für AVR Studio entschieden hast. ;-) Lange Antwort: Du musst es irgendwo in den Compiler-Optionen von AVR Studio einstellen. Dieses macht daraus ein -DF_CPU=... für den Compiler, und dadurch greift deine eigenen Definition nicht, denn diese ist explizit nur dafür bestimmt zu greifen, wenn F_CPU an dieser Stelle noch gar nicht definiert ist. > Was muss ich jetzt ändern? Es gibt sehr viele Optionen mit Ext. RC > Osc.... welche soll ich bei der Fuses-Programmierung wählen? Die für den externen Takt, also keinerlei Oszillator. Der Oszillator ist ja auf dem STK500 bereits drauf, du willst den Oszillator des Controllers daher nicht benutzen. Wie die Option genau heißt, weiß ich gerade nicht, da ich hier kein Windows (und damit kein AVR Studio) habe und auch keins haben will.
Tester wrote:
> Warum könnte ich nicht mit #define F_CPU Taktrate einstellen?
Weil diese 'Einstellung' keine Einstellung ist, sondern eine
Benachrichtigung. Es teilt dem Compiler mit, wie dein Chip
eingestellt ist.
Angenommen du hast eine Uhr. Dann kannst du das Ziffernblatt
ummalen auf 90 Minutenstriche für eine vollständige Minutenzeiger-
drehung. Das heist aber noch lange nicht, dass der Zeiger jetzt
90 Minuten für eine Umdrehung braucht. Wenn du das willst, musst
du das Uhrwerk umbauen. Lediglich das Zifferblatt neu pinseln
bringt nicht viel.
Die F_CPU Angabe ist im Grunde nichts anderes als die Angabe
wieviele Striche auf dem Zifferblatt sein sollen.
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.