PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Softwartimer



Duderinowski
03.04.2005, 13:22
HI,

Wie mache ich eine Softwartimer der mir genau 10 sekunden liefert?

Ich meine
{
start timer
1 second
start function
10 seconds
end function
}

die Funktion muss innerhalb den 10 sekunden laufen,um werte einzusammeln

Thx für Eure Hilfe

Mobius
03.04.2005, 16:26
Brauchst du den Timer in a) blocking mode (d.h. der PIC friert für die Dauer dieser Zeit ein) oder b) in non-blocking-mode (aso über interrupts und einem Hardware-Timer)?

Bei a) nimmst du einfach eine verschachtelte For-Schleife die z.B.: 1000 mal NOP aufruft. Der bekanntliche Nachteil dieser Aktion ist, dass, so lange der PIC in diesen Schleifen gefangen ist (und 10s sind eine Ewigkeit, wenn die Dauer eines Befehls in Microsekunden berechnet wird).

Bei b) schaltest du z.B.: den Timer0 ein, setzt seinen Pre(Post)-Scale auf maximum und aktivierst den Interrupt. Bei 4MHz und 256 Prescale läuft dieser dann alle 25,3 ms über. Das ergibt bei einem 8Bit-Timer ~6,5s. Für die Formeln schau mal auf fernando-heitor.de (http://www.fernando-heitor.de/pic/ccs-compiler/beispiele/timer.htm
).

Es wäre einfacher, wenn du beschreiben könntest, wofür du es brauchst. Oder zumindest eine bessere Problembeschreibung liefern könntest.

MfG
Mobius

Duderinowski
04.04.2005, 19:40
mit Interrupts..

hab paar Code Schnippel ...aber ich weiss nicht welcher von ihnen richtig wäre


interrupt()
{

if (time_count != 0)
time_count--;

}



main()
{

some_function(10);

}



some_function(time_to_run)
{

time_count = time_to_run;

while (time_count != 0)
{
do stuff
}

}



oder




int1 Clock_Been_Initialized=0;

Int16 Miliseconds;
#locate Miliseconds = Registry_Map+6
Int16 Seconds;
#locate Seconds = Registry_Map+8
int1 Second_Tick=0;

// Global Real Time Clock Information
#int_TIMER2 // Clock interrupt adjusted to occurs ~ 1ms
void TIMER2_isr()
{ Miliseconds++;
if(Miliseconds>999)
{ Miliseconds=0;
Seconds++;
Second_Tick=1;
}
}
/************************************************** *********
* Service Hardware Modules *
************************************************** *********/
#inline
void Clock_Service(void)
{ if(!Clock_Been_Initialized)
{ setup_timer_2(T2_DIV_BY_4,249,1); // Set 1mS period
enable_interrupts(INT_TIMER2);
Seconds=0;
Clock_Been_Initialized=1;
}
if(Second_Tick)
{ Second_Tick=0;
Registry_Map[6]=Registry_Map[5];
Registry_Map[5]=0;
Registry_Map[2]=Registry_Map[1];
Registry_Map[1]=0;
}
Registry_Map[5]++;
}



Danke für deine Hilfe