PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RC5 Code (Philips) mit Picaxe 08M generieren



mirco13
29.12.2005, 17:47
Vielleicht etwas verwirrend, daher editiert siehe Ende des Textes.Hallo
Hoffe hier kann mir jemand weiterhelfen. Möchte mit einem Picaxe ein Philips Gerät ansteuern. Hierzu kann ich leider nicht den Unterstützten Sony Code nutzen, sondern muss den RC5 Code anwenden.

Bei dem RC 5 Code wird ein "1" Bit übertragen als abwechselnd 32 Impulse a 6,9444us und 32 pausen a 20,8332us (entspricht 36KHz).

Bei einer normalen Fernbedienung für Philips Geräte wird dies Taktung von einem 36KHz Generator übernommen, und dieser wird zum Erzeugen der benötigten Bits ein und ausgeschaltet.

Ich würde nun gern mit dem PWM Ausgang diese Taktung erzeugen. Für ein "1" Bit müßte ich dann den PWM Ausgang für 889uS aus, dann für 889uS einschalten. Für ein "0" Bit andersrum (erst ein, dann aus).

In dieser Weise würde ich dann meine gewünschten 14 Bit (für meinen Befehl zusammengestellt) per Ansteuerung einer IR Led über den PWM Port senden.

Sollte ja normalerweise möglich sein. Der Picaxe soll vorerst auch nur für diese eine Aufgabe genutzt werden.

Wie programmiere ich nun den PWM Ausgang auf meinen "Wunsch"? Komme damit noch nicht so ganz klar und währe für Hilfe sehr dankbar!
Den Rest bekomme ich wahrscheinlich Problemlos hin.

Edit:
[glow=red:77a3133240]Einfacher gesagt:[/glow:77a3133240]
Ich brauche Hilfe bei der Erstellung eines "PWM Programms" mit folgenden Parametern: Impuls (6,9444µS) dann Pause (20,8332µS) dann Impuls (6,9444µS) dann Pause (20,8332µS)...
Um meine gewünschten "Bits" dann zu übertragen würde ich diese PWM Signal dann entsprechend ein bzw abschalten um meine IR LED anzusteuern.
Vielen Dank für Eure Bemühungen
Mirco

Posti
29.12.2005, 19:19
Hi

Der PWM-Befehl dürfte für Dein Problem nicht geeignet sein.
Er dauert pro Zyklus 5ms und gibt dabei ein High und ein Low-Pegel raus, der durch die duty-Zahl angegeben wird.
(0 nur low, 127 halb an und halb aus, 255 nur high *denk*)
Damit zu Deinen Zeiten zu gelangen dürfte zwar machbar sein, aber wohl eher umständlich.

Für Dein Problem dürfte der Befehl PULSOUT besser geeignet sein.
Syntax:
PULSOUT pin,time
- Pin ist eine Variable im Bereich von 0 bis 7, welche den i/o Pin spezifiziert
- time ist eine Variable für die Anzahl an High-Perioden (0-65535), bei 4MHz in 10µs Happen

Pin beim PICAXE08M 0,1,2,4 (Pins, die Ausgänge sein können).
Im Beispiel für Pulsout ist folgende Zeile zu sehen:
pulsout 4,150 '1.50ms puls raus an Pin 4
Dabei wird der Pin 4 für 1.5ms auf high gehalten. (bei 4MHz)

Im Anschluß kannst Du eine Pause machen:
pause 5 'Pause von 5ms (Kommawerte sind hier nicht möglich)
ODER
Indem wir auf einem anderem Pin ein Pulsout senden.

Für Dein Beispiel könnte folgendes klappen:
pulsout 4,89 '0.89ms -> 890µs | High an Ausgang 4
pulsout 2,89 '0.89ms -> 890µs | Low an Ausgang 4 (weil wir gerade an 2 arbeiten)

Da PULSOUT den Programmablauf für die Dauer des Puls unterbricht, müsste das schon für Dich brauchbar sein.

Wenn Dir die 10µs Stufung nicht ausreicht, kannst Du durch Umstellen auf 8MHz Takt diese Stufung auf 5µs reduzieren, wenn z.B. Fernbedienungsbefehle teilweise verstümmelt ankommen.

4MHz 10us 'Happen'
8MHz 5us 'Happen'
16MHz 2.5us 'Happen' (vom PICAXE08M nicht unterstützt)

setfreq m4 'auf 4MHz
setfreq m8 'auf 8MHz

Zu Achten ist bei der Nutzung von DEGUG, daß im DEBUG-Fenster die Frequenz mit dem im Programm übereinstimmen muß, da sonst das Debug-Fenster die Werte des PIC nicht auslesen kann.

MfG
Posti

EDIT:
Was ich gerade sehe:
(6,9444µS) dann Pause (20,8332µS)
Da wir, bei 8MHz eine Stufung von 5µs haben, könnte es sein, daß diese Funktionen Dich doch nicht zum Erfolg führen.
Da müsste man vll doch mit PWM arbeiten (PWM unterbricht das Programm ebenfalls während des Sendens).

PWM pin,duty,cycles
- Pin is a variable/constant (0-7) which specifies the i/o pin to use.
- Duty is a variable/constant (0-255) which specifies analog level.
- Cycles is a variable/constant (0-255) which specifies number of cycles. Each
cycle takes about 5ms.

PWM 2,255,1
sollte den Pin2 für 5ms auf high halten.
So müsste man auf eine Auflösung von 5ms / 255=19,6µs kommen, was aber für Deine Anforderungen ebenfalls zu langsam ist.
Sollte der PWM-Befehl auch Frequenz-abhängig sein, könnte hier vll auf 10µs (19,6/2) gekommen werden, was Dir aber auch nicht weiterhelfen dürfte.

Sorry, bin mit meinem Latein am Ende :-/

MfG
Posti

mirco13
01.01.2006, 15:33
Hallo.
Danke für deine Hinweise.

Leider bin ich auch noch nicht wirklich weiter, da meine Puls / Pausen-verhältnisse (von 6,9444µs Puls + 20,8333µs pause.....) anscheinend einfach zu schnell für den Picaxe sind.
Hatte Ursprünglich angenommen, es sei sehr einfach. Wollte einfach Port einschalten, nach gewünschter zeit auf 0 und dann eben wieder einschalten... leider sind die kürzesten verfügbaren Pausen ja im ms Bereich, was mir nichts bringt:-(

Aber irgendwie muß es ja gehen, denn der im Picaxe integrierte "IR Sony Code" wird ja auch mit 38KHz ausgesendet. Beim RC5 Code benötige ich als Grundtakt 36KHZ.
Mal schauen. Vielleicht findet sich ja noch eine Lösung. Sonst versuche ich einen externen Oszillator mit 36KHz aufzubauen, den ich einfach vom Picaxe aus ansteuer um meine Bits zu übertragen. Wir in normalen Fernbedienungen ja ähnlich gemacht.

Hatte nur gehofft es ohne große externe Beschaltung hinzubekommen!

Grüße Mirco

zardoz
05.01.2006, 02:08
Moin Mirco,

habe zufällig in den letzten Tagen etwas sehr ähnliches realisiert ... ;-)

Zu den Zeiten: Die Periodendauer beim PICAXE08M ist in Schritten von 1us einstellbar, die On-Time in Schritten von 0,25us. Die Parameter für das von Dir gewünschte Verhältnis wären also period=27 (gewünschter Wert - 1!) und duty=28.

Was nicht exakt hinzubekommen ist, ist die gewünschte Sendedauer von jeweils 889us. Allerdings bezweifle ich, daß diese Genauigkeit bei einer IR-Fernsteuerung wirklich erforderlich ist. Ich würde es einfach mal versuchen - die 889us entsprechen zufällig (grob) der Dauer eines Basic-Befehls. Also den PWM mit PWMOUT 2, 27, 28 und PWMOUT 2,0,0 sequentiell ein- und ausschalten ergibt eine "1", andere Reihenfolge eine "0".

Sollte eigentlich funktionieren ...

Nice week,
Zardoz

mirco13
05.01.2006, 05:25
Hallo.
Wofür brauchtest du denn diese kurzen Signale?

Habe da noch ein paar kurze Fragenn zum Verständnbiss, um deine Idee nicht ohne es zu verstehen zu übernehmen.

das von Dir gewünschte Verhältnis wären also period=27 (gewünschter Wert - 1! wiso??) und duty=28.

Verstehe ich das richtig entspricht
Periode 27 (=27*0,25uS ON entsprechen 6,75µS??)
duty 28(=28*1µS = 28µS pause??)

Wenn duty = Pause zwischen den Pulsen ist müßte ich ja aber duty21 nehmen, da ich ja eine Pause von 20,8333µS zwischen den Pulsen haben muss?!

Dann noch eine kurze Frage. Was bedeutet die 2 direkt hinter dem PWMOUT? PWMOUT 2,0,0 würde doch ein "PWM" ohne Pulse bedeuten. Nur als Befehl genutzt, um eben die 889µS zu haben und um den vorherigen PWM Befehl zu deaktivieren (oder wird er durch den naechsten Basic Befehl eh schon "überschrieben")?

Hoffe die Fragen nerfen nicht. Vielen Dank im Vorraus für deine Bemühungen!

Grüße Mirco

P.S.: Eine IR Fernbedienung habe ich nun bereits fertig unter www.mircosideen.de.vu

zardoz
05.01.2006, 13:09
Moin,

brauchte die kurzen Pulse ebenfalls für eine IR-Übertragung ... und zwar zwischen sogenannten "Battle Units" für RC-Panzermodelle. Hier sind zwei Prototypen auf einem Steckbrett aufgebaut:

http://www.rentarasta.de/project/versuch-20.jpg

Zu Deinen (nicht nervigen) Fragen:

Der PICAXE-Basic-Befehl lautete PWMOUT <pin>,<period>,<duty> und wird häufiger eingesetzt als der einfache PWM-Befehl, da er wesentlich flexibler ist. <pin> ist der gewünschte Ausgang (beim 08M geht hier nur 2), <period> ist die Zeit zwischen zwei aufeinanderfolgenden positiven Flanken (sprich Periodendauer) und <duty> die Zeit von der positiven bis zur folgenden negativen Flanke (also die Einschaltzeit oder on-time). Daß der Wert für <period> immer um 1 kleiner eingegeben werden muß steht halt in der Beschreibung.

Die Rechnung sieht dann also so aus:

<period> = 27 -> (27 + 1) x 1µs = 28µs -> 35,714kHz
<duty> = 28 -> 28 x 0,25µs = 7µs

Du bekommst also (bei 4MHz Taktfrequenz) einen Puls von 7µs und eine Pause von 21µs.

BTW: Dank Deiner Frage habe ich jetzt endlich das "µ"-Zeichen auf meiner neuen Tastatur entdeckt ... O:)

Nice week,
Zardoz

mirco13
05.01.2006, 17:12
Erstmal vielen Dank für die Erklärung von dir. Hat mich nun um einiges Schlauer gemacht und hilft sicher auch bei weiteren Projekten.

Also die 36KHz sind nun schonmal so wie ich sie haben wollte. sieht auch am Oszilloskop gut aus.

Habe nur noch nicht ganz verstanden, wie du folgendes meinst:
die 889us entsprechen zufällig (grob) der Dauer eines Basic-Befehls. Also den PWM mit PWMOUT 2, 27, 28 und PWMOUT 2,0,0 sequentiell ein- und ausschalten ergibt eine "1", andere Reihenfolge eine "0".
Hatte nun gedacht, ich schalte den PWM auf 36kHz und dann auf 0. daraus sollten sich dann jeweils ca889µS (36KHZ) Signal und anschliessend ca889µS Pause ergeben.
Leider kann ich am Oszilloscop keine Pausé erkennen, sondern habe durchgehend ein 36KHz Signal an meiner IR SendeLED.

Hier mal ein Ausschnitt aus dem Prog.":
Komandobits für Standby (Dezimal 12) binär = 001100
PWMOUT 2,0,0 `1. 0Bit
PWMOUT 2, 27, 28

PWMOUT 2,0,0 `2. 0Bit (erst 889µS ohne Pulse, Dann 889µS mit
PWMOUT 2, 27, 28 `36KHz)


PWMOUT 2, 27, 28 `1bit
PWMOUT 2,0,0

PWMOUT 2, 27, 28 `1bit
PWMOUT 2,0,0

PWMOUT 2,0,0 `1. 0Bit
PWMOUT 2, 27, 28

PWMOUT 2,0,0 `2. 0Bit
PWMOUT 2, 27, 28

Kannst du mir sagen wo mein Gedankenfehler liegt?

Nette Grüße und Danke für deine Hilfe Mirco

zardoz
05.01.2006, 19:45
Hi Mirco,

kein Problem ... O:)

Habe den Code bei mir mal in einer Schleife laufen lassen und gesehen, daß er funktioniert - mit Pausen!

Allerdings hat mein Billig-Oszilloskop immer Probleme mit dem Triggern, so daß die Pausen schlecht zu sehen sind. Aber sie sind da ... und die Zeiten passen auch fast.

Nice week,
Zardoz

mirco13
05.01.2006, 20:34
Hm. das verstehe ich nicht. Selbst wenn ich nur den Teil den ich hier gepostet habe als loop laufen lasse, habe ich zwar meine saubere PWM Ausgabe (Auch High low Verhältnis von 7 zu 21µS stimmt sauber), aber ich habe keinerlei Pausen.
Durchgehend liegt dann ab dem Start das PWM Signal am Ausgang an. Keine Pause..... .
Verstehe nicht wo da der Fehler liegen kann, wenn`s bei dir ja funktioniert. Hast du es auch auf einem Picaxe 08M getestet, oder auf einem der Größeren? Vielleicht da ein Unterschied (obwohl es ja auch für den 08M im Datenblatt steht.)

Hm bin mit meinem latein am Ende. Habe einfach mal Pausen eingefügt wie

PWMOUT 2, 27, 28
pause 1000
PWMOUT 2,0,0
Pause 1000


Dann habe ich 1sec das PWM Signal, dann 1sec o am ausgang... .
Es kommt mir langsam so vor, als ob der Befehl PWMOUT 2,0,0 bei mir
keine Auswirkungen zeigt ....

Na ja mal sehen. Irgendwie bekomme ich das schon noch hin hoffe ich.
Bei der Fehlersuche lernt man ja immer am meisten.
Melde mich wenn ich was finde .


Grüße Mirco

zardoz
05.01.2006, 21:36
Hi Mirco,

funktioniert doch alles:

> PWMOUT 2, 27, 28
> pause 1000

Ergibt 1 s Signal ...

> PWMOUT 2,0,0
> Pause 1000

... und anschließend 1 s Null am Ausgang.

> Dann habe ich 1sec das PWM Signal, dann 1sec o am ausgang... .

Genau. Und was stimmt daran nicht?

O:)

Nice week,
Zardoz

Posti
05.01.2006, 21:48
Hi

Das PWMOUT ist der Hardwar-PWM
Bei dem stellst Du 'nur' das Verhältnis ein!
Dieses Verhältnis wird 'auf Ewig' gehalten.

Beim PWM-Befehl gibst Du die Zeit an, die der PWM laufen soll (Das Proggy bleibt für die Zeit beim PWM-Befehl stehen).

Wenn Du PWM in dem kleinen Beispiel nutzt, wirst Du für die eingestellte Zeit dein PWM-Signal sehen, dann eine Sekunde Pause mit LOW, dann das andere PWM-Signal, und wieder die Sekunde mit LOW.

Beim PWOUT läuft das Programm weiter (eben die Pause), und hält das Signal.

Die Nutzung von PWM und PWMOUT ist verschieden!!

Schau mal bei HILFE unter Syntax-Schnellhilfe.
Dort sind die Befehle mit den Bedeutungen der Werte (leider nur auf englisch) erklärt.

MfG
Posti

mirco13
06.01.2006, 05:06
Morgen "zardoz".
Wenn ich die Pausen Bsp.: 1000 manuell einfüge funktioniert es auch mit der Pause (889 = 889µS 0Phase) .

Zitat:Ich würde es einfach mal versuchen - die 889us entsprechen zufällig (grob) der Dauer eines Basic-Befehls. Also den PWM mit PWMOUT 2, 27, 28 und PWMOUT 2,0,0 sequentiell ein- und ausschalten ergibt eine "1", andere Reihenfolge eine "0".

Hatte daraus geschlußfolgert, das ich einfach nur
PWMOUT 2, 27, 28
PWMOUT 2,0,0
eingeben müßte um eine "1" zu erhalten. Der erste Befehl schaltet die 36kHz ein, der Befehl dauert ca 889µS , mit dem 2. Befehl wird der PWM auf 0 umgestellt (daher Pause).... .

Werde es nun heute Abend nochmal ändern und dann testen.
Gestern habe ich mir leider noch einen PICAXE gehimmelt (Man sollte die Versorgungsspannung abschalten bevor man mit dem Ossi rumhantiert :-()

Halte dich auf dem Laufenden.
Bis dann Mirco

mirco13
06.01.2006, 05:17
Hallo "posti".

In dem manuell habe ich schon eine ganze Menge rumgelesen (sofern ich es verstanden habe). Wurde daraus aber erst wirklich schlau, als "zardoz" mir die Beispiele gepostet hatte.

Das PWMOUT ist der Hardwar-PWM
Bei dem stellst Du 'nur' das Verhältnis ein!
Dieses Verhältnis wird 'auf Ewig' gehalten.

Deshalb habe ich ja immer im Wechsel
PWMOUT 2, 27, 28 (36kHz)
PWMOUT 2,0,0 (PWM ohne Pulse siehe manuell zum abschalten)
im Programm eingefügt. Leider blieb der PWMOUT 2,0,0 Befehl aber anscheinend ohne Funktion, da ich keine Low Phasen erkennen kann (ausser natürlich direkt im 36kHz Signal).

Kann ich den PWMOUT auch irgendwie vordefinieren ohne gleich den Ausgang zu schalten, und dann uber PWM eben meine ein / auszeit definieren?

Posti
06.01.2006, 15:29
Hi

Das geht glaube nicht, zumindest hätte ich davon beim PICAXE08M noch nix gelesen.

PWMOUT pin (2),period (0-255),duty cycles(0-1023)

Frequenz=1/((period+1)*4*resonator_speed)
ON-Time=(period + 1) x 4 x resonator speed
Gesamtlaufzeit EINER Periode= (duty) x resonator speed
(resonator speed for 4MHz = 1/4000000)

// Wobei die Frequenz eigendlich über 1/Gesamtlaufzeit zu berechnen wäre :-/
// Dann müsste Frequenz=1/(duty*resonator_speed) sein.

Bei period=255 ergibt sich eine ON-Zeit von 1024xresonator_speed, bei einer Gesamt-Länge der Periode von 1023xresonator_speed.

Wenn ich jetzt logisch Nachdenke, ist der Pin länger auf HIGH(1024), als die Periode(1023) eigendlich dauert ??
Denke, daß in der duty-Formel (duty+1) stehen müsste :-/
Dann würden die Zeiten zumindest 100%ig übereinstimmen.

Bei periode=0 ergibt sich eine ON-Zeit von 1xresonator_speed, bei einer Periodendauer von 1023xresonator_speed.
Also KEIN 100%iges LOW.

Das Hauptproblem sehe ich darin, daß der PWMOUT nicht nach einer Periode aufhört zu senden, sondern ggf. die nächste Periode (mit HIGH) begonnen hat, bevor Deine Pause zuende ist, und Du das LOW schicken willst.

Kann das mal einer mit dem Oszi nachprüfen, ob beim duty das +1 mit rein muß?
Bzw. ob die Frequenz mit duty, oder mit period zusammenhängt?
Für mich ergeben sich mit dem, was ich derzeit glaube zu wissen, nur noch Fragezeichen.
Vll hilft es aber auch, wenn man einfach in Englisch etwas besser war *duck*

Für Dein Problem wäre der PWM-Befehl besser, aber hier ist die Auflösung (wesendlich) schlechter.

PWM pin,duty,cycles
- Pin is a variable/constant (0-7) which specifies the i/o pin to use.
- Duty is a variable/constant (0-255) which specifies analog level.
- Cycles is a variable/constant (0-255) which specifies number of cycles.
Each cycle takes about 5ms.
Beim PWM-Befehl ist die Periodendauer 5ms, egal, welche Werte eingestellt wurden, da die Werte nur das AN/AUS-Verhältnis und die Anzahl der Perioden angibt.

Zumindest nach meinem Verständnis.

MfG
Posti

mirco13
06.01.2006, 15:50
Hallo.

Kann das mal einer mit dem Oszi nachprüfen, ob beim duty das +1 mit rein muß?
Bzw. ob die Frequenz mit duty, oder mit period zusammenhängt?
Für mich ergeben sich mit dem, was ich derzeit glaube zu wissen, nur noch Fragezeichen.
Vll hilft es aber auch, wenn man einfach in Englisch etwas besser war *duck Also bei PWMOUT verhält es sich folgendermaßen: (Zitat von zardoz und auch so im manuell beschrieben)

<pin> ist der gewünschte Ausgang (beim 08M geht hier nur 2), <period> ist die Zeit zwischen zwei aufeinanderfolgenden positiven Flanken (sprich Periodendauer) und <duty> die Zeit von der positiven bis zur folgenden negativen Flanke (also die Einschaltzeit oder on-time). Daß der Wert für <period> immer um 1 kleiner eingegeben werden muß steht halt in der Beschreibung.

Die Rechnung sieht dann also so aus:

<period> = 27 -> (27 + 1) x 1µs = 28µs -> 35,714kHz
<duty> = 28 -> 28 x 0,25µs = 7µs

Du bekommst also (bei 4MHz Taktfrequenz) einen Puls von 7µs und eine Pause von 21µs.

Das kommt auch bei mir zu 100% hin (mit Oszilloscop gemessen!). Frequenz stimmt mit der Berechnung überein!



Für Dein Problem wäre der PWM-Befehl besser, aber hier ist die Auflösung (wesendlich) schlechter.

Mit dem PWM Befehl kann ich leider nichtzs anfangen, da wie du schon erkannt hast ist die Auflösung ,mit 5mµS zu schlecht. Brauche ja on7µS und off 21µS (abwechselnd für knapp 889µS). Das kann ich damit nicht beeinflussen, da der cycle immer gleich ist