12f675 ve 10k pot

Başlatan muyat, 19 Nisan 2016, 00:44:30

muyat

Sigorta ayarları

DEFINE OSC 4
DEFINE OSCCAL_1K 1                                       
DEFINE ADC_BITS 10
DEFINE ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 100

CMCON = 7 ' Comparators off
ANSEL = %0001100
ADCON0 = %10000000
trisio = %00011100
GPIO=0
WPU=0

Bir röleyi maksimum 5 saniye çektirmek istiyorum.Ve aşagıdaki gibi matematiksel hesaplarla formülize ettigimde formule göre potans sondayken 5 saniye çekmesi gerekirken röle 5 saniye çekmiyor.Elbette 2.koddaki pause 9 daki 9 degerini artırarak 5 saniye çektirebilirim fakat biraz hassas olmasını istiyorum.Pause degerini artırırsam hassasiyet bozulabilir.Ama bu hesaba göre neden röle 5 saniye çekmiyor???Yani maksimum 3-3.5 saniyede kalıyor gibi.Hatam varsa düzeltir misiniz?
5/1024=0,0048828125
bunuda 256 ile çarparsak 1,25
bunuda da 100 ile çarparsak 125 bulunur.
O halde

for say=1 to 10
ADCIN 2,DEGER
TOPLAM=TOPLAM+DEGER
NEXT SAY
ham=TOPLAM/10
TOPLAM=0
sure=(HAM+1)*/125
For I=0 to Sure
  pause 9
Next

ete

Programın tamamını koymamışsın. Özellikle değişken tanımlama kısmını göremiyorum hata orada bence.
Formül açıklaması şöyle olmalı idi,
5 sn=5000 ms eder.
Döngüde pause 10 kulkanacağımız için ( komut gecikmesi nedeni ile 9 kullandın sanırım)
5000/10=500
500/1024=0,48828125 bunu 256 ile çarpınca 125 değerini bulmuş olacağız.
Böylece formül. Sure=(ham+1)*/125. Şeklinde hesaplanacak. Ama süre değişkeni word tipinde olmalı.

Ete

muyat

Hocam programın tamamı aşagıdadır.İki adet potans var sistemde.
SURE değişkenini zaten dediginiz gibi tanımladım.Fakat pot sonda iken kronometre ile ölçtügümde maksimum süre olan 5 saniyeyi göremiyorum.Bu durumda hatam nerde ve ne yapmam gerekiyor?

@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON &_MCLRE_OFF & _CP_ON 

DEFINE OSC 4
DEFINE OSCCAL_1K 1                                       
DEFINE ADC_BITS 10
DEFINE ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 100

CMCON = 7 ' Comparators off
ANSEL = %0001100
ADCON0 = %10000000
trisio = %00011100
GPIO=0
WPU=0 

RL1 VAR GPIO.0
RL2 VAR GPIO.1
RL3 VAR GPIO.5

POTB VAR GPIO.2
GIRIS VAR GPIO.3
POTA VAR GPIO.4
SAY VAR BYTE
C VAR WORD
BAY VAR word
HAM var WORD
DEGER VAR WORD
SURE VAR word
TOPLAM VAR WORD
I VAR BYTE

GPIO=0

PAUSE 500

CLEAR




BAS:
IF GIRIS=0 THEN ANM
GOTO BAS


ANM:
pause 500
IF GIRIS=0 THEN ANM2
IF GIRIS=1 THEN BAS

ANM2:
pause 500
IF GIRIS=0 THEN BIR
IF GIRIS=1 THEN BAS

BIR:

GOSUB POTOKU

RL1=0
RL3=1
PAUSE 200
RL2=1

For I=0 to Sure
  pause 10
Next

RL2=0
RL1=0

BEKLE:
FOR c=0 to 200
IF GIRIS=0 THEN BEKLE
PAUSE 1
NEXT
IF GIRIS=1 THEN GOTO IKI
GOTO BEKLE


IKI:

GOSUB POTOKU2
RL2=0
RL3=1
PAUSE 200
RL1=1

For I=0 to Sure
  pause 9
Next

RL2=0
RL1=0
PAUSE 200
RL3=0
GOTO BAS


POTOKU:
for say=1 to 10
ADCIN 3,DEGER
TOPLAM=TOPLAM+DEGER
NEXT SAY

ham=TOPLAM/10
TOPLAM=0
sure=(HAM+1)*/125
RETURN

POTOKU2:
for say=1 to 10
ADCIN 2,DEGER
TOPLAM=TOPLAM+DEGER
NEXT SAY
ham=TOPLAM/10
TOPLAM=0
sure=(HAM+1)*/125
RETURN

END


ete

ADC ayarlamalarında bir sorun olabilir.
Normalde ,
DEFINE ADC_BITS 10     ' ADCIN resolution  (Bits)
DEFINE ADC_CLOCK 1     ' ADC clock source  (Fosc/8)
DEFINE ADC_SAMPLEUS 20 ' ADC sampling time (uSec)
şeklinde olmalıdır. Sen CLOCK değerini 3 vererek dahili OSC yi seçiyorsun. Fosc/8 veya Fosc/16 bu frekans için uygun değerler.
Bu işlemci 4 Mhz için 19,72ms de dahili kondansatörü şarj etmektedir. bu nedenle 20us yeterlidir. Sen buraya gereksiz 100us vermişsin. Sonucu pek etkilemez ama doğrusu bu.

Ansel değerin yanlış yada eksik. 7 bit olarak vermişsin değerler kime ait belli olmuyor. Doğrusu ANSEL  = %00010100 şeklinde olmalı.

Bu şekilde bir dene. Sonucu bildir. Son bir şey daha aklıma geldi. Şayet OSCCON değerin silinmiş ise işlemci yavaş çalışıyor olabilir. Hex'i arayüze yükledikten sonra son program adresine bir bak orada 3FFF gibi bir değer görürsen OSCCON değerin silinmiş demektir. Zaten arayüz OSCCON eksik yad ayanlış gibi bir hata vermesi gerekir.

Ete



muyat

ANSEL  = %00010100 yazmışsınız.
Burda özellikle şunu sormak istiyorum. ANSEL registerinin hangi biti analog ise onu 1 yapcagımıza göre sizin yazdıgınız bu ifadeden ben AN2 ve AN4'e ait pinlerin 1 olcagını yani analog olcagını anlıyorum.

Halbuki benım yazdıgım kodlarda AN2(GPIO.2) ve AN3(GPIO.4)  analog olcagına göre   dogrusu "ANSEL  = %00001100 " olması gerekmiyor mu hocam?? Yani ansel komutunda = işaretinin sagındaki kısma 0 ve 1 tayini ederken ilgili pinin veya pinlerin GPIO degerine karşılık gelen sayısına  degilde AN'degerine karşılık gelen sayısına bakarak 0 ve 1 vermemiz gerekmiyor mu?Yoksa ben mi yanlış biliyorum

Yazılımı ögleden sonra deneyip sonucu buraya yazacagım

ete

Bit7 hiç bir şey yapmıyor sıfır olmalı. Sonraki 3 bit ise ADC CLK seçimi yapıyor. Bu işlemcide yalnızca 4 adet analog kanal olduğu düşünülürse gerikaln 4 bitin bunu kolaylıkla yapması normal.
Kısaca %0CCCAAAA şeklinde göstermek lazım Ansel registerini. CCC olanlar ADC _CLK select bitleri.
000=Fosc/2
001=Fosc/8
010=Fosc/32
011=RC
100=Fosc/4
101=Fosc/16
110=Fosc/64.
Data sheet ayrıca hangi frekanslarda hangi seçimin yapılması gerektiğini bir tablo halinde vermiş (Tablo 7-1). O tabloya bakarsan 4 Mhz için açık renk alanlardan Fosc/8 ve Fosc/16 ve RC yi önermiş. Ama RC için bir dipnot düşmüş ve demişki,
Frekans1 Mhz den büyük ise RC yi yalnızca Sleep anında kullanın.
Bu durumda en iyi seçenek ya Fosc/8 yada Fosc/16 oluyor ve ben Fosc/8'i tercih ettim. 7. bit 0 olacak %0, seçime ait bit değerleri 001 olduğu için değerimiz %0001 oldu. Sonrasında elimizde 4 bitlik kanal seçme biti var. %0000 şeklinde ;
%0001 = AN0 analog
%0010 = An1 analog
%0100 = AN2 analog
%1000 = An3 Analog.
Bize An2 analog lazım ve  diğerleri digital olacağı için %00010100 değeri doğru olmaktadır.

Ete

muyat

Erol hocam sorunu çözdüm
Öncelikle sistemde an2 ve an3 analog olcagı için;
ANSEL = %00011100 bu tamam.
Fakat sorunun ana nedeni
I VAR BYTE
yerine 
I VAR WORD
olarak düzeltildiginde program sureyi ayarlayıp 9 defa saydırınca pot sonda iken sistem hesap ettigimiz gibi çalışıyor.
Ama I degişkenini byte olarak tanımladıgımda ise pot sonda iken 2,5-3 saniye falan röle çekili kalıyor.
I değişkeni maksimum 255 degerini alacagına göre ve ben 255 bile saydırmadıgım halde neden byte olarak tanımladıgımda böyle bir sorun oluyor veya neden word olarak tanımlamam gerekiyor??Neticede 9 defa saydırıyorum

ete

Tespitin doğru Sure değişkeninin Word olması gerekir diye ikazda bulundum ama I değişkenininde benzer şekilde WOrd olması gerekir. Sebebi basit,
SURE=(HAM+1)*/125 formülünde HAM=1023 yani maksimum değerde iken hesap sonucu 500 çıkar. 500 rakamı 255 den büyüktür ve I değişkeninin bunu yapabilmesi için WORD olması gerekir.

Ete

Powered by EzPortal