PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ASURO Timer



ASURO1995
25.10.2009, 11:56
hallo
möchte einen timer einbinden der beim start zu zählen anfängt. sobald ein gewünschter wert erreicht ist soll eine funktion ausgelöst werden.

z.b. mit diesem program soll der asuro 5" einer linie folgen, danach anhalten.



#include "asuro.h"

int main(void){
unsigned int data[2];
Init();
FrontLED(ON);
MotorDir(FWD,FWD);
MotorSpeed(255,255);
BackLED(ON,ON);
while(1){
LineData(data);
if (data[1] < 35 && data[0] < 35)
{MotorSpeed(255,255);
BackLED(ON,ON);
MotorDir(FWD,FWD);}
if (data[0] < 35 && data[1] > 35)
{MotorSpeed(150,255);
BackLED(OFF,ON);
MotorDir(FWD,FWD);}
if (data[0] > 35 && data[1] < 35)
{MotorSpeed(255,150);
BackLED(ON,OFF);
MotorDir(FWD,FWD);}
if (data[0] > 35 && data[1] > 35)
{MotorSpeed(155,155);
MotorDir(FWD,RWD);}
}
return 0;
}



hat jemand einen fertigen programmteil den man einfügen könnte.

besten dank

ASURO1995

KingTobi
25.10.2009, 12:06
Ich weiss nicht ob der Asuro da schon was mitbringt, aber sowas geht mit einem Timer.
http://www.rn-wissen.de/index.php/Timer/Counter_(Avr)

radbruch
25.10.2009, 12:17
Hallo

Man könnte z.B. die Schleifendurchgänge zählen:

...
int main(void){
unsigned int data[2];
unsigned long loopcounter=0; // zählt die Schleifendurchgänge
Init();
FrontLED(ON);
MotorDir(FWD,FWD);
MotorSpeed(255,255);
BackLED(ON,ON);
while(1){
if(loopcounter++ > 8000) // 8000 sind ca. 5 Sekunden
{
StatusLED(YELLOW);
MotorSpeed(0,0);
loopcounter=0;
while(!PollSwitch()); // Warten auf Taste
StatusLED(GREEN);
}
LineData(data);
...
Das ist zwar nicht sehr genau, allerdings ist auch der Aufwand sehr gering.

Gruß

mic

ASURO1995
25.10.2009, 17:55
danke :)

wird mir sicher weiterhelfen

ASURO1995
25.10.2009, 18:06
Jipiii...

hat funktioniert!!!!

danke \:D/

KingTobi
25.10.2009, 18:09
Ist zwar eine sehr einfache Variante, aber mit anderer Controllerfrequenz bekommst du auch ein anderes Ergebnis

radbruch
25.10.2009, 18:47
Der asuro läuft zwingend mit 8MHz;) Natürlich schwankt die Zykluszeit mit der Länge des Programms in der Hauptscheife, aber wenn es funktioniert ist es doch gut, oder?

KingTobi
25.10.2009, 18:49
Naja... Sagen wir einfach viele Wege führen nach Rom ;)

Osser
26.10.2009, 09:18
Hi,

Du kannst auch Gettime(..) verwenden


.
.
int main(void) {
uint16_t timeInMS;
uint16_t timeDelta;

Init();
timeInMS = Gettime();
while (1) {
timeDelta = Gettime() - timeInMS;
// Wird alle 1000ms==1sec ausgeführt
if (timeDelta >= 1000) {
timeInMS = Gettime();
// hier dein code
}

}
.
.
}




Gruss,

O.

radbruch
26.10.2009, 11:32
Gettime() ist nicht bei der orginalen CD-Lib dabei, das kam erst mit Msleep() und dem 36kHz-Timer, Wenn ich mich nicht irre...

Osser
26.10.2009, 14:44
Hi radbruch,

hab das nochmal nachgeschaut was Du sagst.

[glow=red:2c88b5904f]Du hast Recht![/glow:2c88b5904f] :-b

Der Timer selbst war aber schon enthalten.
Das geht dann also wohl nicht ohne eine neue LIB.


Gruss,

Olli

ASURO1995
29.10.2009, 12:19
Hallo...

also welche AsuroLib bräuchte ich für diesen timer???

radbruch
29.10.2009, 12:52
Hallo

Wie immer empfehle ich die Version 2.3 (http://downloads.sourceforge.net/project/asuro/AsuroLib/asuro%20lib%20V2.3/asurolib_v23.zip?use_mirror=surfnet) der erweiterten asuro-Library:

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=462281#462281

btw: Gibt es eigentlich jemanden der die schon in dieser Version zusätzlich enthaltenen Encoder- und Tasterfunktionen nutzt?

Gruß

mic