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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.