12f675 ile analog girişe bağlanan 10k lık bir potansiyometre

Başlatan . Kağan, 23 Kasım 2013, 18:17:32

. Kağan

Alıntı YapZAMAN:
For I=0 to sure      ' "0" DAN SUREYE KADAR SAY
     Pause 8              ' 8 ms bekle
Next

burada "next" komutu "for" komutunamı geri dönüyor? "Next" tam olarak ne yap demek?

Bir örnekte
Alıntı YapFOR i=Start TO End Task
NEXT i      Start değerinden End değerine kadar i'yi birer birer arttırarak Task'i uygular.

yazıyor.
Alıntı YapZAMAN:
For I=0 to sure      ' "0" DAN SUREYE KADAR SAY
     Pause 8              ' 8 ms bekle
     Next
yazılması "ZAMAN"ın pot ile ayarlanan süresini bildirmek için mi yazılıyor. "For" ile birlikte kullanımı bir kalıp mı?

mg1980

Komut kalıbı      ''  FOR........................NEXT  ''tir.Bunların açıklaması Ete hocamın notlarında var .Onları biraz incelerseniz daha kolay anlarsınız.Orada örnek de olması lazım.

ete

Tamam anlaşıldı for...next komutunun işlevini bilmiyorsun demekki ö
For I=A to B
   Pause 10
Next
Şeklinde bir komut dizilimi yaptığın zaman , program A sayısından (sıfır yada bir başka sayı olabilir) B sayısına kadar tek tek komutu çalıştırır. Komut olarak pause 10 vermiş isek , A=0 ve B=100 ise
100 defa pause 10 komutu çalıştırılır. Bunun anlamı 10*100=1000 ms lik gecikme elde edersin.
For next döngüsü ara komut vermeksizin yalnızca for..next komutu olarak çalışırsa program yine döngü adedi kadar sayar. Her bir saymanın komut bazında ayrı bir gecikmesi vardır. Sonuçta o kadarlık bir gecikme elde edersin.
Örneğin For I=0 to 5000
Next
Şeklinde bir komut verirsen program bu satırlara geldiğinde 5000 ne kadar sayar yalnızca. Bu da sonuçta bir kaç ms lik gecikmeye eşdeğerdir.
Programına geri dönersek, sana 180 sn lik maksimum gecikme lazım. Komut olarak verebileceğin maksimum gecikme 65535 ms dir. 180 sn ise 180.000 ms eder. Nasıl sağlarsın bu kadar gecikmeyi?
Tabiiki döngüsel gecikme ile
180000/10=18.000 eder ve bu word ile saklanacak bir büklüktür bunu kullandık.
ForI=0 to Sure
Pause 10. (Yerine 8 yazdık komut gecikmelerini kompanse etsin diye)
Next
Şeklindeki komut sana 18.000x10=180.000 ms lik gecikme sağlayacaktır
Umarım bu sefer anlamışsındır.
Ete

. Kağan

#18
İşte bu sefer anladım çok teşekkür ederim. Bende öğrencilerimden öğrenmek isteyenlere sizin gibi anlatırım. :) İnanın çok açıklayıcı oldu ve bir kalıbı  daha öğrenmiş oldum. "for" ve "next" kelimelerini kelime anlamları ile tek tek değerlendirmeye çalıştığım için kısır döngü içine girmiş kafamda :) .

. Kağan

#19
Merhaba ETE.
Devreyi breadboard üzerine kurdum. Fakat 10K pot. ile ayar yapamıyorum. 2-2.5 dk. arasında yanık ve sönük kalıyor. Siz demişsiniz ki
Alıntı YapKanaldan sıfır değerini okursak yani minimum değer yanma süresi 5 sn , kanaldan 1023 okunduğu zaman ise 180 sn yanma süresi olacaktır.
Burada 1023 değeri nereden geliyor. Yani POT değeri değiştikçe 20K,50K vs. oldukça bu değer nasıl değişir. Birde POT sonuna kadar açıkken GPIO.1 den +5v giriyor. 1023 değeri bu 5v'mu temsil ediyor. Yoksa POT kısa devre iken 1V'mu girmeli.

F®T

1023 =5 volt = 10 bit adc okuması

pot 5k olur 10 k olur farketmez.pot yan ucuna şase diğer yan ucuna artı 5 volt verilir.orta uç ise pic adc okuma ucuna verilir.burda sizin minimum 0 v maximum 5 volt ayar yapma şansınız var bu voltajı pic adc girişine verirseniz adc okumasında minimumda 0 değeri maximumda 1023 değerini elde edersiniz.

ete hocam sure=((ham+1)*4375+500) burda sonuç word değerini aşmıyormu?
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

. Kağan

POT bağlantısı aynen söylediğin gibi.

Şöyle bir deneme yaptım. GPIO.0 ucunu 1K direnç ile pull down yaptım. 38 sn. yanıyor, 38 sn. sönüyor. Niçin böyle oldu? :o

ete

Çünki formül eksik yazılmış Benim hatam kusura bakma.
sure=((ham+1)*4375+500) şeklinde değil  sure=((ham+1)*/4375+500) şeklinde olacak.
Ben seninkod üzerinde düzelttim. Programı bu şekilde yap düzelecektir.

Ete

. Kağan

Alıntı Yapsure=((ham+1)*/4375+500)

formülde */ (çarpı ve bölü yanyanamı yani)  ???

. Kağan

Alıntı Yap'****************************************************************
'*  İsim      : Program Adı.BAS                                  *
'*  Yazar     : [KAGANAYANOGLU]                                  *
'*  Not       : Copyright (c) 2004]                              *
'*            : Tüm Hakları Saklıdır                             *
'*  Tarih     : 25.11.2013                                       *
'*  Sürüm     : 1.001                                            *
'*  Notlar    : *                                                *
'****************************************************************
Define OSCCAL_1K 1  ' Calibrate internal oscillator 
@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _CP_OFF

REM PORTLARIN TANIMLARI
LED Con 1     ' DEGISTIR, GPIO.1 to LED  UYARI CIKISI
'****************************************************************
REM DEGISKENLER
ham var WORD
sure var WORD
I VAR WORD 
'****************************************************************
REM AYAR ISLEMLERI
ANSEL = 0          ' Set all digital 
CMCON = 7          ' Analog comparators off 
TRISIO=%00000001 : ' GIRIŞ VEYA CIKIS AYARLAMA
REM     GPI43210   ' Port sırası
'****************************************************************                 
GPIO.0=0
GPIO.1=1
PAUSE 200

BASLA:
     adcin 0, ham               ' ADC KANALINI OKU
     Sure=((ham+1)*/4375+500)   ' SÜREYİ HESAPLA
     GPIO.1=1                   ' LEDİ YAK
     PAUSE 500                  ' 0,5 sn. BEKLE
     GPIO.1=0                   ' LEDİ SONDUR
     Gosub zaman                ' ZAMAN ETIKETINE GIT
     Goto basla

ZAMAN:
For I=0 to sure      ' "0" DAN sure'YE KADAR SAY
     Pause 9         ' SAYDIĞIN SAYININ 9 ms KATI KADAR bekle
Next
Return
END

Bu kod çalıştı. Ama, minimum 4,7 sn maksimum 43 sn ayarlanabiliyor. 3 dk (180 sn) ulaşmadan LED çakıyor.

ete

Pause 9'u 10 yap sende
Öyle hassas bir saat süreside bekleme lütfen. Hassas istiyor isen ya kesme yolu ile saat sinyali elde etmek lazım yada RTC (Saat entegresi Mesela DS1307) kullanmak lazım.

*/ bir çarpma operatörüdür. 32 bit çarpma yapar ve sonucu 256 ya bölünmüş olarak verir. Bu nedenle sabit çarpan hesabında 256 ile önceden çarptık. Sonuçta 256 ya bölündüğü için eşitlik bozulmamış oldu.

Anlayamadığım bir şey var,
Başlangıçta Led ayarlanan süre kadar yanık kalsın ayarlanan süre kadar da sönük kalsın demiştin. Yanlışmı hatırlıyorum.
Peki neden yazdığım doğru kodu sürekli değiştirme ihtiyacı duyuyorsun?
GPIO.1=1                   ' LEDİ YAK
     PAUSE 500
burada led yandıktan yarım saniye sonra hemen sönüyor ve pot ile ayarlanan süre kadar sönük kalıyor. Asıl istediğin bumudur?
Benim söylediğim ise Pause 500 yerine yine Gosub Zaman yazman gerekir.

Programın baş kısmında yer alması gereken bazı komutlarıda yeniden silmişsin. ANSEL=0 demişsin ama programda POT kullanıyorsun. Bunları neden yapıyorsun çok merak ettim !!!!.
Her neyse vardır bir bildiğin her halde. Ben yinede programınbaş tarafını BASLA satırına kadar olan kısmı yeniden vereyim.
@ device pic12F675 & WDT_OFF & PWRT_ON & PROTECT_OFF & MCLR_OFF & INTRC_OSC_NOCLKOUT  

DEFINE OSCCAL_1K 1 
DEFINE OSC 4
DEFINE ADC_BITS    10                 'A/D  çevirim sonucu kaç bit olacak
DEFINE ADC_CLOC   3                   'Clock  kaynağı (3=rc)
DEFINE ADC_SAMPLEUS  100 

CMCON = 7
ANSEL = %00010001
ADCON0=%10000000
GPIO=0
TRISIO=%00001001
WPU=0

REM PORTLARIN TANIMLARI
LED Con 1     ' DEGISTIR, GPIO.1 to LED  UYARI CIKISI
'****************************************************************
REM DEGISKENLER
ham var WORD
sure var WORD
I VAR WORD
               
GPIO.0=0
GPIO.1=1
PAUSE 200

Ete

. Kağan

Alıntı YapGPIO.1=1                   ' LEDİ YAK
     PAUSE 500
burada led yandıktan yarım saniye sonra hemen sönüyor ve pot ile ayarlanan süre kadar sönük kalıyor. Asıl istediğin bumudur?
evet asıl istediğim bu. Hep aynı sürede (ayarlanan süre) LED'in çakmasını istiyorum. Ansel=0 yanlışlıkla olmuş.
Süre olarak belli bir rakama ulaşmak istemiyorum. Pot ile belirlenen sürede tekrar LED çakmasını istiyorum. Sanki süresi ayarlanan bir flaşör gibi.

. Kağan

#27
Birde şunu sormak istiyorum. 675'de ANSEL registerinin önemli ve özel olduğunu okudum.

ANSEL = %00010011
ANSEL = %00010001
ANSEL = %00100001

arasında ne fark vardır. GPIO.0 analog yapmak için hangisi yazılmalı. Datasheet'de ANSEL kodu göremedim. Çok soruyorum, hoşgörün.

Birde niçin 47-48 sn den daha fazla bekletemiyorum?

TEŞEKKÜRLER.

ete

Data sheet 46 cı sayfada ANSEL register parametreleri verilmiş. Bulamazsanız aratmayı seçin ve REGISTER 7-2  yazıp aratın.
İlk bulduğunuz değil İkinci bulduğunuz aradığınız olacaktır.

Bu registerin 7. nolu biti işe yaramıyor. Her zaman "0" olacaktır.
6-4 bitleri A/D çevirici CLK seçme bitleri oluyor. Register parametrelerinde bunlar verilmiş.
%000 olursa  Fosc/2 
%001 olursa Fosc/8
şeklinde sıralanmış.

Registerin 3-0 arası bitleri analog pin seçme bitleridir. 3-0 arasında 4 adet pin bulunur.  3 nolu bit 1 olursa GPIO.3=analog, sıfır olursa GPIO.3=Digital pin olarak çalışır.
2 nolu bit 1 olursa GPIO.2=Analog, sıfır olursa digital olarak çalışır. Aynı mantıkla GPIO.1 ve GPIO.0 pinlerinin seçimide yapılır.
Bu durumda registerin %0000xxxx şeklinde x ile gösterilen bitleri Analog pin seçme bitleri olmaktadır. 0000 şeklinde gösterilen bitlerin sağdaki 3 adedi ise ADC işleminde CLK seçme bitleri olarak işlem görür.
Sorunuzun cevabı için GPIO.0 pini analog olması için ANSEL.0=1 şeklinde komut verilmesi yeterlidir. Yada ANSEL=%00000001
şeklinde bir komut verilmesi de aynı işi görür. Bu ikincisinde CLK seçme bitleri %000 verilerek F/2 Osc seçilmiş olur. Siz yinede F/8 seçmeye çalışın. Bunun için ANSEL=%0001001 şeklinde komut vermeniz yeterli olacaktır.

Ete

. Kağan

BASLA: 
     adcin 0, ham                       ' ADC KANALINI OKU
     Sure=((ham+1)*/4500)       ' SUREYI HESAPLA   0-3 DK
     GPIO.1=1                            ' LEDI YAK
     PAUSE 500                          ' 0,5 sn. BEKLE
     GPIO.1=0                            ' LEDI SONDUR
     Gosub zaman                     ' ZAMAN ETIKETINE GIT
     Goto basla

ZAMAN:
For I=0 to sure      ' "0" DAN sure'YE KADAR SAY
     Pause 11          ' SAYDIGIN SAYININ 11 ms KATI KADAR bekle
Next
Return
END

Şeklinde yapılan düzenlemede her 1V=10 sn bekletiyor. 4,9v civarı 47-48 sn bekletiyor. Bu formül doğru gözüküyor ama niçin yapması gerekeni yapmıyor?

Powered by EzPortal