Oh da fällt mir noch was ein.
Ist es überhaupt möglich den Empfänger an einen beliebigen Pin des AVRs anzuschließen oder muss dies an einem bestimmten getan werden?
Gruß, Björn
Hallo!
Ich möchte die Pulsbreite eines RC-Empfänger-Kanals auslesen, um später LEDs zu schalten. Hierbei wollte ich als Vorstufe einfach mal die Pulsbreite auslesen... Jedoch zeigt der Controller blind streuende Werte. Mein Code sieht so aus:
Mache ich irgendetwas komplett falsch ??Code:'=============================================================================== ' Compiler '=============================================================================== $regfile = "m32def.dat" 'Mega32 $crystal = 8000000 '8Mhz Quarz (intern) $baud = 9600 '------------------------------------------------------------------------------- '=============================================================================== ' Ein- und Ausgänge '=============================================================================== Config Pind.4 = Input 'Empfängersignal '------------------------------------------------------------------------------- '=============================================================================== ' Variablen '=============================================================================== Dim Pulsbreite As Byte '------------------------------------------------------------------------------- '=============================================================================== ' LCD Parametrieren '------------------------------------------------------------------------------- Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.3 , Db6 = Porta.2 , _ Db7 = Porta.1 , E = Porta.5 , Rs = Porta.6 Config Lcd = 16 * 2 Cls Cursor Off Noblink '******************************************************************************* '* HAUPTPROGRAMM * '******************************************************************************* Do Wait 2 Anfang: Pulsein Pulsbreite , Pind , 4 , 0 'Pulsbreite auslesen '-- Pulsanzeigen --------------------------------------------------------- Cls Lcd "Puls: " Lcd Pulsbreite '------------------------------------------------------------------------- Waitms 500 Goto Anfang Loop '------------------------------------------------------------------------------- '=== End '===
Danke!
Gruß, Björn
Nur tote Fische schwimmen mit dem Strom...
Oh da fällt mir noch was ein.
Ist es überhaupt möglich den Empfänger an einen beliebigen Pin des AVRs anzuschließen oder muss dies an einem bestimmten getan werden?
Gruß, Björn
Nur tote Fische schwimmen mit dem Strom...
Eine andere Mögliche Ursache könnte natürlich die Schaltung sein - ich habe das Empfängersignal direkt an den AVR gelegt, also:
Empfänger --------------------------- AVR-Pin
Naja vielleicht kann ja jemand was zum Code bzw. der Schaltung sagen, das wäre sehr nett
Gruß, Björn
Nur tote Fische schwimmen mit dem Strom...
Hallo Björn,
dieser Befehl wartet auf einen Low-Puls, Fernsteuerungen haben aber allgemein High-Pulse. Änder die Null in eine Eins um.Pulsein Pulsbreite , Pind , 4 , 0
Die Hilfe von Bascom schlägt für die Variable ein Word vor, ein Byte reicht aber normal, weil die Pulslänge nicht viel über den Wert 200 kommt.
nur alle halbe Sekunde? Dein Impuls kommt doch schon nach 20 ms wieder?Waitms 500
Gruß, Michael
Hallo Michael,
vielen Danke für deine Anwort. Ich habe den Code mal entsprechend geändert. Jetzt sieht er so aus - richtig?
Gruß, BjörnCode:'=============================================================================== ' Compiler '=============================================================================== $regfile = "m32def.dat" 'Mega32 $crystal = 1000000 '1Mhz Quarz '------------------------------------------------------------------------------- '=============================================================================== ' Ein- und Ausgänge '=============================================================================== Config Pind.4 = Input 'Empfängersignal '------------------------------------------------------------------------------- '=============================================================================== ' Variablen '=============================================================================== Dim Pulsbreite As Word '------------------------------------------------------------------------------- '=============================================================================== ' LCD Parametrieren '=============================================================================== Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.3 , Db6 = Porta.2 , _ Db7 = Porta.1 , E = Porta.5 , Rs = Porta.6 Config Lcd = 16 * 2 Cls Cursor Off Noblink '------------------------------------------------------------------------------- '******************************************************************************* '* HAUPTPROGRAMM * '******************************************************************************* Do Pulsein Pulsbreite , Pind , 4 , 1 'Pulsbreite auslesen Cls ' LCD Ausgabe Lcd "Puls: " Lcd Pulsbreite Waitms 20 'Aktualisierungsintervall Loop '------------------------------------------------------------------------------- '=== End '===
Nur tote Fische schwimmen mit dem Strom...
Hallo nochmal,
obiger Code funktioniert leider auch nicht - die Pulsbreite liegt bei 600(!).
Was ist mit der Schaltung? Bei der hab ich komplett ohne Widerstände o.ä. gearbeitet...
Gruß, Björn
Nur tote Fische schwimmen mit dem Strom...
Hallo Björn,
der Ausgang vom Empfänger geht direkt in den Eingang des AVR, das paßt.Was ist mit der Schaltung? Bei der hab ich komplett ohne Widerstände o.ä. gearbeitet...
Versuch doch bitte mal den Code ohne Waitms 20. Das habe ich nie benutzt.Möglicherweise gibt es Überschneidungen mit dem nächsten Impuls.
Die Hilfe empfiehlt ein Bitwait vor dem Pulsein-Befehl, um den Puls ganz sicher zu erwischen. Leider bleibt das Programm dann hängen, wenn keine Impulse mehr kommen.
Das würde dann so aussehen:
Vielleicht ist es dir möglich, die Taktfrequenz zu erhöhen, ich könnte mir vorstellen, daß Bascom bei nur 1 MHz ins schwitzen kommt und dadurch Pulse verschnapptCode:Do Bitwait Pind.4 , Set Pulsein Pulsbreite , Pind , 4 , 1 'Pulsbreite auslesen Cls ' LCD Ausgabe Lcd "Puls: " Lcd Pulsbreite Loop
Gruß, Michael
Man kommt voran
Habe deinen Code probiert ohne Waitms 20. (Quarz 7,3728Mhz).
Dann habe ich einen Timer genommen der alle Sekunde den Wert anzeigt. Dabei zeigt er bei der einen Richtung 80, bei der anderen 180 (etwa) - ABER, dauernd kommen zwischendurch Werte über 1000 - da wüsste ich jetzt natürlich gerne wie die Zustande kommen. Den Timer hab ich genommen, weil ohne Timer ändert sich die Zahl so schnell dass man nichts erkennen kann (weil immer die richtige Pulsbreite und die 1000er Zahl wechselt).
Gruß, Björn
Nur tote Fische schwimmen mit dem Strom...
Hallo Björn,
ja, diese Werte sind ok.Dabei zeigt er bei der einen Richtung 80, bei der anderen 180 (etwa)
Beachte, daß die Pulsein-Funktion auch einen Timer benutzt. Wenn deine Sekunde denselben benutzt, kann es Probleme geben.Dann habe ich einen Timer genommen der alle Sekunde den Wert anzeigt.
du könntest eine weitere Variable einführen, die mit der Pulsvariable verglichen wird. Ist der Pulsein-Wert höher, wird er in der Zusatzvariable gespeichert und angezeigt. Mit so einer max-Funktion findest du schnell Ausreißer.ändert sich die Zahl so schnell dass man nichts erkennen kann
Gruß, Michael
Also:
Ich nehme die Timerfunktion raus und füge beim Auslesen etwas ein wie:
Oder wie war das gemeint?Code:If Pulsbreite < 250 Then Ausgabewert = Pulsbreite
Vielen Danke erstmal für deine Hilfe!!
Gruß, Björn
Nur tote Fische schwimmen mit dem Strom...
Lesezeichen