16Bit Compiler Frage
-
hehe, ja das DEMOBOARD von Mircochip mit nem PIC lag vor meinen augen.. hätte auch lieber nen Atmel Atmega gecoded... naja aber ich kann jetzt messen 1hz bis 30khz.. muss aber noch rumprobieren..
P.S.: Schau mal ins Assambler Forum da hab ich noch ne Aufgabe für dich;)
-
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?