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.