Forum: Mikrocontroller und Digitale Elektronik delay funktion (led blink nicht sondern dauerleuchten)


von tim (Gast)


Lesenswert?

Hallo,

folgenden Code habe ich aus mc.net übernommen. Ich kann nur ein 
dauerleuchten der LED erzeugen, sie sollte aber blinken. Wo ist mein 
Fehler??? Ich habe ihn nach 7h immer noch nicht gefunden. Verzweifelung! 
Ich bin dabei C und MC zu
lernen, und hänge jetzt echt fest.
Ich habe einen atmel 32 mit 7.328Mhz

Danke für eure Hilfe!!!



#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 )
{
    DDRB = ( 1 << PB0 );        // PB0 an PORTB als Ausgang setzen

    while( 1 ) {                // Endlosschleife
        PORTB ^= ( 1 << PB0 );  // Toggle PB0 z.B. angeschlossene LED
        long_delay(1000);       // Eine Sekunde warten...
    }

    return 0;
}

von Karl H. (kbuchegg)


Lesenswert?

In deinem Programm gibt es erst mal keinen Fehler.
Wenn die LED nicht wie gewünscht blinkt, dann hat das
andere Ursachen, die von hier aus nicht diagnostizierbar
sind.

zb. ist das Programm korrekt gebrannt worden?

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


Lesenswert?

Hast du lange genug gewartet mit deiner Einschätzung?

Wenn du statt mit 7,37 MHz vom Quarz mit den internen 1 MHz des
RC-Oszillators fährst, geht die LED erst nach reichlich 7 s das
erste Mal aus (um dann 7 s lang aus zu bleiben).

von Gerhard. (Gast)


Lesenswert?

Ist es moeglich dass der AVR CPU nicht angegeben wurde? Ich sehen 
nirgendwo den AVR Typ.

Ich habe das Program auf einen PIC in CCS C schnell ausprobiert und es 
fuktionierte auf Anhieb. Am eigentlichen Program kann es wirklich nicht 
liegen.

Gruss,
Gerhard

von Thomas K. (thomas47058)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

bin neu hier und hab vor mich richtig ins Thema einzuarbeiten. Dazu habe 
ich mir von Olimex das Board P28 gekauft zusammen mit einem Atmega8 und 
dem AVRISP MK2 USB Programmierer. Alles soweit schön und gut. Das 
Programmieren funktioniert. Jedoch funktionieren nur die Programme, die 
auf der Olimex Homepage als Beispiel zu finden sind. Sobald ich einen 
Quell-C-Text herauskopiere, in ein eigenes Projekt einfüge, kompiliere 
und versuche zu flashen, geht es nicht mehr. Das BlinkingLed Programm zB 
sorgt nur dafür, dass die LED dauerleuchtet, aber nicht blinkt.

Der Atmega8 wird mit einem 8MHz Quarz getaktet. Ich benutze AVR Studio 
um zu programmieren und zu flashen, neueste Version. WinAVR ist auch 
frisch installiert.

Ich habe schon vermutet, dass die Makefile evtl nicht passt, die AVR 
Studio kreiert. Allerdings weiß ich nicht welche Einstellungen ich noch 
tätigen soll, abgesehen von "Device" und "Frequency" unter 
Project>Config. Options. Sind sonst noch wichtige Einstellungen 
vorzunehmen? Im Anhang das Makefile von AVR Studio. Bitte gebt bescheid 
wenn ich das Makefile von Olimex auch posten soll.

Vielen Dank im Voraus!
Thomas

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.