atmega16 läuft das programm nur einmal durch

#729406
Lesenswert?

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
Gast #729417
Lesenswert?

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
Gast #760442
Lesenswert?

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?
Moderator Persönliche Seite #760478
Lesenswert?

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.
#760701
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren