#rem
Fesselflugsender
Hardware: PICAXE 08M2
Alle Pin Funktionen (C.0 nur Ausgang, C.2 pwmout, C.3 nur Eingang)
+---v---+
Vdd |1 8| Vss
RxD/I C.5 |2 7| C.0 O/TxD
Touch/ADC/O/I C.4 |3 6| C.1 I/O/ADC/Touch
I C.3 |4 5| C.2 I/O/ADC/Touch/PWM/TUNE
+-------+
Funktion:
Fesselflugsender mit 2 Gebern.
1. Geber fuer Motor = Poti
2. Geber fuer Fahrwerk = Schalter (oder Taster?)
3. Servoendstellungen fuer beide Geber variabel einstellbar
4. Servolaufrichtung fuer beide Geber umkehrbar
5. Servogeschwindigkeit fuer Schalter einstellbar
Der Modul erzeugt ein Servosummensignal, das jedem beliebiegen Standard
RC HF-Modul vorgesetzt werden kann. Als Empfaenger ist dann ein Ermpfaenger
des HF-Modul Herstellers zu verwenden.
Framerate fuer das gesamte Signal = 22,5 mSek
Pause zwischen den einzelnen Servosignalen = ca. 0,4 mSek
Versionsnachweis:
V0.1 Erste Testversion (Testhardware = FFS 2b)
Praefix Konventionen:
ps_ = Pinstatus
pi_ = Pin fuer input
po_ = Pin fuer output
c_ = Constant
b_ = Byte Variable
w_ = Word Variable
l_ = Label
s_ = Subroutine
r_ = RAM Pointer (Adresse)
e_ = EEPROM Pointer (Adresse)
#endrem
;EEPROM Adressen
symbol e_poti_links = 0
symbol e_poti_rechts = 1
symbol e_schalter_links = 2
symbol e_schalter_rechts = 3
symbol e_schalter_tempo = 4
;EEPROM mit Werten versorgen
;damit koennen die Servo-Endstellungen vorgegeben werden
;auszerdem kann die Drehrichtung der Servos umgekehrt werden
;Werte werden wie fuer servopos Befehl angegeben
eeprom e_poti_links,(100)
eeprom e_poti_rechts,(200)
eeprom e_schalter_links,(100)
eeprom e_schalter_rechts,(200)
eeprom e_schalter_tempo,(8)
;Pinbelegungen
;(zum Test wie FFS2, sodass dieser als Testhardware verwendet werden kann.)
symbol po_led = C.1
symbol po_summsig = C.2
symbol ps_schalter = pinC.3
symbol pi_poti = C.4 ;Pin Poti = Pin Motor vom FFS2
;Konstanten
symbol c_freqmult = 8 ;Faktor fuer 32 MHz
symbol c_codezeit = 3800 ;inkl. freqmult, muss bei Codeaenderungen zur Signalberechnung angepasst werden
symbol c_pause_low = 240 ;Pause zwischen den einzelnen Servosignalen = ca. 0,4 mSek
symbol c_framerate = 2250 ;= 22,5 mSek
symbol c_ein = 1 ;Schalterstellung auf ein
symbol c_aus = 0 ;Schalterstellung auf aus
symbol c_sig_korr = 40 ;Grund noch unklar, aber damit tut's
;fix vergebene Variablen
symbol b_poti_links = b0 ;b0 bis b4 werden aus dem EEPROM uebernommen
symbol b_poti_rechts = b1
symbol b_schalter_links = b2
symbol b_schalter_rechts = b3
symbol b_schalter_tempo = b4
symbol b_work1 = b5 ;Arbeitsvariable
symbol b_schalter_stand = b6
symbol w_sig_poti = w5 ;Signallaenge Motorservo
symbol w_sig_schalter = w6 ;Signallaenge Fahrwerksservo
symbol w_sig_rest = w7 ;fuer Servos 3 bis 8
symbol w_sig_ges = w8 ;Signallaenge aller Servosignale
symbol w_sig_start = w9 ;Signallaenge Startsignal
symbol w_work1 = w10 ;Arbeitsvariable
symbol w_sig_schalter_ziel = w11
;Programmsteuerung
l_start:
setfreq m32
high po_led ;Betriebsanzeige
gosub s_lesen_eeprom ;Servoendstellungen vom EEPROM in Bytevariablen uebernehmen
if ps_schalter = c_ein then
w_sig_schalter = b_schalter_rechts * c_freqmult
b_schalter_stand = c_ein
else
w_sig_schalter = b_schalter_links * c_freqmult
b_schalter_stand = c_aus
endif
w_sig_schalter_ziel = w_sig_schalter
;Endlosschleife
l_loop:
gosub s_sigber ;Signallaengen berechnen
gosub s_sigaus ;Summensignal ausgeben
goto l_loop
;Unterprogramm Lesen EEPROM
;Servoendstellungen werden in die Bytevariablen b0 bis b3 uebernommen
s_lesen_eeprom:
for bptr = 0 to 4
read bptr,@bptr
if bptr < 4 then
@bptr = @bptr - c_sig_korr
endif
next
return
;Unterprogramm Signallaengen berechnen
s_sigber:
;Signal fuer Poti berechnen
readadc pi_poti,w_work1
w_work1 = w_work1 + 1
if b_poti_rechts > b_poti_links then ; normale Laufrichtung
b_work1 = b_poti_rechts - b_poti_links
w_sig_poti = b_work1 * w_work1 / 256 + b_poti_links * c_freqmult
else ;= invertierte Laufrichtung
b_work1 = b_poti_links - b_poti_rechts
w_sig_poti = b_work1 * w_work1 / 256
w_sig_poti = b_poti_links - w_sig_poti * c_freqmult
end if
'sertxd (#w_work1,"/",#w_sig_poti,cr,lf)
;Signal fuer Schalter berechnen
if ps_schalter = c_ein and b_schalter_stand = c_aus then
w_sig_schalter_ziel = b_schalter_rechts * c_freqmult
b_schalter_stand = c_ein
;sertxd ("ps ein/stand aus:", #b_schalter_links,"/",#b_schalter_rechts,"/",#w_sig_schalter, "/", #w_sig_schalter_ziel, cr,lf)
end if
if ps_schalter = c_aus and b_schalter_stand = c_ein then
w_sig_schalter_ziel = b_schalter_links * c_freqmult
b_schalter_stand = c_aus
;sertxd ("ps aus/stand ein:", #b_schalter_links,"/",#b_schalter_rechts,"/",#w_sig_schalter, "/", #w_sig_schalter_ziel, cr,lf)
end if
if w_sig_schalter < w_sig_schalter_ziel then
w_sig_schalter = w_sig_schalter + b_schalter_tempo max w_sig_schalter_ziel
end if
if w_sig_schalter > w_sig_schalter_ziel then
w_sig_schalter = w_sig_schalter - b_schalter_tempo min w_sig_schalter_ziel
endif
;Signal fuer nicht benutzte Kanaele berechnen
w_sig_rest = 150 - c_sig_korr * c_freqmult ;fix auf Mitte
;Signallaenge fuer Startsignal berechnen (ohne Programmlaufzeit)
w_work1 = c_pause_low * 8
w_sig_ges = w_sig_rest*6 + w_sig_poti + w_sig_schalter + w_work1
w_sig_start = c_framerate * c_freqmult - w_sig_ges - c_codezeit
return
;Unterprogramm Summensignal ausgeben
s_sigaus:
low po_summsig ;Startsignal beenden
pauseus c_pause_low
pulsout po_summsig,w_sig_poti ;alle 8 Servosignale hintereinander absetzen
pauseus c_pause_low
pulsout po_summsig,w_sig_schalter
pauseus c_pause_low
pulsout po_summsig,w_sig_rest
pauseus c_pause_low
pulsout po_summsig,w_sig_rest
pauseus c_pause_low
pulsout po_summsig,w_sig_rest
pauseus c_pause_low
pulsout po_summsig,w_sig_rest
pauseus c_pause_low
pulsout po_summsig,w_sig_rest
pauseus c_pause_low
pulsout po_summsig,w_sig_rest
pauseus c_pause_low
high po_summsig ;Startsignal starten
pauseus w_sig_start
return