PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RC-Kanal auslesen mit PULSEIN



Björn
03.04.2006, 13:29
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:



'================================================= ==============================
' 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
'===


Mache ich irgendetwas komplett falsch :D ??

Danke!

Gruß, Björn

Björn
03.04.2006, 15:37
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

Björn
03.04.2006, 17:58
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

Michael
03.04.2006, 23:43
Hallo Björn,


Pulsein Pulsbreite , Pind , 4 , 0 dieser Befehl wartet auf einen Low-Puls, Fernsteuerungen haben aber allgemein High-Pulse. Änder die Null in eine Eins um.
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.

Waitms 500 nur alle halbe Sekunde? Dein Impuls kommt doch schon nach 20 ms wieder?

Gruß, Michael

Björn
04.04.2006, 09:07
Hallo Michael,

vielen Danke für deine Anwort. Ich habe den Code mal entsprechend geändert. Jetzt sieht er so aus - richtig?



'================================================= ==============================
' 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
'===


Gruß, Björn

Björn
04.04.2006, 09:21
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

Michael
04.04.2006, 10:49
Hallo Björn,

Was ist mit der Schaltung? Bei der hab ich komplett ohne Widerstände o.ä. gearbeitet...der Ausgang vom Empfänger geht direkt in den Eingang des AVR, das paßt.
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:


Do

Bitwait Pind.4 , Set

Pulsein Pulsbreite , Pind , 4 , 1 'Pulsbreite auslesen

Cls ' LCD Ausgabe
Lcd "Puls: "
Lcd Pulsbreite


Loop


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

Gruß, Michael

Björn
04.04.2006, 11:09
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

Michael
04.04.2006, 12:43
Hallo Björn,


Dabei zeigt er bei der einen Richtung 80, bei der anderen 180 (etwa)ja, diese Werte sind ok.


Dann habe ich einen Timer genommen der alle Sekunde den Wert anzeigt. Beachte, daß die Pulsein-Funktion auch einen Timer benutzt. Wenn deine Sekunde denselben benutzt, kann es Probleme geben.


ändert sich die Zahl so schnell dass man nichts erkennen kanndu 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.
Gruß, Michael

Björn
04.04.2006, 12:52
Also:
Ich nehme die Timerfunktion raus und füge beim Auslesen etwas ein wie:

If Pulsbreite < 250 Then Ausgabewert = Pulsbreite
Oder wie war das gemeint?

Vielen Danke erstmal für deine Hilfe!! ;)

Gruß, Björn

Björn
04.04.2006, 13:04
Hey besten Danke es geht!

Jetzt muss ich nur noch hinbekommen ob man den Steuerknüppel lang (mind 2 Sek) oder kurz drückt.

Gruß, Björn

Michael
04.04.2006, 13:05
Hallo Björn,

Oder wie war das gemeint?


If Pulsbreite > Maximalwert Then
Maximalwert = Pulsbreite
End If

Statt das Display jedesmal zu löschen, schreibst du besser:



cls '(vor der Schleife)


do
.
.
.
locate 7,1
lcd Pulsvariable ; " "; Maximalvariable ; " "
loop

So sollte das Display nicht mehr flimmern.

Gruß, Michael