mikrocontroller.net

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


Autor: Markus Fischbacher (Gast)
Datum:
Angehängte Dateien:

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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: Markus Fischbacher (Gast)
Datum:

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

Autor: Rick Dangerus (rick)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void wait_ms(unsigned int ms)
{
        #define max_ms          262100000/F_CPU
        
        unsigned int    j;
        ldiv_t  value;
        
        value = ldiv( ms, max_ms);
        
        for(j = value.quot; j > 0; j--)
        {
                _delay_ms(max_ms);
        }
        _delay_ms(value.rem);
}


Autor: ,,,, (Gast)
Datum:

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

Autor: Mike (Gast)
Datum:

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

Autor: Markus Fischbacher (Gast)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ricks Lösung so abgewandelt, daß keine Division nötig ist:
void wait_ms(unsigned int ms) 
{ 
        #define max_ms          262100000/F_CPU 
         
        for(; ms > max_ms; ms -= max_ms)
        { 
                _delay_ms(max_ms);
        } 
        _delay_ms(ms); 
} 

Autor: Markus Fischbacher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Rolf!

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.