P
rechteck-freak schrieb:
wieso das? von einer flanke bis zur nächsten mit der selben steigung ist's genau eine ganze periode.
Ja, und diese zweite Flanke ist ja schon der Beginn der nächsten Messung. Sauber kriegst Du damit nur jede zweite Periode. Weil wir schon so lange keine Zeile C mehr hatten, hab' ich mal ein Softgate für den M16C zusammengetippelt (not debugged), damit klar ist, wie so eine Messung ablaufen könnte:
static unsigned long int cycles = 0; // our result
static unsigned char reminder = 0;
void TimerInit(void)
{
tb0mr = 0x40; // Timer Mode %0100 0000 normal Timer
tb0= 65535; // full range
tb0ic = 0x05; // Timer Underflow Interrupt enable
int0ic = 0x06; // int0pin = Gate falling edge
}
#pragma INTERRUPT Gate // Vector int0
void Gate(void)
{
const unsigned long int compensation = 117; // Timer cycles of constant delay
if (tb0s) // Timer running ?
{
tb0s = 0; // Timer stop
cycles = compensation + (unsigned long int)(65535 - tb0) + ((unsigned long int) reminder) * 65536;
tb0 = 65535; // reset timer
reminder = 0; // reset underflow
}
else tb0s = 1; // start timer
}
#pragma INTERRUPT Underflow // Vector tb0
void Underflow(void)
{
reminder++;
}
Alles klar?
EDIT: Mir ist jetzt auch wieder eingefallen, was das Problem mit der Messung aller Perioden war, nicht die Genauigkeit beim Timer, sondern daß der Kiste zuwenig Verschnaufpause zum Herumrechnen bleibt, wenn's mal wirklich flott zugeht, da war mir die Gefahr zu groß, daß durch Interruptverlust die Ergebnisse verderben:
Aber probieren geht manchmal über Studieren . Müßte man nur so ändern
#pragma INTERRUPT Gate // Vector int0
void Gate(void)
{
static unsigned long int timer; // static => faster
static unsigned long int rem;
const unsigned long int compensation = 93; // Timer cycles of constant delay
tb0s = 0; // Timer stop
timer = tb0; // rescue the ...
rem = reminder; // datas!
tb0 = 65535; // reset timer
reminder = 0; // reset underflow
tb0s = 1; // restart timer
cycles = compensation + (unsigned long int)(65535 - timer) + rem * 65536;
}
Daß man sich den Underflow sparen könnte, wenn der Timer in 32 Bit läuft, muß ich nicht extra erwähnen, oder?