Delay in AVR Studio

Gast #753968
Lesenswert?

Hallo,
ich bin neu in der yC Welt und habe Probleme mit der _delay_ms(1) 
Funktion.
Ich verwende:
AVR Studio 4.13 Service Pack 2 Build 571 mit GCC
AVR ISP mkII Programmer
ATmega48

Ich möchte eine LED am PORTB zum blinken bringen und verwende folgenden 
Code:
1
#include <avr/io.h>
2
#ifndef F_CPU
3
#warning "F_CPU war noch nicht definiert!"
4
#define F_CPU 8000000UL
5
#endif
6
#include <util/delay.h>
7
 
8
void long_delay(uint16_t ms) {
9
    for(; ms>0; ms--) _delay_ms(1);
10
}
11
 
12
int main( void )
13
{
14
    DDRB = ( 1 << PB0 );        // PB0 an PORTB als Ausgang setzen
15
 
16
    while( 1 ) {                // Endlosschleife
17
        //PORTB = 0x00;      // Testeintrag1
18
        //PORTB = 0x01;      // Testeintrag2
19
        PORTB ^= ( 1 << PB0 );  // Toggle PB0 z.B. angeschlossene LED
20
        long_delay(1000);       // Eine Sekunde warten...
21
    }
22
 
23
    return 0;
24
}

Ich habe die Optimierung auf Os gestellt,
den Takt (F_CPU) richtig eingestellt,
und keine zu grossen Delaywerte laut delay.h verwendet.

Wenn ich das Programm übertrage blinkt die LED nicht. Wenn ich anstatt 
des Toggelns den Testeintrag1 oder Testeintrag2 verwende kann ich die 
LED ein bzw. ausschalten.
Es sieht so aus als würde das Programm nie über die Funktion 
long_delay() kommen. (alles was nachher kommt wird nicht mehr 
ausgeführt)

Ich hoffe jemand kann mir weiterhelfen. Mir fallen keine Möglichkeiten 
mehr ein was ich noch umstellen oder umkonfigurieren könnte.

Danke Norton
Angehängte Dateien:
Moderator Persönliche Seite #754016
Lesenswert?

Hmm, aber das stammt aus einer anderen C-Quelle als deine da oben,
nicht?  Ungefähr so:
1
#include <avr/io.h>
2
#ifndef F_CPU
3
#warning "F_CPU war noch nicht definiert!"
4
#define F_CPU 8000000UL
5
#endif
6
#include <util/delay.h>
7

8
void long_delay(uint16_t ms) {
9
    for(; ms>0; ms--) _delay_ms(1);
10
}
11

12
void LED_ein( void ) {
13
    PORTB = 0;
14
}
15

16
void LED_aus( void ) {
17
    PORTB = ( 1 << PB0 );
18
}
19

20
int main( void )
21
{
22
    DDRB = ( 1 << PB0 ) | ( 1 << PB1 ) | ( 1 << PB2 ) |
23
           ( 1 << PB4 );        // Bits 0, 1, 2 und 4 PORTB als Ausgang setzen
24
    PORTB = ( 1 << PB2 ) | ( 1 << PB3) |
25
            ( 1 << PB5 ) | ( 1 << PB6 ) | ( 1 << PB7);
26

27
    while( 1 ) {                // Endlosschleife
28
        PORTB = 0x00;      // Testeintrag1
29
        PORTB = 0x01;      // Testeintrag2
30
        //PORTB ^= ( 1 << PB0 );  // Toggle PB0 z.B. angeschlossene LED
31
        //long_delay(1000);       // Eine Sekunde warten...
32
    }
33

34
    return 0;
35
}

Mich interessiert aber vor allem das Ergebnis, wenn du long_delay()
auch wirklich rufst.

Die Stackinitialisierung für den ATmega48 stimmt übrigens.
Gast #754142
Lesenswert?

Das Problem ist sicher der Watchdog, denn wenn ich in der long_delay() 
funktion den Watchdog resetiere funktioniert die Funktion.
1
void long_delay(uint16_t ms) {
2
    for(; ms>0; ms--)
3
  {
4
    _delay_ms(1);
5
    wdt_reset();
6
  }

Jetzt würde das ganze zwar funktionieren, aber ich würde trotzdem gerne 
wissen wie ich den Watchdog abschalten kann?
Wo muss ich ihn überall disablen und was muss ich wie reseten damit der 
Hund verschwindet?

Danke für die Hilfe!

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