www.mikrocontroller.net

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


Autor: alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!!!

Autor: John Small (linux_80)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welches Programm gleich wieder ?

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Gruß aus Berlin
Michael

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fehler in Zeile 0815.

MfG
Falk

Autor: alex (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Beispielprogramm ist schlecht. Denn die "Warteschleifen" können vom 
Compiler wegoptimiert werden. BEsser so.
// defines
#define LED_DDR  DDRB
#define LED_PORT PORTB
#define LED_PIN  PINB
#define LED      PB2

#include <avr/io.h>
#ifndef F_CPU
/* Definiere F_CPU, wenn F_CPU nicht bereits vorher definiert 
   (z.B. durch Übergabe als Parameter zum Compiler innerhalb 
   des Makefiles). Zusätzlich Ausgabe einer Warnung, die auf die
   "nachträgliche" Definition hinweist */
#warning "F_CPU war noch nicht definiert, wird nun mit 3686400 definiert"
#define F_CPU 3686400UL     /* Quarz mit 3.6864 Mhz */
#endif
#include <util/delay.h>     /* in älteren avr-libc Versionen <avr/delay.h> */ 
 
/*
 lange, variable Verzögerungszeit, Einheit in Millisekunden
 
Die maximale Zeit pro Funktionsaufruf ist begrenzt auf 
262.14 ms / F_CPU in MHz (im Beispiel: 
262.1 / 3.6864 = max. 71 ms) 
 
Daher wird die kleine Warteschleife mehrfach aufgerufen,
um auf eine längere Wartezeit zu kommen. Die zusätzliche 
Prüfung der Schleifenbedingung lässt die Wartezeit geringfügig
ungenau werden (macht hier vielleicht 2-3ms aus).
*/
 
void long_delay(uint16_t ms) {
    for(; ms>0; ms--) _delay_ms(1);
}
 
int main( void )
{
    LED_DDR = ( 1 << LED );     // als Ausgang setzen
 
    while( 1 ) {                // Endlosschleife
        LED_PORT ^= ( 1 << LED );  // Toggle 
        long_delay(1000);       // Eine Sekunde warten...
    }
 
    return 0;
}

MFG
Falk

Autor: alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tester (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht weil dein Atmega16 mit 1Mhz läuft?

Autor: Tester (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tester (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.