PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RC Empfänger auswerten



YaNnIk
06.01.2010, 19:44
Hi Leute..
Für eine Beleuchtungssteuerung vür ein RC-Modell muss ich die PWM-Kanäle des Empfängers auswerten.

Ich habe schon schon was zu dem Thema im Wissensbereich gefunden (Das hier (http://www.rn-wissen.de/index.php/RC-Empf%C3%A4nger_auswerten))

Leider verstehe ich das nicht so ganz... Und das mit dem Summensignal ist auch schlecht, da der Empfänger, den ich verwenden will, kein Summensignal bietet...

Gibt es auch einen einfacheren Code um EINEN RC-Kanal auszuwerten???


Wäre euch sehr dankbar, wenn ihr mir bei meinem Problem helfen könntet...


Mfg Yannik

radbruch
06.01.2010, 20:38
Hallo

Im Wiki wird die Verwendung eines externen Interrupts beschrieben. Es gibt auch noch andere Möglichkeiten das RC-Signal auszumessen. Welches Verfahren für dich am günstigsten ist, hängt wohl in erster Linie davon ab, was der von dir verwendete Kontroller sonst noch erledigen muss und welche Auflösung die Messung haben soll (und wie "kompliziert" die Lösung sein darf;).

Gruß

mic

YaNnIk
07.01.2010, 20:51
So, ich habe mir jetzt folgenden Code zusammengebastelt :


$regfile = "m16def.dat"
$crystal = 16000000
$hwstack = 32

Config Portd.2 = Input

Dim Lesen1 As Bit
Dim Empf_wert1 As Byte

Lesen1 = 0

Config Timer0 = Timer , Prescale = 256
Enable Timer0
Stop Timer0
On Timer0 Error

Config Int0 = Rising
On Int0 Messen1
Enable Interrupts
Enable Int0

Do
...
Loop

End

Messen1:

If Lesen1 = 0 Then
Start Timer0
Lesen1 = 1
Config Int0 = Falling
Else
Stop Timer0
Empf_wert1 = Timer0
Timer0 = 0
Lesen1 = 0
Config Int0 = Rising
End If

Return

Error:
...
Return


So, könnt ihr mir sagen ob das richtig ist??? Vorallem das mit dem Configurieren des Interrupts.. Erst wollte ich einen Atmega644 nehmen, der kann bei den Interrupts auch den Change Befehl verwenden, ich habe aber festgestellt, das für meinen Code auch ein Atmega16 reicht, aber der kann mit dem Change befehl nix anfangen.. Deshalb frag ich hier lieber mal nach, ob das so richtig ist ;-)

Danke im Vorraus :D


Mfg Yannik

wkrug
07.01.2010, 22:08
Ich bin nun kein BASCOM Crack, aber gibts da nicht den PULSEIN Befehl?

Wäre der dafür geeignet ?

Hier : http://www.rclineforum.de/forum/thread.php?threadid=106253&sid=f6e9cf5f32b3a3d51a16e8078012a18e

wird genau Dein Problem behandelt...

Sauerbruch
07.01.2010, 22:17
aber der kann mit dem Change befehl nix anfangen..

Wie kommst Du denn darauf?

Die Idee mit Change ist nämlich ziemlich gut, genau so habe ich schon in diversen Anwendungen gemessen, was aus einem Empfängerausang rauskommt. In der ISR wird kurz abgefragt ob der Eingang H oder L ist, und je nach dem entweder den Timer gestartet, oder seinen Wert übernommen und auf 0 gesetzt. Funktioniert bestens!

YaNnIk
08.01.2010, 13:56
aber der kann mit dem Change befehl nix anfangen..

Wie kommst Du denn darauf?


Das sagt Bascom mir, wenn ich Compilieren will..

Ich habgrade nochmal geguckt und bei Int0 und Int1 scheint er Change doch zu kennen...

Ich habe mal nur Int0 Und Int1 wieder auf change geändert und dann konnte ich ohne einen error compilieren..

Dann habe ich auch Int2 geändert und da steht dann

"Error : 347 Line : 72 External Interrupt Mode not supported or found in DAT file [change]"

Macht bascom da irgendeinen fehler oder kann Int2 das nicht???


Wäre den mein Code THEORETISCH richtig?? Mit Change gefällt mir das auch besser, aber das geht ja anscheinent nicht..

Sauerbruch
08.01.2010, 14:56
Im Datenblatt habe ich folgende Passage gefunden:

Interrupts
The External Interrupts are triggered by the INT0, INT1, and INT2 pins. Observe that, if enabled, the interrupts will trigger even if the INT0..2 pins are configured as outputs. This feature provides a way of generating a software interrupt. The external interrupts can be triggered by a falling or
rising edge or a low level (INT2 is only an edge triggered interrupt).

INT2 kann und muss man daher nicht konfigurieren. Mit den Zeilen

On Int2 XXX
Enable INT2
Enable Interrupts

müsste es gehen.

YaNnIk
08.01.2010, 14:59
Das habe ich noch nicht so ganz gecheckt, also kann Int2 nicht zwischen steigender und fallender Flanke unterscheiden und wird daher automatisch bei jeder veränderung anspringen???

Sauerbruch
08.01.2010, 15:05
Riiich - tiiich :-)

Ich hatte zwar noch nie so was großes wie einen Mega16 auf´m Board, aber bei (fast) allen µCs gibt´s was vergleichbares, nämlich die PinChange-Interrupts. Bei denen erklärt sich das Ganze natürlich schon über den Namen "PinChange"-Interrupt. Die kann man daher natürlich auch nicht auf steigende oder fallende Flanken konfigurieren, sondern sie werden bei jedem Flankenwechsel angesprungen, wenn sie aktiviert sind.

Das wird beim INT2 beim Mega16 genau so sein!

wkrug
08.01.2010, 23:09
...man kann natürlich auch innerhalb des Interrupts das Sensing von steigender Flanke auf fallende Flanke umstellen und das zu ändernde Bit auch gleich als Flag für die Auswertung im nächsten Interrupt verwenden.

Ich persönlich bin von diesen Pin Change Interupts nicht so begeistert, weil die bei viele Controllern in Gruppen zusammengefasst sind und man dann per Software rausfinden muß, welcher Eingang denn nun den Interrupt hervorgerufen hat.
Aber das ist natürlich ein Frage der persönlichen Vorlieben.