PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie kann ich eine Delay Funktion nutzen ?



rob_88_20p
10.01.2009, 14:43
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.

BurningWave
10.01.2009, 15:47
In der Datei delay.h sind mehrere Funktionen zur Verzögerung von Programmen vordefiniert. Z.B.:



_delay_ms(x);


Diese Funktion verzögert das Programm um ca. x*1ms.

Bevor man diese Funktionen nutzen kann muss man die Headerdatei mit


#include <util/delay.h>

eingebunden werden und das Makro F_CPU mit dem µC-Takt definiert werden, z.B.:


#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

rob_88_20p
10.01.2009, 18:17
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.

rob_88_20p
10.01.2009, 18:20
oder waren es vieleicht 1000Hz und somit 1Mhz
ich weis es nicht mehr so genau

rob_88_20p
10.01.2009, 18:24
ou ich sehe grade das im roboter ein Quarz verbaut ist ...

...es steht AQ16.000 drauf

keine ahnung was das heissen soll

rob_88_20p
10.01.2009, 19:34
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.

rob_88_20p
10.01.2009, 19:43
ach ja dr Quarz hat glaub ich 116 Mhz

PCMan
10.01.2009, 21:11
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

rob_88_20p
10.01.2009, 23:36
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

rob_88_20p
10.01.2009, 23:59
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

rob_88_20p
11.01.2009, 12:54
also erst mal vielen dank.
Ich habe eigentlich gedacht das man mit den _delay_ms(x) nur etwa 375 ms verzögern kann aber ich hab 1000 eingegeben und es funzt gut.

Aber leider funktioniert das mit den Schaltern immer noch nicht.
Nur das mit den LED's und eine Datei bei der erst die LED's anfangen zu blinken und dan der Roboter ein kleines Tänzchen macht und mein sogenanter "Kanten nicht herunterfallen Schutz" funktioniert.

hier die drei Dateien :

http://dennis4123.de.funpic.de/Roboter_Experimente.zip

rob_88_20p
12.01.2009, 12:11
Ich hab jetzt heraus gefunden warum diese Schalter nicht funktionieren

bei den Sensoren ist VCC (und in meinem fall) PD4 und PD3 durch einen 82KOhm widerstand dauerhaft verbunden und GND wird dan mit einem 1kOhm widerstand zu den einzeln pin dazugeschaltet das habe ich bei den Schaltern nicht

Ich werde jetzt noch die Wiederstände besorgen und das fertig basteln dann solte das ganze funktionieren

lg rob_88_20p