Forum: Mikrocontroller und Digitale Elektronik ATMega168 & avr-gcc 3.4.4


von Markus Fischbacher (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute!

Ich habe ein Phänomen mit meinem AtMega168 in Verbindung mit dem
avr-gcc 3.4.4.
Es gibt ja ein Makro _delay_ms(...) welches eine gewisse Anzahl an
Millisekunden warten soll.
Ich habe ein Programm in dem ich 1000ms warten will.
Es toggelt einfach einen Portpin, an dem bei mir ein Relais hängt.
Jetzt wird aber, aus irgendeinem Grund, keine Pause von 1000ms
durchgeführt.
Das Relais klappert jetzt ohne Pause so vor sich hin.
Meine CPU arbeitet mit einem 20MHz Quarz.
Anbei der Sourcecode mit dem Makefile.

Bitte um Hilfe!

Danke!
Markus

von Rolf Magnus (Gast)


Lesenswert?


von Rolf Magnus (Gast)


Lesenswert?

Argl, der Bug mit den Unterstrichen ist immer noch nicht behoben...
Scheint auch keinen zu interessieren. Also im Browser in der URL-Zeile
das <u> und das </u> einfach entfernen.

von Markus Fischbacher (Gast)


Lesenswert?

Aha, ich hatte mir die Doku schon mal angeschaut.
Das mit der Maximalverzögerung habe ich dabei überlesen.
Somit muss ich für meinen Zweck einen Timer starten.
Oder gibt es da eine einfachere Möglichkeit?

Danke!

Markus

von Rick (rick)


Lesenswert?

1
void wait_ms(unsigned int ms)
2
{
3
        #define max_ms          262100000/F_CPU
4
        
5
        unsigned int    j;
6
        ldiv_t  value;
7
        
8
        value = ldiv( ms, max_ms);
9
        
10
        for(j = value.quot; j > 0; j--)
11
        {
12
                _delay_ms(max_ms);
13
        }
14
        _delay_ms(value.rem);
15
}

von ,,,, (Gast)


Lesenswert?

> Doku lesen!

Besser noch: die Delay-Funktion selber schreiben, dann weißt du auch,
was sie macht.

,,,, (QuadComma) = Hubert Müller*

*) Weil es ist ja wichtig, hier im Forum einen richtigen Namen zu
benutzen LOL

von Mike (Gast)


Lesenswert?

Wenn es nur zum testen ist, denn sonst würde ich auf jeden Fall einen
Tiemr nehmen. Dann kannst du auch eine Schleife um das delay machen.

Also z.B. 100 mal 10ms aufrufen. Wobei das dann natürlich nicht genau
1000ms sondern etwas mehr sind.

von Markus Fischbacher (Gast)


Lesenswert?

Danke Leute für die Lösungsvorschläge!
Es ist nicht nur zum Testen, sondern wird auch im "richtigen" Betrieb
verwendet.

@Rick: Ich werde deinen Sourcecode heute Abend mal ausprobieren.

Markus

von Rolf Magnus (Gast)


Lesenswert?

Ricks Lösung so abgewandelt, daß keine Division nötig ist:
1
void wait_ms(unsigned int ms) 
2
{ 
3
        #define max_ms          262100000/F_CPU 
4
         
5
        for(; ms > max_ms; ms -= max_ms)
6
        { 
7
                _delay_ms(max_ms);
8
        } 
9
        _delay_ms(ms); 
10
}

von Markus Fischbacher (Gast)


Lesenswert?

Danke Rolf!

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.