Forum: Mikrocontroller und Digitale Elektronik PIC12F683 mit zwei Interrupts in C


von Dieter Stotz (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.