www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Kann Input Capture Flanke nicht umschalten


Autor: Das D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich bin hier kurz vorm Verzweifeln.
Da gibt es dieses PWM-Signal, dessen Pulsbreite ich mittels Input 
Capture messen will. Das ganze auf einer Atmega 1280-Möhre.

Mein Problem ist, dass ich zwar nen Interrupt bekomme, wenn ich auf 
steigende Flanke prüfe und wenn ich auf fallende Flanke prüfe, aber 
beides in Kombination klappt nicht. Wenn ich nach der steigenden Flanke 
auf fallende umschalte, kommt der zweite Interrupt nicht mehr!

Als Vorbereitung mach ich diesen hier:
  // rising edge mode
  TCCR5B |= (1 << ICES5);

  pulse_on = TRUE;

  // enable input capture interrupt
  TIMSK5 |= (1 << ICIE5);
  sei();

In der ISR dann das hier:
ISR(TIMER5_CAPT_vect) {
  uint8_t temp = SREG;
    
  if (pulse_on) {
    // switch to falling edge mode
    TCCR5B &= ~(1 << ICES5);

    // clear ICF5 by writing logical 1
    TIFR5 |= (1 < ICF5);
    
    pulse_on = FALSE;
  } else {
    write("x");
  }

  SREG = temp;
}


Da kommt dann nur noch der erste Interrupt und dann nix mehr. Das 
Umschalten der Flankenerkennung scheint fehlzuschlagen. Dabei nudel ich 
doch extra noch die 1 auf das ICF, so wie das Datenblatt es mir befiehlt 
;)
Hat jemand eine Idee?

Autor: Das D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.. oder hat jemand irgendein getestetes C- oder Assembler-Beispiel für 
die Flankenumschaltung?

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
habe ich jedoch für einen anderen Prozessor ATMEGA32
SIGNAL(SIG_INPUT_CAPTURE1)
{
    register uint16_t * ptr;

    /* interrupt latency 60-61 cy   (with reti but without call) */

    /* Interrupt flag is cleared automatically by call           */
    ptr = (uint16_t *) ICPInPoi; /* avoid warning from volatile  */
    *ptr++ = ICR1;               /* store ICP1-calue    */
    TCCR1B ^= (1 << ICES1);      /* switch to next edge */

    /* clear ICF1 flag after changing edge */
    TIFR = (1 << ICF1);

    /* switch to next buffer */
    if (ptr >= &ICP_RawVal[ICP_NUM_FIFO])
    {
       ptr = &ICP_RawVal[0];
    }
    ICPInPoi = ptr;
}

Autor: Das D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Cool, danke!
Nen schönen Abend wünsch ich!

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>TCCR5B &= ~(1 << ICES5);


Mach es am Ende der ISR so:
TCCR5B ^= (1 << ICES5);

Da muss man sich nicht mal "extern" merken, in welche Richtung die 
Flanke geschaltet ist.
Das Bit kann man auch abfragen, und darüber dann die Auswertung 
(innerhalb der ISR) machen.

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.