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?
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))
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.