Forum: Compiler & IDEs Empfänger Impulse - Hilfe


von Tobias Tetzlaff (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Tobias Tetzlaff (Gast)


Lesenswert?

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))

von Dirk (Gast)


Lesenswert?

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

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.