-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Wie kann ich eine Delay Funktion nutzen ?

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    26.07.2008
    Beiträge
    80

    Wie kann ich eine Delay Funktion nutzen ?

    Anzeige

    Hi Leute

    Ich hab ne Frage :

    Ich bin ein totaler Anfänger und will meinem selbstgebauten Roboter Programmieren.
    Das habe ich zwar schon mit zwei IR-Sensoren geschafft und er fährt auch richtig der Linie nach, aber ich kriegs nicht hin den Roboter mit den 2 Schaltern zu steuern.
    Ich habe jeweils zwei schalter vorne und zwei hinten, aber ich will nur die vorderen zwei verwenden die hinteren sind noch nicht montiert, definiert und eingestekt.

    Ich verwende:

    Atmega88 Prozessor.
    AVR Studio 4 um zu Kompilieren und AVR Dude um das ganze drauf zu bruzeln.

    Hier ist mein problem:

    Ich will das der Roboter, wenn ich zbs. Den rechten vorderen Schalter betätige, erst rückwärts nach rechts und dan geradeaus fährt.

    Dazu will ich eine Delay funktion verwenden das sieht dan etwa so aus :

    else if ( SWITCH_RIGHT == 1 && SWITCH_LEFT == 0 ){
    turnRIGHTbackward();
    (delay)(10000);
    driveForward();
    STATSLED0_ON;
    STATSLED1_OFF;
    }


    Was ich wissen will ist :

    Wie kann ich diese Delay funktion definieren ? Ein Kolege von mir hat das mal so versucht:

    void delay(long delay){
    int i, dummy;
    for(i=0; i<delay; i++)
    {
    dummy++;
    }
    }


    Hat leider nicht funktioniert.

    Hier ist noch die gesammte Programmierunsdatei:
    Ihr müsst sie noch kurz ins AVR Studio schmeissen:

    http://dennis4123.de.funpic.de/Robo_Schalter.c

    Ich hoffe Ihr könnt mir helfen.

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    23
    Beiträge
    656
    In der Datei delay.h sind mehrere Funktionen zur Verzögerung von Programmen vordefiniert. Z.B.:

    Code:
    _delay_ms(x);
    Diese Funktion verzögert das Programm um ca. x*1ms.

    Bevor man diese Funktionen nutzen kann muss man die Headerdatei mit
    Code:
    #include <util/delay.h>
    eingebunden werden und das Makro F_CPU mit dem µC-Takt definiert werden, z.B.:
    Code:
    #define F_CPU 3686400UL //bei einer Frequenz von 3,6864MHz
    Die Funktion von deinem Kolegen würde auch funktionieren, sie verzögert das Programm aber nur sehr sehr kurz, da sie den µC nur kurze Zeit (für ein paar Takte) beschäftigt.

    Wenn man das Programm um eine genaue Zeit verzögern will sollte man einen externen Quarz und einen Timer verwenden.

    mfg _R2D2

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    26.07.2008
    Beiträge
    80
    ach darum

    den als wir den roboter gebaut haben haben wir auch einen Quarz rein gelötet aber der "Lehrer" hat gesagt das das nicht nötig sei
    tia jetzt weis ichs

    Danke für die antworten

    der Atmega 88 hat 1000Mhz gluab ich.

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    26.07.2008
    Beiträge
    80
    oder waren es vieleicht 1000Hz und somit 1Mhz
    ich weis es nicht mehr so genau

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    26.07.2008
    Beiträge
    80
    ou ich sehe grade das im roboter ein Quarz verbaut ist ...

    ...es steht AQ16.000 drauf

    keine ahnung was das heissen soll

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    26.07.2008
    Beiträge
    80
    Ich hab das mal versucht is das so richtig ?

    http://dennis4123.de.funpic.de/Robo_Schalter_2x.c

    irgend etwas muss da nicht stimmen den der roboter rührt sich jetzt überhaupt nicht mehr , ich habs auch mal mit verschiedenen Pins versucht aber funzt nicht.

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    26.07.2008
    Beiträge
    80
    ach ja dr Quarz hat glaub ich 116 Mhz

  8. #8
    Erfahrener Benutzer Begeisterter Techniker Avatar von PCMan
    Registriert seit
    05.08.2006
    Ort
    Munich
    Beiträge
    311
    Hallo rob,
    der Quarz hat wenn dann wahrscheinlich 16MHz (==16.000.000 Hz). Ein 116MHz Quarz wäre dann natürlich schon ein "bisschen" zu schnell für den AVR.

    Quarze musst du wie oben schonmal erwähnt nur dann einlöten, wenn du absolut zeitkritsich arbeiten willst und vorallem schnell arbeiten musst. Der AVR schafft ja alleine schon ohne Quarz 8MHz +/- eine geringe Tolleranz.

    Bei extern eingelöteten Qarz musst du, um den Controller mit der entsprechenden Frequenz betreiben zu können auch die Fusebits entsprechend setzen (dazu gibts einen sehr guten Eintrag im WiKi), denn ansonsten wird immer der interne Oszillator (default auf 1MHz getaktet) vom µC verwendet.
    Wenn du einen externen Quarz verwendest und auch die Fusebits richtig eingestellt hast, musst du in der util/delay.h gucken, wie viel du maximal verzögern kannst.
    Wenn du nämlich auf eine Verzögerung von sagen wir mal einer Sekunde kommen willst, kannst du da nicht mehr einfach _delay_ms(1000) verwenden, sondern kannst dir eine kleine schleife schreiben, die dir z.B. 50 mal _delay_ms(20) ausführt.
    Grüße Simon

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    26.07.2008
    Beiträge
    80
    Ich hab das gemacht mit dem util delay.h aber der roboter macht jetzt garnichts mehr ist den das hier so richtig ?

    http://dennis4123.de.funpic.de/Robo_Schalter_2x.c

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    26.07.2008
    Beiträge
    80
    Ich habe gerade einen kleinen Versuch gestartet

    Ich hab eine datei geschirben die nur die LED's zum blinken bringt funktiniert besten ich habd en fehler gefunden ich hab den IC ausversehen als eines Atmega 128 programmiert es ist aber ein Atmega 88 ich werde jetzt versuchen das mit den schaltern auch noch hin zu bekommen

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •