6-7 Kanal Rc Servo Kontrol

Başlatan rayman, 02 Mart 2018, 20:49:39

rayman

Arşivimde vardı ama bir ara silindi herşey... Rc  model uçak için 1km uzaktan kumanda ile potansiyometre hareketleri ile servoları kontrol etmem gerekiyor.... Böyle çalışma varmı bulamadım ?

alisumer

#1
asm kodu var 4 kanal adc diğer kanalları kendin ekleyebilirsin
  		LIST   P=PIC16F877A
#INCLUDE <P16F877A.INC>
    __CONFIG 0x3F3A

MOTOR EQU 0X020
KANAT EQU 0X021
DUMEN EQU 0X022
KUYRUK EQU 0X023

BCF STATUS,5
BCF STATUS,6


    CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF PORTD
CLRF PORTE
        BSF     RCSTA,SPEN

MOVLW 0X081
MOVWF ADCON0 ;10000001  ADCS1-ADCS0-CHS2-CHS1-CHS0-GO-,*,-ADON

;10000000 "ADCON1 " 10 BİT
BSF STATUS,5
CLRF OPTION_REG
BSF OPTION_REG,7
MOVLW B'00000000'
MOVWF ADCON1 ; ADFM-AFCS2-* *-PCFG3-PCFG2-PCFG1-PCFG0
CLRF TRISB
CLRF TRISC
CLRF TRISD
MOVLW 0X0FF
MOVWF TRISA
MOVLW 0X007
    MOVWF TRISE
MOVLW B'00100100'
MOVWF TXSTA ;CSRC-TX9-TXEN-SYNC-" "-BRGH-TRMT-TX9D

MOVLW   D'24' ;(20000000/50000/16)-1         "50.000" BAUDRATE
    MOVWF   SPBRG
   
SAY:


BCF STATUS,RP0
BCF STATUS,RP1

MOVLW 0X081
MOVWF ADCON0
MOVLW 0X0FF
SAY1:  
ADDLW 0X0FF
BTFSS STATUS,Z
GOTO SAY1
BSF ADCON0,GO
BCF STATUS ,RP0
BIR:
BTFSC ADCON0,GO
GOTO BIR
BANKSEL ADRESH
MOVF ADRESH ,W
MOVWF MOTOR

CALL KANAL1
CALL         KANAL2
CALL KANAL3
GOTO       GONDER
KANAL1:
MOVLW 0X089
MOVWF ADCON0
MOVLW 0X0FF
SAY2:  
ADDLW 0X0FF
BTFSS STATUS,Z
GOTO SAY2
BSF ADCON0,GO
BCF STATUS ,RP0
IKI:
BTFSC ADCON0,GO
GOTO IKI
BANKSEL ADRESH
MOVF ADRESH ,W
MOVWF KANAT
RETURN

KANAL2:
MOVLW 0X091
MOVWF ADCON0
MOVLW 0X0FF
SAY3:  
ADDLW 0X0FF
BTFSS STATUS,Z
GOTO SAY3
BSF ADCON0,GO
BCF STATUS ,RP0
UC:
BTFSC ADCON0,GO
GOTO UC
BANKSEL ADRESH
MOVF ADRESH ,W
MOVWF DUMEN
RETURN
KANAL3:
MOVLW 0X099
MOVWF ADCON0
MOVLW 0X0FF
SAY4:  
ADDLW 0X0FF
BTFSS STATUS,Z
GOTO SAY4
BSF ADCON0,GO
BCF STATUS ,RP0
DORT:
BTFSC ADCON0,GO
GOTO DORT
BANKSEL ADRESH
MOVF ADRESH ,W
MOVWF KUYRUK
RETURN
GONDER:
BANKSEL TXREG
MOVLW 'A'
MOVWF TXREG
CALL KONTROL
BANKSEL TXREG
MOVF MOTOR ,W
MOVWF TXREG
CALL KONTROL
BANKSEL TXREG
MOVF KANAT , W
MOVWF TXREG

CALL KONTROL
BANKSEL TXREG
MOVF KUYRUK , W
MOVWF TXREG

CALL KONTROL
BANKSEL TXREG
MOVF DUMEN , W
MOVWF TXREG

CALL KONTROL
GOTO SAY
KONTROL:
BANKSEL TXSTA
BTFSS TXSTA,1
GOTO KONTROL
RETURN
GOTO SAY
END

baudrate 50000 e ayarlanmış sen spbrg değerinden tablodan birşey seçebilirsin
bu arada alıcı kısmı için şöye bir sıkıntı var bu program analog okuduğu 8 bit veriyi gönderiyor  tabi 0 ile ff arası bu veri okumada 0 ile 2 ms arasında değeri kontrol ediyor buda şöyle bir sorun servo 1 ile 2 ms arasında çalışıyor verici kısımda asm olduğu için  kendim yazmama rağmen ve çok fazla da bilmediğim için okunan değeri 100 ile 200 arası olacak şekilde değiştiremedim sende bu konuda biliyorsan yardımcı ol hesap kitap işlerinde iyi değilim:)
Hep meraktan

alisumer

Buda basic alıcı kısmı üzerinde çalışılmalı NOT: ETE hocanın derslerinden arak :))) ama malesef 0 ile 2 ms arası çalışıyor
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2018 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 13.12.2018                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

Define CONF_WORD = 0x3F42



;@ __config _BODEN_OFF & _BOREN_OFF & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _INTRC_OSC_NOCLKOUT
include "modedefs.bas"
DEFINE OSC 20
DEFINE SER2_BITS 8

TRISA   =  1
TRISB   =  1
PORTB   =  0
PORTA   =  0
CMCON=7

'A VAR A1.LOWBYTE
'B VAR A1.HIGHBYTE
'C VAR BYTE
'D VAR BYTE
'E VAR BYTE
A1 VAR word
B1 VAR word
C1 VAR word
D1 VAR word
'E1 VAR BYTE

SURE VAR WORD

basla:


SERIN2  PORTB.1 ,0,[wait("A"),A1,B1,C1,D1]

A1=((A1+1)*/300)
B1=((B1+1)*/200)
C1=((C1+1)*/200)
D1=((D1+1)*/200)


SURE = (A1+B1+C1+D1) *10
SURE = 20000-SURE
PAUSEUS SURE
       
PULSOUT  PORTA.0 , A1*5
PULSOUT  PORTA.1,  B1*5
PULSOUT  PORTA.2,  C1*5
PULSOUT  PORTA.3,  D1*5

GOTO BASLA

end





A1 in değerini denemek için 300 yaptım böylece orta nokta 1.5ms oluyor ama çözünürlük düşüyor
Hep meraktan

alisumer

#3
Bu 4 kanal 10 bit adc verici
  		LIST   P=PIC16F877A
#INCLUDE <P16F877A.INC>
    __CONFIG 0x3F3A

MOTOR EQU 0X020
KANAT EQU 0X021
DUMEN EQU 0X022
KUYRUK EQU 0X023
MOTOR1 EQU 0X024
KANAT1 EQU 0X025
DUMEN1 EQU 0X026
KUYRUK1 EQU 0X027
BCF STATUS,5
BCF STATUS,6


    CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF PORTD
CLRF PORTE
        BSF     RCSTA,SPEN

MOVLW 0X081
MOVWF ADCON0 ;10000001  ADCS1-ADCS0-CHS2-CHS1-CHS0-GO-,*,-ADON

;10000000 "ADCON1 " 10 BİT
BSF STATUS,5
CLRF OPTION_REG
BSF OPTION_REG,7
MOVLW B'10000000'
MOVWF ADCON1 ; ADFM-AFCS2-* *-PCFG3-PCFG2-PCFG1-PCFG0
CLRF TRISB
CLRF TRISC
CLRF TRISD
MOVLW 0X0FF
MOVWF TRISA
MOVLW 0X007
    MOVWF TRISE
MOVLW B'00100100'
MOVWF TXSTA ;CSRC-TX9-TXEN-SYNC-" "-BRGH-TRMT-TX9D

MOVLW   D'24' ;(20000000/50000/16)-1         "50.000" BAUDRATE
    MOVWF   SPBRG
   
SAY:


BCF STATUS,RP0
BCF STATUS,RP1

MOVLW 0X081
MOVWF ADCON0
MOVLW 0X0FF
SAY1:  
ADDLW 0X0FF
BTFSS STATUS,Z
GOTO SAY1
BSF ADCON0,GO
BCF STATUS ,RP0
BIR:
BTFSC ADCON0,GO
GOTO BIR
BANKSEL ADRESH
MOVF ADRESH ,W
MOVWF MOTOR
BANKSEL ADRESL
MOVF ADRESL ,W
BCF STATUS ,RP0
MOVWF MOTOR1

CALL KANAL1
CALL KANAL2
CALL KANAL3
GOTO GONDER
KANAL1:
MOVLW 0X089
MOVWF ADCON0
MOVLW 0X0FF
SAY2:  
ADDLW 0X0FF
BTFSS STATUS,Z
GOTO SAY2
BSF ADCON0,GO
BCF STATUS ,RP0
IKI:
BTFSC ADCON0,GO
GOTO IKI
BANKSEL ADRESH
MOVF ADRESH ,W
MOVWF KANAT
BANKSEL ADRESL
MOVF ADRESL ,W
BCF STATUS ,RP0
MOVWF KANAT1
RETURN

KANAL2:
MOVLW 0X091
MOVWF ADCON0
MOVLW 0X0FF
SAY3:  
ADDLW 0X0FF
BTFSS STATUS,Z
GOTO SAY3
BSF ADCON0,GO
BCF STATUS ,RP0
UC:
BTFSC ADCON0,GO
GOTO UC
BANKSEL ADRESH
MOVF ADRESH ,W
MOVWF DUMEN
BANKSEL ADRESL
MOVF ADRESL ,W
BCF STATUS ,RP0
MOVWF DUMEN1
RETURN
KANAL3:
MOVLW 0X099
MOVWF ADCON0
MOVLW 0X0FF
SAY4:  
ADDLW 0X0FF
BTFSS STATUS,Z
GOTO SAY4
BSF ADCON0,GO
BCF STATUS ,RP0
DORT:
BTFSC ADCON0,GO
GOTO DORT
BANKSEL ADRESH
MOVF ADRESH ,W
MOVWF KUYRUK
BANKSEL ADRESL
MOVF ADRESL ,W
BCF STATUS ,RP0
MOVWF KUYRUK1
RETURN
GONDER:
BANKSEL TXREG
MOVLW 'A'
MOVWF TXREG
CALL KONTROL

BANKSEL TXREG
MOVF MOTOR ,W
MOVWF TXREG
CALL KONTROL
BANKSEL TXREG
MOVF MOTOR1 ,W
MOVWF TXREG
CALL KONTROL

BANKSEL TXREG
MOVF KANAT , W
MOVWF TXREG
BANKSEL TXREG
MOVF KANAT1 ,W
MOVWF TXREG
CALL KONTROL

CALL KONTROL
BANKSEL TXREG
MOVF KUYRUK , W
MOVWF TXREG
BANKSEL TXREG
MOVF KUYRUK1 ,W
MOVWF TXREG
CALL KONTROL

CALL KONTROL
BANKSEL TXREG
MOVF DUMEN , W
MOVWF TXREG
BANKSEL TXREG
MOVF DUMEN1 ,W
MOVWF TXREG
CALL KONTROL

GOTO SAY
KONTROL:
BANKSEL TXSTA
BTFSS TXSTA,1
GOTO KONTROL
RETURN
GOTO SAY
END

buda alıcı kısmı
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2018 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 13.12.2018                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

Define CONF_WORD = 0x3F42



;@ __config _BODEN_OFF & _BOREN_OFF & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _INTRC_OSC_NOCLKOUT
include "modedefs.bas"
DEFINE OSC 20
DEFINE SER2_BITS 8

TRISA   =  1
TRISB   =  1
PORTB   =  0
PORTA   =  0
CMCON=7

'A VAR A1.LOWBYTE
'B VAR A1.HIGHBYTE
'C VAR BYTE
'D VAR BYTE
'E VAR BYTE
A1 VAR word
B1 VAR word
C1 VAR word
D1 VAR word
'E1 VAR BYTE

SURE VAR WORD

basla:


SERIN2  PORTB.1 ,0,[wait("A"),A1.HIGHBYTE,A1.LOWBYTE,B1.HIGHBYTE,B1.LOWBYTE,C1.HIGHBYTE,C1.LOWBYTE,D1.HIGHBYTE,D1.LOWBYTE]

A1=((A1+1)*/200)/4
B1=((B1+1)*/200)/4
C1=((C1+1)*/200)/4
D1=((D1+1)*/200)/4


SURE = (A1+B1+C1+D1) *10
SURE = 20000-SURE
PAUSEUS SURE
       
PULSOUT  PORTA.0 , A1*5   ' 20 MHZ OSC DE PULSOUT KOMUT DEĞERİ 2 İLE ÇARPILIR  100 = 200 US   (300*5)*2 = 3000 us
PULSOUT  PORTA.1,  B1*5    '4 MHZ DE 10 İLE ÇARPILIR 100 = 1000 US
PULSOUT  PORTA.2,  C1*5
PULSOUT  PORTA.3,  D1*5





GOTO BASLA








yanlız iletişim hızı düşük olduğunda malum her kanal için 10 bit veri 2 byte halinde gönderilmek zorunda olduğundan bayağı zaman alacağından 6-7 kanal gecikmelere neden olabilir bilmiyorum programdan zaman kazanılabilirmi ama adc okuma için donanımın bir sınırı var o sınırı beklemek zorundasın çok fazzla da hızlandıramassın anca baudrate değeri ile oynayarak zaman kazanmaya çalışmak bana mantıklı geldi kolay gelsin bu arada şu 1ms 2 ms arası puls üretme işini yapabilen varsa ETE hocam özellikle siz bilgiye açım yardıma açığım :)
Hep meraktan

Powered by EzPortal