Forum: Compiler & IDEs atmega16 läuft das programm nur einmal durch


von alex (Gast)


Lesenswert?

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!!!!

von John S. (linux_80)


Lesenswert?

Welches Programm gleich wieder ?

von Michael U. (amiga)


Lesenswert?

Hallo,

ich hasse Fortsetzungsromane.
Besonders, wenn nicht drin steht, wann die nächste Fortsetzung (das 
Programm) erscheint...

Gruß aus Berlin
Michael

von Falk B. (falk)


Lesenswert?

Fehler in Zeile 0815.

MfG
Falk

von alex (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Falk B. (falk)


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

von alex (Gast)


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

von Tester (Gast)


Lesenswert?

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.

von Richard B. (rbrose)


Lesenswert?

Vielleicht weil dein Atmega16 mit 1Mhz läuft?

von Tester (Gast)


Lesenswert?

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!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Tester (Gast)


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?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Karl H. (kbuchegg)


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.

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
Noch kein Account? Hier anmelden.