Wah asyik nih pak budiman satu aliran juga....

, Pake Atmel 89X aja pak... kayak pake Z-80 tapi cuma satu IC aja...

, program langsung di tulis ke processor lewat ISP port, di connect-in ke paralel port komputer...
@Mas JedX: VPN saya lagi susah nih jadi saya share di sini saja ya... @Pak Budiman: Kalau tertarik... langsung coba aja pak. Board Jadi yang murah meriah bisa di lihat di
http://www.bataraelektrindo.com/elektrindo/products.php?pageNum_produk=2#
Anyway, ini program buat untuk buat CCPM dari TX/RX 4 channel. Program dibuat untuk Atmel 89S52 untuk feature Fail-save tapi bisa juga jalan di 89S51/8051 tapi tanpa feature fail-save karena tidak ada timer2.
Blok logic diagram diagram
Signal Radio (Di Walkera 4Ch ada di pin 1), di buffer dgn 74LS14 Schmitt Trigger (Krn Inverting jd di double buffer) untuk menghilangkan noise dan maintain high impedance jadi RX tetap berfungsi normal.
Signal radio di hubungkan dgn port 3.2 untuk Gate Timer0 & interupt 0.
Incomming signal di ukur lebar pulsanya oleh Timer0 dan di simpan di lokasi memori 40-49, setelah signal synch terdeteksi. Untuk setiap cycle (1 Synch pulse) harga CCPM di hitung dan hasilnya di move ke output buffer di address 30-38. Output di drive oleh synch pulse tapi kalau unsync timer 2 akan detek dan mengeluarkan output yang ada di 30-38 (fail-save).
Programnya:
Silahkan dipergunakan untuk keperluan non komersil, semoga menjadi ilmu yang berguna
$INCLUDE (REG_C51.INC) ; 8051/8259 Register declaration
$MOD51 ; Port Naming
org 00h
ljmp begin ; Init
ORG 0003H ; Pointer ke Procedure untuk process incomming signal
LJMP INT0PROC
ORG 01BH
LJMP TIMER1 ; Pointer ke Timer1 yg mengatur lebar pulsa output
org 02Bh
ljmp timer2 ; Pointer ke Timer2 yg mengatur Processor Output Cycle dan Watch Dog kalau signal hilang
; tetap hasilin signal buat servo (Fail-save)
org 100
begin:
MOV R1,#40H ; Init value
mov r0,#40h ; Pointer ke Address 40H untuk menyimpan lebar pulsa dari signal
setiap pulsa lebarnya 16bit, krn penyimpanan hanya utk 8 Bit-> di simpan dalam dua lokasi
;TIMER2 SETTING 20 MS
MOV TH2,#0B1H
MOV TL2,#0DFH
MOV RCAP2H,#0B1H
MOV RCAP2L,#0DFH
CLR C_T2
CLR CP_RL2
SETB EA
SETB ET2
SETB TR2
;;END SETTING TIMER2
;SETTING TIMER0
SETB EA ;; ENABLE INTERUPT
SETB EX0 ;; EXTERNAL INTERUPT 0
SETB IT0 ;; FAILING EDGE TYPE INTERUPT
ANL TMOD,#0F0H
ORL TMOD,#09H
MOV TH0,#00H
MOV TL0,#00H
CLR ET0 ;INTERUPT
SETB TR0
;RISE INT0 PORT
SETB P3.2
;RUN TIMER
;TIMER1
ANL TMOD,#0FH
ORL TMOD,#10H
SETB ET1
;JALANIN TIMER1 NO OUTPUT
MOV R0,#40H
MOV TH1,#0FFH
MOV TL1,#0F0H
SETB TR1
;init CCPM indicator
MOV R4,#00H
JMP $ ; Initialized completed, tinggal tunggu interupt datang dari Signal Radio/Timer 1 (watch Dog)
INT0PROC: ; Setiap signal radio berubah dari 5V -> 0V, procedure ini akan dipanggil
; Karena Timer0 di gated dgn signal yang sama, saat signal 5V harga timer akan berkurang 1 setiap
; 1 micro second. Saat procedure ini di panggil, Harga Timer0 berisi Lebar Pulsa dalam micro second.
push psw
push acc
CLR TR0
;CPL P0.0
MOV R2,TH0
MOV R3,TL0
MOV TH0,#00H
MOV TL0,#00H
SETB TR0
;remove 3LSB ->0 (1111 1100) TO REMOVE JITTER
MOV A,#0FCH
ANL A,R3
MOV R3,A
;CHECK IF TH=19H ->MARK: Jika 8 bit tertinggi dari Timer0 lebih besar dari 19H artinya pulsa lebih lebar dari 6.4 mS
; Karena max lebar pulsa adl 2mS ini artinya signal ini adalah signal synchronisasi. Signal setelah ini adalah signal
; untuk channel 1.
MOV A,R2
CLR C
SUBB A,#19H ;#19H
JC NOMARK
;Setelah synch baru process
MOV R1,#40H
cpl P0.7
MOV R5,#01H
;INDEX TIMER1 DI SET CH 0
; Timer2 di set untuk jadi Fail-Save kalau signal hilang. 50mS dari sekarang timer 2 akan jalan biar
; Tidak ada signal yang datang dengan menggunakan last known signal
clr tr2
MOV TH2,#0B1H
MOV TL2,#0DFH
setb tr2
MOV R0,#30H
syncout:
;COPY DR 40 KE 30
; dari buffer siap di keluarkan ke output (30-39)
MOV 30H,43H
MOV 31H,42H
MOV 32H,45H
MOV 33H,44H
MOV 34H,47H
MOV 35H,46H
MOV 36H,49H
MOV 37H,48H
;CH 5 merupakan replikasi dr ch 3
MOV 38H,34H
MOV 39H,35H
CJNE R4,#00H,CCPMINIT
; Karena ini processor 8 Bit, untuk ngitung operasi 16Bit agak di akal2 dikit
;GET THORTLE INIT VALUE AND STORE AS 8 BIT IN 5AH
MOV A,31H
MOV B,30H
ACALL TO8BIT
;MAKE SURE HASILNYA NANTI POSITIF
SUBB A,#02H
MOV 5AH,A
;GET AELERON INIT VAL AND STORE AS 8 BIT IN 5BH
MOV A,33H
MOV B,32H
ACALL TO8BIT
MOV 5BH,A
CCPMINIT:
ACALL CCPMLOGIC
NOMARK:
; Harga Signal di copy ke 40H&41 utk signal Sync
; 42H-48 (Buffer) utk signal channel 1 - 4, pemilihan lokasi memory ada pada index @R1
MOV A,R2
CLR C
;ADDJUST MIN
ADDC A,#02H
MOV @R1,A
INC R1
MOV A,R3
MOV @R1,A
INC R1
CJNE R1,#54H,NOOVERFLOW
MOV R1,#40H
;REMOVE MARK FLAG
MOV R5,#00H
NOOVERFLOW:
pop acc
pop psw
RETI
TIMER1:
; Timer 1 di isi lebar pulsa yang akan di keluarkan di ambil dari 30H-38
; index Channel di @R0 output yg di gunakan port 0 dr bit 0 - 4
push psw
push acc
CLR TR1
;RESET OUTPUT
MOV P0,#00H
;DO NOT PRODUCE SIGNAL WHEN R4 STILL 0 (HAVENT REVIEVED ANY DATA)
CJNE R4,#00H,INITILIZED
JMP NO38
INITILIZED:
;42
CJNE R0,#30H,NO42
;OVERFLOW ? PREPARE FORK NEXT CYCLE
CJNE R5,#00H,NOFORK
ACALL PREPAREFORK
NOFORK:
CLR C
MOV A,0FFH
SUBB A,@R0
MOV TL1,A
MOV A,0FFH
INC R0
SUBB A,@R0
INC R0
MOV TH1,A
SETB P0.0
SETB TR1
JMP SETOUT
NO42:
;44
CJNE R0,#32H,NO44
CLR C
MOV A,0FFH
SUBB A,@R0
MOV TL1,A
MOV A,0FFH
INC R0
SUBB A,@R0
INC R0
MOV TH1,A
SETB P0.1
SETB TR1
JMP SETOUT
NO44:
;46
CJNE R0,#34H,NO46
CLR C
MOV A,0FFH
SUBB A,@R0
MOV TL1,A
MOV A,0FFH
INC R0
SUBB A,@R0
INC R0
MOV TH1,A
SETB P0.2
SETB TR1
JMP SETOUT
NO46:
;46
CJNE R0,#36H,NO36
CLR C
MOV A,0FFH
SUBB A,@R0
MOV TL1,A
MOV A,0FFH
INC R0
SUBB A,@R0
INC R0
MOV TH1,A
SETB P0.3
SETB TR1
JMP SETOUT
NO36:
CJNE R0,#38H,NO38
CLR C
MOV A,0FFH
SUBB A,@R0
MOV TL1,A
MOV A,0FFH
INC R0
SUBB A,@R0
INC R0
MOV TH1,A
SETB P0.4
MOV R0,#40H
SETB TR1
JMP SETOUT
NO38:
CJNE R0,#40H,SETOUT
CLR C
MOV TL1,#098H
MOV TH1,#0FFH
CPL P0.7
SETB TR1
SETOUT:
SETB TR1
pop acc
pop psw
RETI
timer2:
; Kalau signal hilang reset R0 supaya output tetap keluar (fail-save)
clr tf2
push psw
push acc
CJNE R5,#01H,DONTRESET
;CJNE R0,#40H,DONTRESET
MOV R0,#30H
DONTRESET:
pop acc
pop psw
RETI
TO8BIT:
;CASTING A (MSB) AND B(LSB) TO 8BIT->A
RL A
RL A
RL A
RL A
RL A
ANL A,#0E0H
PUSH ACC
MOV A,B
RR A
RR A
RR A
ANL A,#1FH
MOV B,A
POP ACC
ORL A,B
RET
TO16BIT:
;CAST A TO A,B
PUSH ACC
;LSB
RL A
RL A
RL A
ANL A,#0F8H
MOV B,A
;MSB
POP ACC
RR A
RR A
RR A
RR A
RR A
ANL A,#07H
MOV B,A
RET
CCPMADD:
; A->MSB
; B->LSB
; R4 ->CONSTANT
; TEMP MEMORY 5A - 5F
;STORE VALUE FIRST
MOV 5AH,A
MOV 5BH,B
;EXPAND R4
MOV A,R4
ACALL TO16BIT
;STORE VALUE
MOV 5CH,A
MOV 5EH,B
;ADD LSB FIRST
MOV A,5BH
MOV B,5EH
ADDC A,B
;SIMPAN
PUSH ACC
;ADD MSB
MOV A,5AH
MOV B,5EH
ADDC A,B
;MSB-A, TARUH LSB ->
POP B
RET
CCPMSUB:
; A->MSB
; B->LSB
; R4 ->CONSTANT
; TEMP MEMORY 5A - 5F
;STORE VALUE FIRST
MOV 5AH,A
MOV 5BH,B
;EXPAND R4
MOV A,R4
ACALL TO16BIT
;STORE VALUE
MOV 5CH,A
MOV 5EH,B
;SUB LSB FIRST
MOV A,5BH
MOV B,5EH
SUBB A,B
;SIMPAN
PUSH ACC
;ADD MSB
MOV A,5AH
MOV B,5EH
SUBB A,B
;MSB-A, TARUH LSB ->
POP B
RET
CCPMLOGIC:
;CCPM LOGIC
;REMEMBER 30H-RANGE LSB FIRST!!!-->gara2 lupa ini sempet crash nih he he...
;TRANSLATE THORTLE INTO 8 BIT
MOV A,31H
MOV B,30H
ACALL TO8BIT
;KURANGIN ->02C0 (58) DULU DLM BTK 8 BIT
CLR C
SUBB A,5AH
JNC NOTMINUS
MOV A,#00H
NOTMINUS:
; CLR C
; RLC A
;NEW PATCH KEEP MSB IN 5C
MOV B,#02H ;ccpm MULTIPLIER- Ini rep 8 bit dari 16 bit (shifter right), kalau Pitch movement
;kurang besarin aja harganya.. hasilnya akan di operasiin untuk ngerubah center point
;dr cyclic servo.
MUL AB
;RESULT LSB ->A, MSB DI 5C
MOV 5CH,B
MOV R4,A
CLR C
;; TTP MIXING
;; CH2&3 TAMBAH
;; MSB TAMBAH R4
MOV A,32H
MOV B,R4
ADDC A,B
MOV 32H,A
MOV A,33H
MOV B,#00H ;5CH
ADDC A,B
MOV 33H,A
CLR C
MOV A,34H
MOV B,R4
ADDC A,B
MOV 34H,A
MOV A,35H
MOV B,#00H ;5CH
ADDC A,B
MOV 35H,A
;CH5 DIKURANG
CLR C
MOV A,38H
MOV B,R4
SUBB A,B
MOV 38H,A
MOV A,39H
MOV B,#00H ;5CH
SUBB A,B
MOV 39H,A
RET
PREPAREFORK:
clr tr2
MOV TH2,#0B1H
MOV TL2,#0DFH
setb tr2
RET
END
Note: Program sudah digunakan di DF60 dan telah terbang dng baik. Tidak ada garansi dalam bentuk apapun bahwa ini akan bekerja di implementasi yang lain dan saya tidak bertanggung jawab atas segala akibat langsung/Tidak langsung dari penggunaan program ini