
Zitat von
Hans2
Hallo,d1ko,schade,dass du nicht mehr verrätst.Ich bin zwar gut im Elektronkbau,aber programmieren ist nicht meine stärke.Ich habe mir die aktuelle US-version runtergeladen,und in dem Prog,habe ich nur zeiten,drehrichtung,und geschwindigkeit geändert.Alles andere ist mir noch suspekt.Hatte gehofft,dass mir einer sagt,wo,und was ich ins dieses prog. einfügen muss.Gruss Hans aus bremen
Oh, ich dachte, ich hätte schon zuviel verraten und würde dir den Spaß verderben, wenn ich dir einfach den ganzen Code aufschreibe...
Also hier ein Lösungsvorschlag:
Im Interrupt wird wie oben erwähnt alles ausgerechnet:
D.h. du must in asuro.c folgendes ändern:
Code:
volatile unsigned char count72kHz = 0;
volatile unsigned int countmsec = 0;
volatile unsigned char countsec = 0;
volatile unsigned char countmin = 0;
volatile char flag = 0;
/* uses timer2 (36kHz for IR communication */
/* counts falling and rising edge => 36kHz*2 = 72kHz */
SIGNAL (SIG_OUTPUT_COMPARE2)
{
count72kHz ++;
if (count72kHz == 72)
{
countmsec++
count72kHz = 0;
}
if (countmsec == 1000)
{
countsec++;
countmsec = 0;
}
if (countsec == 60)
{
countmin++;
countsec = 0;
}
if (countmin == 10)
{
flag = 1;
}
}
Dadurch 10 Minuten nach dem Einschalten der Flag gesetzt.
(Man könnte auch Speicherplatz sparen und nur mit countsec die gewünschte Zeit in Sekunden angeben, aber ich hab es zur Demonstration einfach mal auch mit Minutenzähler gemacht.)
Du wolltest ja, dass er nach 10 Minuten nichts mehr macht. Dazu musst du im Hauptprogramm einfach den Flag in eine if-Schleife einbauen, in der eine Endlosschleife eingebaut ist.^^
Sieht dann so aus:
Code:
if (flag ==1)
{
// Motor etc. abschalten
while(1);
}
Das muss dann an irgendeiner Stelle in der Endlosschleife deines Programms eingebaut werden. (Es soll also ständig abgefragt werden.)
Mit dem Programm macht der ASURO also nach 10min nichts mehr.
Damit er die Zeit nach dem Einschalten weiter hochzählen kann, muss man den countmin-Wert vor dem Abschalten im EEPROM abspeichern und nach dem Einschalten auslesen und weiter hochzählen lassen.
Wie das mit dem EEPROM geht, weiß ich leider auch nicht genau.
Hoffe, ich konnte dir trotzdem helfen.
MFG D1K0
EDIT:
Sorry, ich hab vergessen die Millisekunden im Interrupt hochzuzählen (72 * 1000 Takte pro Sekunde).
.
Hab' das jetzt geändert. Ach ja, das Programm habe ich nicht getestet, ich weiß deshalb nicht, ob irgendwo ein Fehler drinsteckt oder nicht.
Lesezeichen