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);
MOD: PRE-Tags eingefügt