www.mikrocontroller.net

Forum: Compiler & IDEs Empfänger Impulse - Hilfe


Autor: Tobias Tetzlaff (Gast)
Datum:
Angehängte Dateien:

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

Autor: Tobias Tetzlaff (Gast)
Datum:

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

Autor: Dirk (Gast)
Datum:

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

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.