16f873a ile adc uygulamasi

Başlatan selvi, 24 Şubat 2011, 09:15:42

selvi

2 pot kullanarak 2 adc uygulamasi yaptim.soyle bir sorun cikiyor.adc okumalarini yapmiyor.simulasyonda calisiyor.fakat asil devrede tek tuk calisiyor.adc tanimlamalarinda eksik seyler olabilir mi?harici kiristal 4mhz kullandim.kodlar asagidaki sekildedir.

kod:
@ DEVICE pic16F873A \\\'islemci 16F873A                                         
@ DEVICE pic16F873A, WDT_OFF \\\'Watch Dog timer kapali
@ DEVICE pic16F873A, PWRT_ON \\\'Power on timer acik
@ DEVICE pic16F873A, PROTECT_OFF \\\'Kod Protek kapali
@ DEVICE pic16F873A, XT_OSC \\\'4 MHz kullaniliyor
@ DEVICE pic16F873A, LVP_OFF
@ DEVICE pic16F873A, BOD_OFF

PORTA=0:TRISA=%00000011 \\\'AN0 VE AN1  kullaniliyor
PORTB=0:TRISB=%00000000
PORTC=0:TRISC=%00000000

ADCON1 = %10000100   \\\'2 servo AN0,AN1,AN3  analog   giris
\\\'ADCON0 =%01000000

Define ADC_BITS 10
Define ADC_CLOCK 3  \\\'burda bir yanlis tanimlama olabilir mi?
Define ADC_SAMPLEUS 100

DEFINE HSER_RCSTA 90h \\\' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h \\\' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 25  \\\'9600 baud @ 4mhz
DEFINE HSER_CLROERR 1 \\\' Clear overflow automatically

OPTION_REG.7=1    \\\'Dahili pull-up lar pasif yapildi

DEGER0 VAR WORD
DEGER1 VAR WORD
VER VAR BYTE

BASLA:
     ADCIN 0,DEGER0
BAK1:  IF ADCON0.2=1 THEN BAK1 \\\'Çevirme iþlemi tamamlanýnca Adcon0.2=0 olacak.
     ADCIN 1,DEGER1
BAK2:  IF ADCON0.2=1 THEN BAK2 \\\'Çevirme iþlemi tamamlanýnca Adcon0.2=0 olacak.
     PORTB.3=1 \\\'led yansin(adc kontrol)

   if DEGER0>450 AND DEGER0<550 and DEGER1>450 AND DEGER1<550 THEN  \\\'sag-sol hareketsiz durum
   VER=70
   GOSUB GONDER
   ENDIF
   IF DEGER0>600 and DEGER0<800  THEN  \\\'sola hareket
   VER=135
   GOSUB GONDER
   ENDIF
   IF DEGER0>300 AND DEGER0<400 THEN  \\\'saga hareket
   VER=163
   GOSUB GONDER
   ENDIF
   IF DEGER1>600 and DEGER1<800 THEN  \\\'asagi hareket
   VER=30
   GOSUB GONDER
   ENDIF
    IF DEGER1>300 AND DEGER1<400 THEN \\\'yukari hareket
   VER=10
   GOSUB GONDER
   ENDIF
   IF DEGER0>600 and DEGER0<800 and DEGER1>300 AND DEGER1<400 THEN \\\'sol-yukari
  VER=125
   GOSUB GONDER
   ENDIF
   IF DEGER0>600 and DEGER0<800 and DEGER1>600 and DEGER1<800 THEN \\\'sol-asagi
  VER=200 
   GOSUB GONDER
   ENDIF
   IF DEGER0>300 AND DEGER0<400 AND DEGER1>300 AND DEGER1<400 THEN \\\'sag-yukari
   VER=143
   GOSUB GONDER
   ENDIF
   IF DEGER0>300 AND DEGER0<400 AND DEGER1>600 and DEGER1<800 THEN \\\'sag-asagi
   VER=213
   GOSUB GONDER
   ENDIF
 
   GOTO BASLA
GONDER:   
HSEROUT [REP$AA\\\\5,REP$00\\\\5,REP$FF\\\\5]\\\'uyandirma sinyali preambl
HSEROUT [\\\"A\\\",\\\"R\\\",\\\"A\\\",VER] 
HSEROUT [\\\"A\\\",\\\"R\\\",\\\"A\\\",VER]
HSEROUT [\\\"A\\\",\\\"R\\\",\\\"A\\\",VER] 
HSEROUT [\\\"A\\\",\\\"R\\\",\\\"A\\\",VER]   
RETURN
   END                   
   
   

Yaşam anlamlandırıldıkça kutsaldır....

ete

Selvi,

87xA serisinde default olarak komparatör vardır. Comparatör pinleri açılışta default olarak aktiftir.
ADC özelliğine ulaşmak için önce bu comparatör özelliğinin kapatılması gerekir. Kapatma komutu CMCON=7 dir.

Komparatörleri Kapatın ve yeniden deneyin lütfen.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

selvi

hocam belirtiginiz sekilde denedim.ilkinde bir potunda ki adc kismi calisti.ama 2.pot hic calismadi.sonra denemelere devam ettim.ikiside olmuyor.birde sizin derslerinizdeki uygulamalarda cmcon=7 yapilmiyor.bu sekildeki kullanimlarda.cmcon=7 dijital olarak giris ve cikis olarak kullanmak icin degil mi.
bu sekildeki yazilim icin;
ADCON1 = %10000100   \'2 servo AN0,AN1,AN3  analog   giris
\'ADCON0 =%01000000

Define ADC_BITS 10
Define ADC_CLOCK 3
Define ADC_SAMPLEUS 100

adc_clock 4mhz icin 1 olmasi gerekmiyormu.tabi ADCON0 =%01000000 oldugunda.adc_clock 3 dahili kiristaller icin degilmi yoksa ek farkli bir sey var mi?
Yaşam anlamlandırıldıkça kutsaldır....

ete

#3
Hemen belirteyim 87x serisinin A modellerinde Comparatör vardır A olmayanlarda yoktur.
Comparatör öncelikli ve default seçenektir. İptal etmez isen A portu pinleri comparatör olarak çalışır.
Edersen Pinler ADC olarak çalışır. ADC yide iptal edersen (ADCON1=7) bu sefer pinler digital çalışır.

Deneme yaptığın dosyaları bir yere yükleyebilirmisin?

Bütün Programı \\\ işareti ile doldurmuşsun. Nedir bu? Bu şekilde derleme yapılmayacağını bilemen gerek.

Yüklemene gerek kalmadı. Ben isis de denedim çalışıyor. Sorun yok.
Gerçekte de  çalışır bu.
Bütün \\\ işaretlerini kaldır ve programı o şekilde derle.


Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

selvi

hocam kusurta bakma ben bu a modellerinde boyle bir ozelligin yeni ogrendim.
@ DEVICE pic16F873A 'islemci 16F873A                                         
@ DEVICE pic16F873A, WDT_OFF 'Watch Dog timer kapali 
@ DEVICE pic16F873A, PWRT_ON 'Power on timer acik 
@ DEVICE pic16F873A, PROTECT_OFF 'Kod Protek kapali
@ DEVICE pic16F873A, XT_OSC '4 MHz kullaniliyor
@ DEVICE pic16F873A, LVP_OFF
@ DEVICE pic16F873A, BOD_OFF

PORTA=0:TRISA=%00000011 'AN0 VE AN1  kullaniliyor
PORTB=0:TRISB=%00000000
PORTC=0:TRISC=%00000000

ADCON1 = %10000100   '2 servo AN0,AN1,AN3  analog   giris
'ADCON0 =%01000000

Define ADC_BITS 10
Define ADC_CLOCK 3  'burda yanlis bir tanimlama var mi
Define ADC_SAMPLEUS 100

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 25  '9600 baud @ 4mhz
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
 
OPTION_REG.7=1    'Dahili pull-up lar pasif yapildi 
CMCON=7

DEGER0 VAR WORD
DEGER1 VAR WORD
VER VAR BYTE

 BASLA:
     ADCIN 0,DEGER0
BAK1:  IF ADCON0.2=1 THEN BAK1 'Çevirme iþlemi tamamlanýnca Adcon0.2=0 olacak.

     ADCIN 1,DEGER1
BAK2:  IF ADCON0.2=1 THEN BAK2 'Çevirme iþlemi tamamlanýnca Adcon0.2=0 olacak.
     PORTB.3=1 'led yansin(adc kontrol)

   if DEGER0>450 AND DEGER0<550 and DEGER1>450 AND DEGER1<550 THEN  'sag-sol hareketsiz durum
   VER=70
   GOSUB GONDER
   ENDIF
   IF DEGER0>600 and DEGER0<800  THEN  'sol hareket
   VER=135
   GOSUB GONDER
   ENDIF
   IF DEGER0>300 AND DEGER0<400 THEN  'saga hareket
   VER=163
   GOSUB GONDER
   ENDIF
   IF DEGER1>600 and DEGER1<800 THEN  'asagi hareket
   VER=30
   GOSUB GONDER
   ENDIF
    IF DEGER1>300 AND DEGER1<400 THEN 'yukari hareket
   VER=10
   GOSUB GONDER
   ENDIF
   IF DEGER0>600 and DEGER0<800 and DEGER1>300 AND DEGER1<400 THEN 'sol-yukari
  VER=125
   GOSUB GONDER
   ENDIF
   IF DEGER0>600 and DEGER0<800 and DEGER1>600 and DEGER1<800 THEN 'sol-asgi
  VER=200  
   GOSUB GONDER 
   ENDIF
   IF DEGER0>300 AND DEGER0<400 AND DEGER1>300 AND DEGER1<400 THEN 'sag-yukari
   VER=143
   GOSUB GONDER
   ENDIF
   IF DEGER0>300 AND DEGER0<400 AND DEGER1>600 and DEGER1<800 THEN 'sag-asgi
   VER=213
   GOSUB GONDER
   ENDIF
   GOTO BASLA
GONDER:   
HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]'uyandirma sinyali preambl
HSEROUT ["A","R","A",VER]  
HSEROUT ["A","R","A",VER]
HSEROUT ["A","R","A",VER]  
HSEROUT ["A","R","A",VER]   
RETURN
   END                  
   
   
Yaşam anlamlandırıldıkça kutsaldır....

ete

#5
Bu şekilde çalışıyor. Ancak hemen belirteyim aşağıda yer alan IF satırlarının birisinde veya bir kaçında mantık hatası mevcut.
Bu hata nedeni ile potlara değer verdiğin zaman VER isimli değişken iki farklı değer almak istiyor. Bir yere kadar diyelimki 10 değerini aldı hemen ardından 130 değerini alıyor sonra yeniden 10 değerini alıyor. Bu 10 ve 130 değerleri sanal değerler gerçekte daha farklı değerler.
Ama sanırım IF satırlarında bir mantık hatası var. Ne yapmaya çalıştığını açıklarsan yardımcı olabilirm belki.
Tamam servo motor kontrol edeceksin ama ortada iki adet pot olduğuna göre potkların konumlarına göre nasılbir kontrol yapmak istediğini açıklamalısın.

Şimdi test ettim, ADC0=634 , ADC1=777 iken  önce VER=135 oluyor, hemen ardından VER=200 oluyor ve ardından VER=30 oluyor.
Potlarla hiç oynama bu üç değer sırası ile VER değişkenine veriliyor. Halbuki bu işlerde VER yalnızca tek değer alması gerekir diye biliyorum.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

selvi

#6
bahsettiginiz konulari anladim.dogru program o sekilde oluyor.verdigim verici programi verici kumandasina aittir.2 tane joystik kol var.yani 2 pot uzerindeki konuma gore aliciyi(yani oyuncak) arabayi yonlendirmek istiyorum.arabada sag-sol hareketini saglayan servo motordur.servo adim adim degil tam sag ve tam sol olarak calisiyor.ileri ve geri hareketi saglayan dc motordur.arabayi ileri,geri,sag ve sol hareketlerini saglamak icin potun konumuna gore veri yolluyor.10bit adc ozeligini kullaniyorum.pot un hareketsiz konumu 2.5v(512) denk geliyor.bir pot ile sag-sol hareket sagliyor.bir pot ile ileri-geri hareketini sagliyor.ornegin:arabayi ileri giderken ayni anda sag veya sol hareketi olabilir. bu duruma gorede bir veri degeri yollanmasi lazim.ileri,geri,sag,sol,ileri-sol(sol-ileri),ileri-sag(sag-ileri),geri-sol(sol-geri),geri-sag(sag-geri) ve durdur olmak uzere 9 farkli bilgi yollaniyor.

alici kod:
@ DEVICE pic16F628A \\\'islemci 16F628A
@ DEVICE pic16F628A, WDT_OFF \\\'Watch Dog timer kapali
@ DEVICE pic16F628A, PWRT_ON \\\'Power on timer acik
@ DEVICE pic16F628A, PROTECT_OFF \\\'Code Protec kapali
@ DEVICE pic16F628A, MCLR_ON \\\'MCLR pini kullaniliyor.
@ DEVICE pic16F628A, XT_OSC \\\'Dahili osilatör kullanilmayacak
@ DEVICE pic16F628A, LVP_OFF
@ DEVICE pic16F628A, BOD_OFF

DEFINE HSER_RCSTA 90h \\\' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h \\\' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 25  \\\' 9600 baud @ 4mhz
DEFINE HSER_CLROERR 1 \\\' Clear overflow automatically

SYMBOL GIE  =INTCON.7   \\\'genel interruptlarý açiyor
SYMBOL PEIE =INTCON.6   \\\'peripheral interruptlarý açiyor
SYMBOL RCIE =PIE1.5     \\\'USART Recive interrupt enable bit
SYMBOL RCIF =PIR1.5     \\\'USART Receive interrupt flag bit

RCIE=1: PEIE=1:GIE=1

CMCON=7           \\\'16F628 de komparatör pinleri iptal hepsi giriþ çýkýþ
OPTION_REG.7=1    \\\'Dahili pull-up lar pasif yapýldý
TRISA=%00000000
PORTA=0
TRISB=%00000010
PORTB=0
AL   VAR BYTE
TEMP VAR BYTE
US   VAR BIT
CLEAR
ON INTERRUPT GOTO KESME
PULSOUT PORTB.3,150
PORTB.3=0:PAUSE 15

START:
    IF AL=10 THEN  \\\'ileri
       PORTB.4=0:PORTB.6=0:PAUSE 20:PORTB.5=1
       PULSOUT PORTB.3,150
       PORTB.3=0:PAUSE 15   
    ENDIF
    IF AL=30 THEN  \\\'geri
       PORTB.4=0:PORTB.5=0:PAUSE 20:PORTB.6=1
       PULSOUT PORTB.3,150
       PORTB.3=0:PAUSE 15
    ENDIF   
    IF AL=135 THEN   \\\'sol
       PORTB.4=0:PORTB.5=0:PORTB.6=0
       PULSOUT PORTB.3,200
       PORTB.3=0:PAUSE 15
    ENDIF
    IF AL=163 THEN  \\\'sag
       PORTB.4=0:PORTB.5=0:PORTB.6=0
       PULSOUT PORTB.3,120
       PORTB.3=0:PAUSE 15
    ENDIF
    IF AL=70 THEN    \\\'durdur
       PORTB.4=0:PORTB.5=0:PORTB.6=0
       PULSOUT PORTB.3,150
       PORTB.3=0:PAUSE 15
    ENDIF   
    IF AL=125 THEN \\\'ileri sol normal
       PORTB.4=0:PORTB.6=0:PAUSE 20:PORTB.5=1
       PULSOUT PORTB.3,200
       PORTB.3=0:PAUSE 15
    ENDIF   
    IF AL=143 THEN  \\\'ileri sag normal
       PORTB.4=0:PORTB.6=0:PAUSE 20:PORTB.5=1
       PULSOUT PORTB.3,120
       PORTB.3=0:PAUSE 15
    ENDIF       
    IF AL=200 THEN \\\'geri sol
       PORTB.4=0:PORTB.5=0:PAUSE 20:PORTB.6=1
       PULSOUT PORTB.3,200
       PORTB.3=0:PAUSE 15
    ENDIF   
    IF AL=213 THEN \\\'geri sag
       PORTB.4=0:PORTB.5=0:PAUSE 20:PORTB.6=1
       PULSOUT PORTB.3,120
       PORTB.3=0:PAUSE 15
    ENDIF   
    goto START
DISABLE
KESME:
GIE=0
HSERIN  [WAIT(\\\"ARA\\\"),AL]
TEMP=RCREG
RCIF=0 
GIE=1   
RESUME                                                                                                                                                                                                                                                                                                                                 
ENABLE
    END
                                                                       
Yaşam anlamlandırıldıkça kutsaldır....

selvi

verici devresinde sorun olabilir dusuncesiyle verici devresini yeniden yaptim.16f873a entegresini degistirdim.baglantilarini yeniledim tumden .fakat devre calismiyor.simulasyonda calisiyor.simulasyonda calisip da gercekte calismamasi ne olabilir.program da eksik bir tanimlama ihtimali guclu gozukuyor.programi cok incelememe ragmen bir sey bulamadim.
Yaşam anlamlandırıldıkça kutsaldır....

ete

#8
Normalde programların ikiside doğru yalnızca şu \\\ işaretleri dışında nedir onlar hala anlamış değilim.
Zaten o işaretlerle birlikte derleme yapılamıyor elbette bir bildiğin vardır deyip üzerinde durmuyorum.
Haberleşme bir senkron işidir biliyorsun. Simulasyonda sorunsuz çalışıyor.
Ancak gerçek devrede alıcı programda yer alan pause komutlarının sorun yaratabileceğini düşünüyorum.
Zira USART ikaz verip bilgi geldi alman lazım dese bile senin pause komutunun işlenmesi bitmeden kesme etiketine gidilemez.
Bu nedenle o pause leri PAUSEUS olarak değiştir bence.

İkinci husus, şayet bu haberleşmeyi bir RF sistemi ile yapıyorsan haberleşme hızını 2400 Baud'a düşürmende yarar var.
Diğer bir konu da vericideki bir kaç satırlık HESEROUT  komutlarını tek satıra düşür. Gerek yok bir sürü satır vermene.
Yalnızca ilk satır yani preambl ve uyandırma ve altında bir adet VER komutu olsun. Diğerlerini kapatıver.

Bunun haricinde her iki programada ;
DEFINE OSC 4 
komutunu ilave ediver. Zaman bazlı komutların yer aldığı programlara ve hatta tüm programlara çalışma frekansını belirleyen komutu mutlaka eklemende yarar vardır.

Bunların dışında bir kusur göremedim. Normal şartlarda çalışması gerekir.
He riki ic de de USART haberleşme pinlerini kullanman gerekiyor. 873 de PortC.6 (TX) , 628 de PORTB.1 e (RX) bağlanacak .
873 de PORTC.7 (RX) , 628 de PORTB.2 ye (TX) bağlanacaktır.

Bana göre diğer bir sorunda verici tarafın aynı veriyi sürekli yollamasıdır. Bu yollama işi alıcıyı sürekli meşgul ediyor. Halbuki daha akıllıca bir mantık ile (işaret biti yada Flag kullanarak) bilgi değişmiş ise yollanmasında yarar var.
Örnek vermek gerekir ise ilk veri 163 ve bunu yolladın. Program aynı yere gelip yine yollanacak veri yi 163 buluyor ise yollamasın bu zaten bir önceki komutla yollandı. Halbuki yeni yollanacak veri 30 olmuş ise yollanması gerekir deyip yollanması lazım.
Bunun için Eski_Ver ve Ver isimli iki değişken kullanırsan ve veri yollandıktan sonra ESKI_VER=VER şeklinde bir tanımlama kullanırsan birinci aşamayı aşarsın.
Sonra yeni karşılaştırmalar bittiğinde yada veri yollama kısmına geldiğinde;
IF VER=ESKI_VER THEN RETURN  dersin olur biter.


Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

selvi

oncelikle bu isaretler \" /// \" programda yok.kodlari foruma yazarken bu sekiller cikiyor.belirtiginiz hususlari anladim.eklemeler yaptim.ama basla etiketinde sonra adc kisimlari var.adc den hemen sonra portb.3=1 yaptim ama portb.3=1 olmuyor.program buraya bile gelmiyor.adc lerden bir tanesini sildim olmadi.sonra adc ler tam sildim baktim yine portb.3=1 olmuyor.devre beslemesine baktim bazen lm2575 regule entegreisini cikis degeri 1.9v gosteriyor.entegreyi cikardim besleme degerlerine baktim.normal 5v gosteriyor.bazen her iki durumda da 5v gosteriyor.uyguladigim tedavileri kabul etmiyor.ilginc bir durum.cok karmasik bir durum olmamasina ragmen epey de ugrastiriyor.yani sorun vericide.ama nerde.cikan sonuclar bana epey ilginc geldi.
  hocam birde bu hserout kismi da tek satir ile iletiism olmuyor.ben duruma gore 2 veya 3 tane yaziyorum o zaman oluyor.normla usart kesmesinde tek satir yeterli olmasi gerekirken bir kac satir yaziyorum.bazen tedbir amacli 5 satir yaziyorum.
Yaşam anlamlandırıldıkça kutsaldır....

ete

Muhtemelen senin program kesme etiketinde takılıp kalıyordur.
Öncelikle yine HSEROUT komutlarını teke düşür. Fazlası sana faydalı gibi geliyor ama aslında zarar.
Aşağıdakini bir dene bakalım alıcı kısmında kesme de yer alan  Hserin komutunu aşağıdaki ile değiştiriver.
HSERIN,5,ATLA,  [WAIT("ARA"),AL]
ATLA:

Anlayacağın üzere komutu değiştirip hemen altındaki satıra ATLA isimli birde etiket ilave ediyorsun.
Sonucu bekliyorum.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

selvi

hocam bahsettiginiz degisikliklerden yapabildiklerimi ekledim.hem verici hemde alici icin.mevcut durumuyla araba ileri,geri,sag ve sol yapiyor.ornegin;araba ileri hereket halinde iken ayni anda sola komut verdigimde araba ya tekliyor yada duraklaya duraklaya hareket ediyor.birde genel olarak verici komut yolladiginda alici(araba) hemen almayabiliyor.vericide ayni bilginin surekli yollanmamasi icin bahsettiginiz kismi tam anlayamadigim icin programa ekleyemedim.eger mumkunse bu degisikligi nasil yapabilirim.(isaret biti yada flag) kismi vericide nasil olacak.(eski veri ,yeni veri konusu).alici kismina hserin,5,cik kismini ekledim.ama pause lari pauseus haline daha donusturmedim.onuda ekleyecegim.
verici:
@ DEVICE pic16F873A 'islemci 16F873A                                         
@ DEVICE pic16F873A, WDT_OFF 'Watch Dog timer kapali 
@ DEVICE pic16F873A, PWRT_ON 'Power on timer acik 
@ DEVICE pic16F873A, PROTECT_OFF 'Kod Protek kapali
@ DEVICE pic16F873A, XT_OSC '4 MHz kullaniliyor
@ DEVICE pic16F873A, LVP_OFF
@ DEVICE pic16F873A, BOD_OFF

PORTA=0:TRISA=%00000011 'AN0 VE AN1  kullaniliyor
PORTB=0:TRISB=%00000000
PORTC=0:TRISC=%00000000

ADCON1 =%10000100   '2 servo AN0,AN1,AN3  analog   giris

Define ADC_BITS 10
Define ADC_CLOCK 3
Define ADC_SAMPLEUS 100

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 25  ' 9600 baud @ 4mhz
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
 
OPTION_REG.7=1    'Dahili pull-up lar pasif yapildi 
CMCON=7

DEGER0 VAR WORD
DEGER1 VAR WORD
VER    VAR BYTE
CLEAR

BASLA:
     ADCIN 0,DEGER0
BAK1:  IF ADCON0.2=1 THEN BAK1 'Çevirme iþlemi tamamlanýnca Adcon0.2=0 olacak.
     ADCIN 1,DEGER1
BAK2:  IF ADCON0.2=1 THEN BAK2 'Çevirme iþlemi tamamlanýnca Adcon0.2=0 olacak.
     
   if DEGER0>400 AND DEGER0<600 and DEGER1>400 AND DEGER1<600 THEN  ' hareketsiz durum
      PORTC.3=1
   VER=70
   GOSUB GONDER
   ENDIF
   IF DEGER0>650  THEN  'sola hareket
      PORTC.3=1
   VER=135
   GOSUB GONDER
   ENDIF
   IF DEGER0<300 THEN  'saga hareket
      PORTC.3=1
   VER=163
   GOSUB GONDER
   ENDIF
   IF DEGER1>700 THEN  'geri hareket
       PORTC.3=1
   VER=30
   GOSUB GONDER
   ENDIF
    IF DEGER1<300 THEN 'ileri hareket
       PORTC.3=1
   VER=10
   GOSUB GONDER
   ENDIF
   IF DEGER0>650 and DEGER1<300 THEN 'sol-ileri
      PORTC.3=1
  VER=125
   GOSUB GONDER 
   ENDIF
   IF DEGER0>650 and DEGER1>650  THEN 'sol-geri
      PORTC.3=1
  VER=200  
   GOSUB GONDER  
   ENDIF
   IF DEGER0<300 AND DEGER1<300 THEN 'sag-ileri
      PORTC.3=1
   VER=143
   GOSUB GONDER 
   ENDIF
   IF DEGER0<300 AND DEGER1>650 THEN 'sag-geri
      PORTC.3=1
   VER=213
   GOSUB GONDER  
   ENDIF
   GOTO BASLA
GONDER:   
HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]'uyandirma sinyali preambl
HSEROUT ["A","R","A",VER]     
RETURN
   END


alici:
@ DEVICE pic16F628A 'islemci 16F628A 
@ DEVICE pic16F628A, WDT_OFF 'Watch Dog timer kapali 
@ DEVICE pic16F628A, PWRT_ON 'Power on timer acik 
@ DEVICE pic16F628A, PROTECT_OFF 'Code Protec kapali
@ DEVICE pic16F628A, MCLR_ON 'MCLR pini kullaniliyor. 
@ DEVICE pic16F628A, XT_OSC 'Dahili osilatör kullanilmayacak
@ DEVICE pic16F628A, LVP_OFF
@ DEVICE pic16F628A, BOD_OFF

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 25  ' 9600 baud @ 4mhz
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

SYMBOL GIE  =INTCON.7   'genel interruptlarý açiyor
SYMBOL PEIE =INTCON.6   'peripheral interruptlarý açiyor
SYMBOL RCIE =PIE1.5     'USART Recive interrupt enable bit
SYMBOL RCIF =PIR1.5     'USART Receive interrupt flag bit

RCIE=1: PEIE=1:GIE=1
 
CMCON=7           '16F628 de komparatör pinleri iptal hepsi giriþ çýkýþ
OPTION_REG.7=1    'Dahili pull-up lar pasif yapýldý
TRISA=%00000000
PORTA=0
TRISB=%00000010
PORTB=0
AL   VAR BYTE
TEMP VAR BYTE
US   VAR BIT
CLEAR
ON INTERRUPT GOTO KESME
PULSOUT PORTB.3,150
PORTB.3=0:PAUSE 15
START: 
    IF AL=10 THEN  'ileri
       PORTB.4=0:PORTB.6=0:PAUSE 20:PORTB.5=1
       PULSOUT PORTB.3,150
       PORTB.3=0:PAUSE 15    
    ENDIF
    IF AL=30 THEN  'geri
       PORTB.4=0:PORTB.5=0:PAUSE 20:PORTB.6=1
       PULSOUT PORTB.3,150
       PORTB.3=0:PAUSE 15
    ENDIF    
    IF AL=135 THEN   'sol
       PORTB.4=0:PORTB.5=0:PORTB.6=0
       PULSOUT PORTB.3,200
       PORTB.3=0:PAUSE 15
    ENDIF
    IF AL=163 THEN  'sag
       PORTB.4=0:PORTB.5=0:PORTB.6=0
       PULSOUT PORTB.3,120
       PORTB.3=0:PAUSE 15
    ENDIF
    IF AL=70 THEN    'durdur
       PORTB.4=0:PORTB.5=0:PORTB.6=0
       PULSOUT PORTB.3,150
       PORTB.3=0:PAUSE 15
    ENDIF   
    IF AL=125 THEN 'ileri sol 
       PORTB.4=0:PORTB.6=0:PAUSE 20:PORTB.5=1
       PULSOUT PORTB.3,200
       PORTB.3=0:PAUSE 15 
    ENDIF   
    IF AL=143 THEN  'ileri sag 
       PORTB.4=0:PORTB.6=0:PAUSE 20:PORTB.5=1
       PULSOUT PORTB.3,120
       PORTB.3=0:PAUSE 15 
    ENDIF    
    IF AL=200 THEN 'geri sol
       PORTB.4=0:PORTB.5=0:PAUSE 20:PORTB.6=1
       PULSOUT PORTB.3,200
       PORTB.3=0:PAUSE 15
    ENDIF    
    IF AL=213 THEN 'geri sag
       PORTB.4=0:PORTB.5=0:PAUSE 20:PORTB.6=1
       PULSOUT PORTB.3,120
       PORTB.3=0:PAUSE 15
    ENDIF   
    goto START
DISABLE
KESME:
GIE=0 'tüm interruptlari kapat yani INTCON.7=0
HSERIN,5,CIK,[WAIT("ARA"),AL]
TEMP=RCREG
CIK: 
RCIF=0  
GIE=1     'Yani INTCON.7=1 kesmeleri açtik.
RESUME                                                                                                                                                                   
ENABLE 
    END
                                                                       
Yaşam anlamlandırıldıkça kutsaldır....

ete

#12
Selvi,

Daha öncede söyledim. Bu programın bence Verici kısmı kusurlu. Neden dersen;
Her iki pot da orta noktalarda iken VER=70 değerini alıyor.
Ancak Pot-0'ı  değerini orta noktadan aşağı düşür ve Pot-1 değerinide orta noktadan yukarı alınca;
IF DEGER0<300 THEN  'saga hareket
      PORTC.3=1
     VER=163
    GOSUB GONDER
ENDIF

Komutları nedeni ile VER=163 oluyor ve bu değer hemen yolanıyor.
Bu işlemden sonra program bir alt satıra geçiyor ve orada;
IF DEGER1>700 THEN  'geri hareket
      PORTC.3=1
     VER=30
     GOSUB GONDER
ENDIF

komutlarını görerek VER=30 oluyor ve bu değeride hemen ardından yolluyor. Ancak senin alıcı daha henüz 163 değerini alıpda işleme koyamadı bile. Ama ardından hemen 30 değeri geliyor. Buda yetmezmiş gibi program bir alt satıra geçiyor devam ederek bir sonraki satır derken son kısma geliyor ve orada;
IF DEGER0<300 AND DEGER1>650 THEN 'sag-geri
     PORTC.3=1
    VER=213
    GOSUB GONDER 
ENDIF

komutlarını görerek VER=213 oluyor ve bu değerde yollanıyor.
Alıcıya arka arkaya 3 değer birden yollanmış oldu. Daha ilk değer icra edilirken ardından iki değer birden geldi ve alıcıda hali ile ne yapacağını şaşırmış oldu. Bence olayların ceryan ediş şekli böyle. Bütün bunları nerden anlıyorsun dersen. İsis de simule ederken hepsini görebiliyorum.
Yoksa her iki programı daha iyi çalışır hale getirdim. Verilecek veri tek sefer veriliyor ve alıcı boşuna meşgul edilmiyor.
Timeout süresin 3 ms ye düşürdüm sorunsuz çalışıyor. Pause ların bir kısmını kaldırdım bir kısmınıda US yaptım. Böylece sistemin cevap verme süresi epeyce artmış oldu.

Şimdi oturup düşünmen gerekiyor. Yada biraz daha detay ver birlikte düşünelim. Ortada iki pot var. Bu iki potun konumlarına göre ;
- Sola Hareket
- Sağa hareket
- İleri hareket
- Geri hareket
- Sola-İleri hareket
- Sağa ileri hareket
- Sola-Geri hareket
- Sağa-Geri hareket
Toplam 8 çeşit hareket emri yaratılmış oluyor. Buna bir itirazım yok. Ama bütün bu hareketleri verirken pot konumlarını ortak değerlendirmek lazım gelir. Bundan şunu anlatmaya çalışıyorum.  Program bir kere pot değerlerini okuyup değerlendirmeyi yaptığı zaman yalnızca tek hareketlik komutu vermesi gerekir. Bu hareket de yukarıda sıraladığımız 8 hareketden birisi olmalıdır.
Bir sonraki pot değerleri okumasında şayet değerler değişmiş ise yeniden bir başka hareket emri verilmelidir.
Halbuki sende bir pot okumasında 3 hareket emri arka arkaya veriliyor. Nedir bunlar;
- Önce VER=163 karşılığı olarak  SAĞA GIT emrini veriyorsun
- Hemen ardından  VER=30 karşılığı olarak  GERİ GIT emrini veriyorsun!!!!!! Sence mantıklımıdır bu?
- Hemen ardından VER=213 karşılığı olarak  SAĞA-GERİ GIT emrini veriyorsun. tabiiki bir öncekine bakarsan bu da mantıksız.
Şimdi bu komutlara bakarak asıl verilmesi gereken tek komutun en sondaki SAĞA GERI GIT komutu olduğunu ben kolaylıkla anlıyorum.
Ama sen buna karşılık 3 hareket komutu üretmiş oluyorsun. Kısaca mantığın kesinlikle hatalı bence. Bu hata da sistemin kesik kesik çalışmasına ve geç tepki vermesine sebep oluyor.
Bu sorunu aşman için belkide her test komutu sonuna eklediğin GOSUB GONDER komutlarını mevcut yerlerinden sil ve yalnızca tek bir GOSUB GONDER komutu olarak IF satırlarının en sonuna ve GOTO BASLA satırından bir evvel yerleştir ve bu şekilde çalıştır bakalım sonuç ne olacak. Ama diğer hareketlerde buda sorun yaratabilir. Bu nedenle en iyisi 8 hareketin durumuna karşılık potların alması gereken değerleri tespit edersen en doğrusunu yapmış olacaksın. Yani;
- Yalnızca ILERI-GIT  hareketi için her iki potun değer aralığı ne olmalıdır.
- YALNIZCA GERI-GIT hareketi için her iki potun değer aralığı ne olmalıdır
- YALNIZCA SOLA_ILERI GIT hareketi için potların değeri ne olmalıdır.
Bu mantıkla 8 hareket için potların değeri ne olmalıdır tespit edersen her bir çevrimde tek komut verilemsini sağlarsın.

Gelelim programlara , son hallerini aşağıda veriyorum.
Önce VERICI;
@ DEVICE pic16F873A 'islemci 16F873A                                         
@ DEVICE pic16F873A, WDT_OFF 'Watch Dog timer kapali
@ DEVICE pic16F873A, PWRT_ON 'Power on timer acik
@ DEVICE pic16F873A, PROTECT_OFF 'Kod Protek kapali
@ DEVICE pic16F873A, XT_OSC '4 MHz kullaniliyor
@ DEVICE pic16F873A, LVP_OFF
@ DEVICE pic16F873A, BOD_OFF

PORTA=0:TRISA=%00000011 'AN0 VE AN1  kullaniliyor
PORTB=0:TRISB=%00000000
PORTC=0:TRISC=%00000000

ADCON1 =%10000100   '2 servo AN0,AN1,AN3  analog   giris

Define ADC_BITS 10
Define ADC_CLOCK 3
Define ADC_SAMPLEUS 100

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 25  ' 9600 baud @ 4mhz
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
 
OPTION_REG.7=1    'Dahili pull-up lar pasif yapildi
CMCON=7

VER    VAR BYTE  56
ESKIVER VAR BYTE 57
DEGER0 VAR WORD  58
DEGER1 VAR WORD  60

PAUSE 300
CLEAR

BASLA:
     ADCIN 0,DEGER0
BAK1:  IF ADCON0.2=1 THEN BAK1 'Çevirme i?lemi tamamlany'nca Adcon0.2=0 olacak.
     ADCIN 1,DEGER1
BAK2:  IF ADCON0.2=1 THEN BAK2 'Çevirme i?lemi tamamlany'nca Adcon0.2=0 olacak.
     
   if DEGER0>400 AND DEGER0<600 and DEGER1>400 AND DEGER1<600 THEN  ' hareketsiz durum
      PORTC.3=1
   VER=70
   GOSUB GONDER
   ENDIF
   IF DEGER0>650  THEN  'sola hareket
      PORTC.3=1
   VER=135
   GOSUB GONDER
   ENDIF
   IF DEGER0<300 THEN  'saga hareket
      PORTC.3=1
   VER=163
   GOSUB GONDER
   ENDIF
   IF DEGER1>700 THEN  'geri hareket
       PORTC.3=1
   VER=30
   GOSUB GONDER
   ENDIF
    IF DEGER1<300 THEN 'ileri hareket
       PORTC.3=1
   VER=10
   GOSUB GONDER
   ENDIF
   IF DEGER0>650 and DEGER1<300 THEN 'sol-ileri
      PORTC.3=1
  VER=125
   GOSUB GONDER
   ENDIF
   IF DEGER0>650 and DEGER1>650  THEN 'sol-geri
      PORTC.3=1
  VER=200 
   GOSUB GONDER 
   ENDIF
   IF DEGER0<300 AND DEGER1<300 THEN 'sag-ileri
      PORTC.3=1
   VER=143
   GOSUB GONDER
   ENDIF
   IF DEGER0<300 AND DEGER1>650 THEN 'sag-geri
      PORTC.3=1
   VER=213
   GOSUB GONDER 
   ENDIF
   
   GOTO BASLA
GONDER:   
IF ESKIVER=VER THEN RETURN
HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]'uyandirma sinyali preambl
HSEROUT ["A","R","A",VER]  
ESKIVER=VER   
Pause 10
RETURN
   END


Şimdi de ALICI;
@ DEVICE pic16F628A 'islemci 16F628A
@ DEVICE pic16F628A, WDT_OFF 'Watch Dog timer kapali
@ DEVICE pic16F628A, PWRT_ON 'Power on timer acik
@ DEVICE pic16F628A, PROTECT_OFF 'Code Protec kapali
@ DEVICE pic16F628A, MCLR_ON 'MCLR pini kullaniliyor.
@ DEVICE pic16F628A, XT_OSC 'Dahili osilatör kullanilmayacak
@ DEVICE pic16F628A, LVP_OFF
@ DEVICE pic16F628A, BOD_OFF

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 25  ' 9600 baud @ 4mhz
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

SYMBOL GIE  =INTCON.7   'genel interruptlary' açiyor
SYMBOL PEIE =INTCON.6   'peripheral interruptlary' açiyor
SYMBOL RCIE =PIE1.5     'USART Recive interrupt enable bit
SYMBOL RCIF =PIR1.5     'USART Receive interrupt flag bit

CMCON=7           '16F628 de komparatör pinleri iptal hepsi giri? çy'ky'?
OPTION_REG.7=1    'Dahili pull-up lar pasif yapy'ldy'
TRISA=%00000000
PORTA=0
TRISB=%00000010
PORTB=0
AL   VAR BYTE  56
TEMP VAR BYTE
US   VAR BIT
PAUSE 200
CLEAR
ON INTERRUPT GOTO KESME
PULSOUT PORTB.3,150
PORTB.3=0:PAUSEUS 15
RCIE=1: PEIE=1:GIE=1

START:
    IF AL=10 THEN  'ileri
       PORTB.4=0:PORTB.6=0:PORTB.5=1
       PULSOUT PORTB.3,150
       PORTB.3=0:PAUSEUS 15   
    ENDIF
    IF AL=30 THEN  'geri
       PORTB.4=0:PORTB.5=0:PORTB.6=1
       PULSOUT PORTB.3,150
       PORTB.3=0:PAUSEUS 15
    ENDIF   
    IF AL=135 THEN   'sol
       PORTB.4=0:PORTB.5=0:PORTB.6=0
       PULSOUT PORTB.3,200
       PORTB.3=0:PAUSEUS 15
    ENDIF
    IF AL=163 THEN  'sag
       PORTB.4=0:PORTB.5=0:PORTB.6=0
       PULSOUT PORTB.3,120
       PORTB.3=0:PAUSEUS 15
    ENDIF
    IF AL=70 THEN    'durdur
       PORTB.4=0:PORTB.5=0:PORTB.6=0
       PULSOUT PORTB.3,150
       PORTB.3=0:PAUSEUS 15
    ENDIF   
    IF AL=125 THEN 'ileri sol
       PORTB.4=0:PORTB.6=0:PORTB.5=1
       PULSOUT PORTB.3,200
       PORTB.3=0:PAUSEUS 15
    ENDIF   
    IF AL=143 THEN  'ileri sag
       PORTB.4=0:PORTB.6=0:PORTB.5=1
       PULSOUT PORTB.3,120
       PORTB.3=0:PAUSEUS 15
    ENDIF   
    IF AL=200 THEN 'geri sol
       PORTB.4=0:PORTB.5=0:PORTB.6=1
       PULSOUT PORTB.3,200
       PORTB.3=0:PAUSEUS 15
    ENDIF   
    IF AL=213 THEN 'geri sag
       PORTB.4=0:PORTB.5=0:PORTB.6=1
       PULSOUT PORTB.3,120
       PORTB.3=0:PAUSEUS 15
    ENDIF   
    goto START
DISABLE
KESME:
GIE=0 'tüm interruptlari kapat yani INTCON.7=0
HSERIN,3,CIK,[WAIT("ARA"),AL]

CIK:
TEMP=RCREG
RCIF=0 
GIE=1     'Yani INTCON.7=1 kesmeleri açtik.
RESUME                                                                                                                                                                   
ENABLE
    END


Kodlara bakarak pot konumlarını tespit edebiliyorum. Benim mantığıma göre hareket şekilleri şöyle olmalı;
1- İleri Düz git
2- İleri Sağa Git
3- İleri Sola Git
4- Geri Düz Git
5- Geri Sola Git
6- Geri Sağa Git
Seninbelirlediklerinde yalnızca SOL hareketi var. AMa yürüme motoruna emir vermiyorsun.Bu anlamsız. Zira sola gitmenin bir diğer şartıda yürüme motoruna da emir verilmeli bu nedenle belirlediğim konumlar bana daha uygun geliyor. Buna birde stop konumu ilave edilmeli. Nedir bu potların orta konuma yakın olduğu (POT>300 and POT<700) konumda servo orta konuma alınmalı ve yürüme motoruda stop ettirilmelidir. İstersen bu mantığa uygun bir kod vereyim dene ne dersin?

Senden cevap gelinceye kadar vericiyi aşağıdaki şekilde yeniden düzenledim. Bunu bir dene istersen.
'****************************************************************
'*  Name    : SELVI_VER_ETE.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2011 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 28.02.2011                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@ DEVICE pic16F873A 'islemci 16F873A                                         
@ DEVICE pic16F873A, WDT_OFF 'Watch Dog timer kapali
@ DEVICE pic16F873A, PWRT_ON 'Power on timer acik
@ DEVICE pic16F873A, PROTECT_OFF 'Kod Protek kapali
@ DEVICE pic16F873A, XT_OSC '4 MHz kullaniliyor
@ DEVICE pic16F873A, LVP_OFF
@ DEVICE pic16F873A, BOD_OFF

PORTA=0:TRISA=%00000011 'AN0 VE AN1  kullaniliyor
PORTB=0:TRISB=%00000000
PORTC=0:TRISC=%00000000

ADCON1 =%10000100   '2 servo AN0,AN1,AN3  analog   giris

Define ADC_BITS 10
Define ADC_CLOCK 3
Define ADC_SAMPLEUS 100

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 25  ' 9600 baud @ 4mhz
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
 
OPTION_REG.7=1    'Dahili pull-up lar pasif yapildi
CMCON=7

VER    VAR BYTE  56
ESKIVER VAR BYTE 57
I VAR BYTE
POTA VAR WORD    'SAĞ-SOL
POTB VAR WORD    'ILERI-GERI
TOPLAM VAR WORD


PAUSE 300
CLEAR

BASLA:
     TOPLAM=0
     FOR I=0 to 19 
       ADCIN 0,POTA  ' SAĞ-SOL POTU
       TOPLAM=TOPLAM+POTA
       pauseus 5
     next
     POTA=TOPLAM/20
     
     TOPLAM=0
     FOR I=0 to 19
       ADCIN 1,POTB  'ILERI-GERI POTU
       TOPLAM=TOPLAM+POTB
       PAUSEUS 5
     NEXT
     POTB=TOPLAM/20
       
     VER=70  'DUR EMRI  
     IF POTA>300 and POTA<700 then  'SAĞ - SOL POTU ORTA KONUMDA ISE
        IF POTB>700 then VER=10  'İleri Düz git
        IF POTB<400 THEN VER=30  'Geri Düz Git
     ENDIF
     
     IF POTA>700 THEN  'SOLA     
        IF POTB>700 then VER=125   'SOLA-ILERI GIT
        IF POTB<400 THEN VER=200   'SOLA-GERI GIT
     ENDIF
     
     IF POTA<400 THEN  'SAĞA
        IF POTB>700 then VER=143   'SAĞA-ILERI GIT
        IF POTB<400 THEN VER=213   'SAĞA-GERI GIT
     ENDIF           
     GOSUB GONDER
     GOTO BASLA
GONDER:   
IF ESKIVER=VER THEN RETURN
HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]'uyandirma sinyali preambl
HSEROUT ["A","R","A",VER]  
ESKIVER=VER   
Pause 10
RETURN
   END

Kolay Gelsin
ETE
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

selvi

#13
 hocam cevap biraz gecikmeli oldu.ileri-geri ve sag-sol pot okumalarini ters vermistim.denerken fark ettim.onu duzelttim. verdiginiz programi denedim.tek hserout ile olmadi bende cift hserout kullandim.geri giderken sag-sol normal fakat ileri giderken sag-sol komutu verdigimde algilama ilkin oluyor kismi sag-sol yapiyor kendiliginde duzeliyor.yani ileri giderken sag-sol komutunu sureklilik olarak almiyor.
  diger bir yan; normalde ileri hiz kademesi 2 asamali(ileri,hizli ileri).geri tek asamali.bende sizin verdiginiz program uzerinde degisiklikler yaparak o ozelligide ekledim.fakat araba ileri giderken hizli ileri komutu verdigimde araba duruyor.bu konumda iken sag-sol yaptigimda hizli ileri gidiyor.ileri konumunda iken sag-sol surekli olarak algilamiyor.geride algiliyor.bazende geriye giderken sag-sol komutu vermedigim halde araba saga-sola kendiliginde donebiliyor.aliciya da ileri hizli kismini ekledim.vericideki son durum;
birde IF POTA<400 THEN  'SOLA bu kisim POTA<300 olmasi gerekmiyor mu?araba uzerinde bir farklilik gozlemleyedim.acaba yanlislikla mi 400 yazilmis yoksa bu deger daha uygun oldugu icin mi?
verici:
@ DEVICE pic16F873A 'islemci 16F873A                                         
@ DEVICE pic16F873A, WDT_OFF 'Watch Dog timer kapali
@ DEVICE pic16F873A, PWRT_ON 'Power on timer acik
@ DEVICE pic16F873A, PROTECT_OFF 'Kod Protek kapali
@ DEVICE pic16F873A, XT_OSC '4 MHz kullaniliyor
@ DEVICE pic16F873A, LVP_OFF
@ DEVICE pic16F873A, BOD_OFF

PORTA=0:TRISA=%00000011 'AN0 VE AN1  kullaniliyor
PORTB=0:TRISB=%00000000
PORTC=0:TRISC=%00000000

ADCON1 =%10000100   '2 servo AN0,AN1,AN3  analog   giris

Define ADC_BITS 10
Define ADC_CLOCK 3
Define ADC_SAMPLEUS 100

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 25  ' 9600 baud @ 4mhz
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
 
OPTION_REG.7=1    'Dahili pull-up lar pasif yapildi
CMCON=7

VER    VAR BYTE  56
ESKIVER VAR BYTE 57
I VAR BYTE
POTA VAR WORD    'SAÐ-SOL
POTB VAR WORD    'ILERI-GERI
TOPLAM VAR WORD


PAUSE 300
CLEAR

BASLA:
     TOPLAM=0
     FOR I=0 to 19
       ADCIN 0,POTA  ' SAÐ-SOL POTU
       TOPLAM=TOPLAM+POTA
       pauseus 5
     next
     POTA=TOPLAM/20
     
     TOPLAM=0
     FOR I=0 to 19
       ADCIN 1,POTB  'ILERI-GERI POTU
       TOPLAM=TOPLAM+POTB
       PAUSEUS 5
     NEXT
     POTB=TOPLAM/20  
     VER=70  'DUR EMRI 
     IF POTA>300 and POTA<700 then  'SAG - SOL POTU ORTA KONUMDA ISE  
        IF POTB>300 and POTB<400 then VER=10    'ileri Düz git
        IF POTB<300 THEN VER=20    'hizli ileri Duz git
        IF POTB>600 THEN VER=30    'Geri Düz Git
     ENDIF
     
     IF POTA<400 THEN  'SOLA    
        IF POTB>300 AND POTB<400 THEN  VER=125   'SOLA-ILERI GIT
        IF POTB<300 then VER=150    'SOLA ILERI HIZLI
        IF POTB>600 THEN VER=200    'SOLA-GERI GIT
     ENDIF
     
     IF POTA>700 THEN  'SAGA
        IF POTB>300 AND POTB<400 THEN  VER=143  'SAGA-ILERI GIT 
        IF POTB<300 then VER=173    'SAGA ILERI HIZLI
        IF POTB>600 THEN VER=213    'SAGA-GERI GIT
     ENDIF           
     GOSUB GONDER
     GOTO BASLA
GONDER:   
IF ESKIVER=VER THEN  RETURN
HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]'uyandirma sinyali preambl
HSEROUT ["A","R","A",VER] 
HSEROUT ["A","R","A",VER]
ESKIVER=VER   
Pause 10
RETURN
   END
Yaşam anlamlandırıldıkça kutsaldır....

ete

Bir çok şeyi tahmin yürüterek yapmıştım. Aradan 3  gün geçincede konsantrasyonum kayboldu. Neyi neden yaptığımı unuttum.
Ancak şunu hatırlıyorum. VER=70 değerini default olarak verdim ve hiç bir şeye basılmaz ise bu değeri versin istemiştim.
Devre senin elinde mantık yürütmeyide biliyorsun. Dolaysıyla işin geri kalanının halledersin diye düşünüyorum.

Hala tek Heserout ile neden çalışmadığını anlamış değilim. Sanki birincisi sistemi açıyor ikincisi alınmayı sağlıyor gibi.
Neyse çokda önemli değil 2 adet verirsin.
Pot değerlerini tespit ederken tamamen mantık hesabı yapmıştım. Pot tipi Joystickler vardır. Onlar gibi düşündüm.
Orta konumda sistemin durması  alt ve üst kısımlarda ise hareket verilmesi gerek diye düşünmüştüm. Baktım sende kimi komutda 300 kimde 350 kiminde 400 kullanmışsın. Bu bir standart pot ise değer limitleri aynı olması gerekir. Tabiiki elindeki mekaniği bilemiyorum. Ben yalnızca tahmin yürüterek o değerleri tespit etmiştim. Yanlış ise sen doğrularını yazabilirsin.

Hız kademesinin 2 li olmasını nasıl ayarlıyorsun tam olarak anlamadım. Aslında oturup bir tablo çıkarsan iyi olur. Ortada 2 adet pot olduğuna göre bu iki potun konumlarına göre motor + servo hareket almalı.

Ete

Bilgi hazinedir paylaştıkça büyür.            http://etepic.com