mikrocontroller.net

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


Autor: Dieter Stotz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.