Empfänger Impulse - Hilfe

Gast #179203
Hallo,

ich möchte gern die Empfängerimpulse meiner Futaba Anlage auswerten.
Signalleitung auf INT0.

Ich starte bei steigender Flanke einen Timer.
Setze die Flanke auf fallend.
Bei fallender Flanke möchte ich den Timer stoppen,
den Wert auslesen, und dann wieder fallende Flanke.

Im AVR Studio klappt die hälfte mit der steigende Flanke.
Aber wenn ich wieder PortPin2 auf low setze, dann passiert irgend ein
Mist.

Der Timer wird geresetet, das ISC00 Bit wird kurz gesetzt, dann
aber sofort wieder gelöscht.
Dann läuft der Timer wieder weiter.

Also bin ich irgendwie nur sehr kurz in der 2. INT0 Schleife.

Ich vermute, das ich anscheinend falsch auf das MCUCR teste.
Oder ich setze das MCUCR falsch.

Vielleicht kann sich jemand den code mal ansehen?!

Gruß Toby

Kann mir da vielleicht mal wer weiterhelfen?
Angehängte Dateien:
Gast
Hallo, nochmal,

ich hatte auch schon diese Variante, aber dachte, ich wäre zu lang in
der Interrupt Routine.

SIGNAL(SIG_INTERRUPT0)
{
  if( MCUCR = 0x03) // Testen auf steigende Flanke
  {
  TCNT2 = 0; // Timer Reset
  TCCR2 = _BV (CS21) | _BV (CS20); // Timer2 1/64 MCU start
  MCUCR = 0x02; //_BV (ISC01); // INT0 fallende Flanke
  return;
  }

  if( MCUCR =0x02 ) // Testen auf fallende Flanke
  {
  TCCR2 = 0x00; // Timer2 Stoppen
  Pulsdauer = TCNT2; // Timer Wert = Pulsdauer
  MCUCR = 0x03; //_BV (ISC01) | _BV (ISC00); // INT0 auf steigende
Flanke
  return;
  }
}

Ich schätze, es liegt an dem testen.

Wie kann ich denn wohl auf einzelne Bits testen?

Aus einem anderem Beitrag :
""
Bitmanipulationen schreibt man in C so:

#define mybit0 1 // Bitnummer (0)
#define mybit1 1 // Bitnummer (1)
#define mybit "2...7"  1 // Bitnummer (2...7)

char myvar;

myvar |= 1 << mybit0; // Setzen

myvar &= ~(1 << mybit0); // Löschen

myvar ^= 1 << mybit0; // Invertieren

if( myvar & (1 << mybit0)) // Testen
""

Kann ich auch testen, ob das Bit nicht gesetzt ist?

So ????
if( myvar & ~(1 << mybit0))

Und wie teste ich, ob zwei Bits gesetzt sind?

So ????
if( myvar & (1 << mybit1) && (1 << mybit0))
Gast
Hi,

diese beiden Anweisungen sind nicht richtig.

 if( MCUCR = 0x03) // Testen auf steigende Flanke
 if( MCUCR =0x02 ) // Testen auf fallende Flanke

Du weisst MCUCR den Wert = 0x03 und spaeter 0x02 zu. Eine
Gleichheitsabfrage macht man so z.B.
if( MCUCR == 0x03) // Testen auf steigende Flanke

Mfg

Dirk

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.