12f675 ADC

Başlatan coco, 17 Eylül 2012, 15:26:23

coco

Konu Amaç: iki butona bağlı değişik değerdeki dirençler ile ADC kullanarak tek pin üzerinden 2 ayrı ledi birbirinden bağımsız yakıp söndürmek.

Aşağıdaki programla iki butona bağlı 1k. 4.7k dirençler birleşirilmiş  şekilde ADC girişi GP1 bağlandı.
Ledler Gp1 ve Gp4 bağlı.Düzgün çalıştıramadım konuya hakim arkadaşlardan yardımcı olmalarını bekliyorum.

proteus dosyası ile gerçek bağlantı birbirinden çok farklı çalışıyor o yüzden eklemedim  bu şekilde açıklama yaptım.

@   device  pic12F675,intrc_osc_noclkout, wdt_off, pwrt_on, mclr_off, protect_off,bod_off

DEFINE ADC_BITS 8
DEFINE ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 100
ANSEL = %00000000
DEFINE OSC 4       
DEFINE OSCCAL_1K 1

TRISIO = %00000100
IOC=%00000000
INTCON=%00000000
OPTION_REG=%00000000
ADCON0 = %00000000
'-------------------------------------------------------------------------------
BUTON   VAR   BYTE
'-------------------------------------------------------------------------------
BASLA:

GPIO.4=1
ADCIN 2,BUTON
IF BUTON >= 100 THEN
GPIO.4=0:PAUSE 500   'led

ENDIF

GPIO.1=1   
ADCIN 2,BUTON
IF BUTON >= 10  THEN
GPIO.1=0 :PAUSE 500      'led

ENDIF

GOTO BASLA
                                                       
END

OG

şemanı eklermisin
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

coco

Proteus dosyası ekde.Gerçeği ve proteusdaki çok farlı çalışıyorlar.

http://www.dosyasitesi.com/download.php?file=f90aa32a687559fab427bd77ee7102ca

OG

#3
GND bağlantısı yok,  Kod proton Sen PBP ya çevir,


instant image upload and sharing without account

Ayrıca programına da anlam veremedim, butonlara basmayınca 2 led de yanık, basınca birisi 500ms soner.

Device = 12F675
Config CPD_OFF,CP_ON, BODEN_OFF, MCLRE_OFF, PWRTE_ON, WDT_OFF, INTRC_OSC_NOCLKOUT
Set_OSCCAL
Declare Xtal 4
All_Digital = TRUE 

Declare Adin_Res 8      
Declare Adin_Tad FRC      
Declare Adin_Stime 50    

ANSEL.2 = 1    

TRISIO = %00000100
INTCON=0
OPTION_REG=%10001111   

Dim olculen As Byte
Dim LED_1 As GPIO.1 
Dim LED_2 As GPIO.4 


LED_1 = 0
LED_2 = 0


DelayMS 200
Clrwdt

''''''''''''''

Basla::
    Clrwdt

    olculen = ADIn 2
    
    
    GPIO.4 = 1
    If olculen > 75 And olculen < 86  Then
        GPIO.4 = 0
        DelayMS 500
        GoTo Basla
    EndIf 



    GPIO.1 = 1
    If olculen > 15 And olculen < 27  Then
        GPIO.1 = 0
        DelayMS 500
        GoTo Basla
    EndIf 


GoTo Basla
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

coco

#4
bunu bir deneyiniz.

http://f1209.hizliresim.com/11/k/d4f6w.jpg

mesaj birleştirme:: 17 Eylül 2012, 17:10:18

>GND bağlantısı yok
-Resmin sağındaki gnd değil mi?

>Ayrıca programına da anlam veremedim, butonlara basmayınca 2 led de yanık, basınca birisi 500ms soner.

-o kadar biliyorum ögrenmeye çalışıyorum.
Sağol

mehmet

Adc gerilim bölücü dirençlerin toleransları
etkiliyor olabilir. Diirençler üzerinde düşen
gerilim değerlerini voltmetre ile ölçüp
yeniden hesaplamalısın.
Bir de debounce olayı var, her ne kadar
adc olarak da kullansan buna dikkat etmelisin.
Proteusta herşey güllük gülistanlıktır.

Saygılar...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

coco

Og hocam sağol.Programınızdaki...

  "  If olculen > 75 And olculen < 86  Then " Kullandığımız direncin Ohm Veya kohm değerine göre 75 ve 86 değerlerini nasıl hesaplıyoruz?Mantığı nedir?

mehmet

#7
5V(besleme voltajın / 1023) = 0,0048875
oluşan 1 degerinin gerilimi budur.
Direnç üzerinden diyelimki 1,2V okudun;
if içinde hesaplayacağın değer:
1,2V x 0,0048875 =  245,24 => 246
1,2V / 0,0048875 =  245,24 => 246
240 ile 250 arasını kontrol edersin...

Saygılar...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

OG

Üstteki cevabe ilave, ben adc yi 8 bit çalıştırdım. Butona basın voltu okuyun, o voltu 8 bit üzerinden cevrim yapın, birkac değer aşağı, birkaç değer yukarı bir sınır tespit edin. O sınırlar içinde ise diye if şartını oluşturun. Çünkü değer birebir yakalanamaz.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

coco

1,2V x 0,0048875 =  245,24 => 246

bu değer çarpı ise sonuç 0.005865
bölü ise  245.5242966 çıkıyor.  çarpı mı bölü mü?

mehmet

Bir pot bagladığını düşün. Pot ortak ucu
Vcc ye giderken 10bit adc için 1023 değerine,
GND ye giderken de 0 değerine yaklaşır.
Pot orta noktada ise 512 değeri alınmış
olacaktır.
1,2V olarak verdigim deger yaklasık 1/4
değeridir. Buna göre 1023 / 4 ~= 255
benim çıkardığım değer de 246 idi.
"olculen" değişkeninde sorgulayacağın
aralık 240 ile 250 arası yeterli olacaktır...

Saygılar...

NOT: dediğin yerde bölüm yapılacak... düzeltiyorum şimdi...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

coco

og hocam programda butonun birine basılı tutulur iken diğer butona basılınca ledin ikisininde yanmamasını nasıl sağlarız?
şu anda yüksek kohm değerdeki butona ilk önce basılı tutup  sonra düşük kohm değerdeki butona basılı tutunca ikisi birden yanıyor.Tam tersi durumda Önce düşük sonra yüksek olunca herşey normal.

Maxim

bence önce tam adc değerlerini tespit etmek ve ondan sonra ona göre bir if li algoritma kurmak gerekiyor.

1. butona basınca adc ne ?
2. butona basınca adc ne ?
ikisi birden basılınca adc ne ?

sonra önce hangi butona basılmış onu bilmek lazım
tabiki bunu adc değerinden anlamak kolay

sonra her bir şartın içine ek olarak eğer 2. butonada basılırsa ne olacağı yazılması lazım

coco

evet  araya " if GPIO.1=1 THEN GPIO.4=0 " Buton basılı tutulurken diğer butona basınca led sönüp diğeri yanıyor.

OG

Maxim cevaplamış

Butonun ikisine basınca kaç volt okuyorsun ona bak, onun adc değerini bul, şartını koy.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.