Hallo zusammen, zur Periodendauermessung habe ich beim 12F683 einen Pin für den Interrupt-on-Change (IOC) vorgesehen. Nebenher werden in einem anderen Interrupt Timer2-Überläufe registriert und gezählt. Dies läuft schon recht gut, und die Messung arbeitet. Um die Auflösung noch zu erhöhen, wäre es gut, einfach bei jedem IOC die Zählerstände von Timer2 abzufragen und jeweils vom letzten Wert übertragslos zu subtrahieren. Man erhält dann neben den oben genannten kummulierten Überläufen noch einen Wert, der 256 mal so klein ist. Damit hätte ich die Auflösung (theoretisch) auf 16 Bit gesteigert. Leider stellt sich heraus, dass jegliche Timer2-Abfrage im INT_EXT mit dem INT_TIMER2 gekoppelt bzw. mit dem Timer2-Overflow synchronisiert ist, denn ich erhalte stets einen konstanten Wert beim Lesen. Beide Interrupts sollten aber völlig asynchron arbeiten können, wenn ich diese Zeitauflösung steigern möchte -- und dann wären die Werte -- da asynchron gelesen -- ständig wechselnd. Hat jemand eine Ahnung, was ich da falsch mache, oder geht das einfach nicht besser? Ich habe mal den wichtigsten Code-Ausschnitt angefügt. Ich weiß, es müsste auch noch eine andere Möglichkeit geben, und zwar Timer1 über den Gate-Pin zu triggern. Gruß Dieter #int_ext void ext_isr() { if (input(PIN_A4) && INT_FLAG){ COUNTER_LO = get_timer2(); COUNTER_HI = 0; INT_FLAG = FALSE; } if (!input(PIN_A4) && !INT_FLAG){ INT_FLAG = TRUE; } } #int_timer2 void clock_isr(){ COUNTER_HI++; } main(){ //Ur-Initialisierung (nach dem Einschalten) setup_adc_ports(NO_ANALOGS); setup_ccp1(CCP_PWM); setup_timer_2(T2_DIV_BY_1, PWM_FACTOR, 1); enable_interrupts(INT_TIMER2); enable_interrupts(INT_EXT); enable_interrupts(GLOBAL);
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.