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

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

ete

Hiç bir yerde bir hata gözükmüyor. Olsa olsa işlemcinin OSCCAL parametresini silmiş olabilirsiniz.
Bu işlemcinin program hafızası son adresinde ($3FFF) işlemcinin dahili osilatörünün OSCCAL değeri fabrikasyon olarak yazılmıştır.
Programın başında yer alan   "DEFINE OSCCAL_1K 1 " komutu aslında OSCCAL değerini önce işlemciden okuyup sonra yüklenen programın son adresine yeniden yazarak tekrar aynı değerin işlemciye verilmesini sağlıyor. Bu komut olmaz ise işlemci OSCCAL değerini kaybediyor. Birde işlemciyi silmeye kalkışırsanız bu değer yine silinecektir. Bu nedenle silmeden üzerine program yazmaya çalışın.
Bu değer ile işlemci 4 Mhz lik frekansı tutturur. Değer silinirse işlemci alakasız bir frekansta çalışabilir. Aldığınız sonuca bakılırsa işlemci en az 3 kat hızlı çalışmaktadır.
Bir iki test yapalım. Birincisi OSCCAL değeri nedir onu okuyuın. Bunun için işlemci programlayıcıya takılıp READ komutu ile eprom ve program hafızası okunur ve program hafızasının son adresine bakılır. Orada  3FFF yazıyorsa değer silinmiştir. 3444-3824 yada benzeri bir şey yazıyorsa sorun yok demektir ama yinede test etmek lazım gelir. Şayet programlayıcınız varsa ve PicKit2 ise seçenekler arasında OSCCAL değerini otomatik buldurup yeniden işlemciye yazdırma seçeneği vardır. Onu çalıştırarak işlemciyi normal hale getirebilirsiniz.

İkinci testimizde ise SURE olarak ne hesaplanıyor bilmek isterim. Bunu sağlamak için Potu max değer getirin. Böylece ADC pinine 5V gelmesi gerekir. Bunun karşılığında işlemci HAM değer olarak 1023 okumalı ve SURE değeride 18.000 olarak hesaplanmalıdır.
Bakalım öylemi olacak. Aşağıdaki yalnızca BASLA satırından sonraki kısmı veriyorum. Baş taraf aynı olacaktır.
Bu programı derledikten sonra işlemciye yazın ve sistemi yeniden çalıştırın. Program ham değeri ve SURE değerini hesaplayıp eproma yazacaktır.  Program çalıştıktan sonra bir 10-15  sn bekleyin ve sistemi kapatıp işlemciyi tekrar programlayıcıya takarak READ komutu ile okuyun. Eprom değerlerini ekranda görmeniz lazım.
10  xx  yy
20  zz  vv

yani $10 nolu adres den itibaren 2 byte $20 nolu adresten itibaren 2 byte değerlerini bir yere not edip buraya mesaj olarak bildirimde bulunun. Ayrıca OSCCAL değerinide kontrol edip ne yazdığını söyleyin. SOnrasını birlikte düşünelim.
BASLA: 
     adcin 0, ham                       ' ADC KANALINI OKU
     Sure=((ham+1)*/4500)       ' SUREYI HESAPLA   0-3 DK
     GPIO.1=1                            ' LEDI YAK     
     WRITE $10,HAM.byte1,HAM.byte0
     WRITE $20,SURE.byte1,SURE.Byte0
     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

Anlayacağınız üzere aslında yalnızca 2 satır eproma yazdırma komutu ilave ettim. Onuda Pause 500 komut satırından evvel yazdım sonrasında Pause 500 gecikmesinden yararlanayım diye. Zira eproma yazdırmak için 10 ms lik bir pause ilave etmem gerekiyordu yerine zaten pause 500 olduğundan bir şey yazmak gerekmedi.

Ete

. Kağan

#31
Pic'i okuttum sorun yok gibi gözüküyor.


Ayroca Calbration'a tıkladığımda

değerlerini görüyorum.

Verdiğiniz düzeltmeyi derlemeyi denediğimde 2 satırda hata gözüküyor. Bu nedenle derleyemedim. Sizden düzeltme bekliyorum.


NOT: Ayrıca POT sonuna kadar çevrilince 4,94V değeri okunuyor.

ete

Hatalı satırlarda şayet sıfır yerine O harfi yazmadın ise sorun gözükmüyor. Byte0 ifadesinde "0" sıfır rakamıdır
KOmutu buraya yeniden yazıyorum.
WRITE $10, HAM.BYTE1 , HAM.BYTE0
WRITE $20, SURE.BYTE1 , SURE.BYTE0

Birde Şöyle deneyebilirsin.
WRITE $10,HAM
WRITE $20,SURE
bu şekilde de yazması gerekir.

Ete

. Kağan

#33
WRITE $10,HAM
WRITE $20,SURE


Şeklinde yazınca oldu. Aşağıda gördüğünüz gibi sonuna kadar açınca $20 de 94 gözüküyor fakat $10 boş gözüküyor. ???







ete

Beklentim 16 bitlik kayıt idi ama anlaşılan 8 bit kayıt yapmış sistem.
Bu nedenle komutun ilk halini bir şekilde kabul ettirmen gerekir.

Birde şöyle dene istersen

Write 16,HAM.byte1:pause 10
Write 17,HAM.byte0:pause 10
Write  32,SURE.Byte1:pause 10
Write 33,SURE.Byte0:pause 10

Ete

. Kağan

#35
Bunu kabul etti sonuç aşağıda;




ete

Tabiiki potun hangi konumunda bunu okuttun onu yazmamışsın. Ancak görünen şu ki ADC okuması sanırım 8 bit yapılıyor.
Bu nedenle programın tamamını buraya bir koyda yeniden bakalım ne eksikmiş.

Okunan ham değer 255 olmuş. Buna karşılık formülden hesaplanırsa süre 4500 bulunuyor zaten. Sonuçta 4500 çıkmış.
4500*10=45000 oda yaklaşık 45 saniye eder.

Ete

. Kağan

#37
'****************************************************************
'*  İ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 = %00010001  ' 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)*/4500)       ' SUREYI HESAPLA   0-3 DK
     GPIO.1=1                            ' LEDI YAK     
     Write 16,HAM.byte1:pause 10
     Write 17,HAM.byte0:pause 10
     Write  32,SURE.Byte1:pause 10
     Write 33,SURE.Byte0:pause 10
     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


Bu PIC 8 bit olarak geçiyor(12F675, 8-Pin, Flash-Based 8-Bit CMOS Microcontrollers). 16 bit kayıt yapabilir mi?

F®T

"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.


ete

Epromu yalnızca program ne yapıyor görmek için kullndık. Sürekli kayıt yapmayacak.
Normal çalıştırınca kaldıracağız o komutları.
Eprom un bir yazma ömrü vardır. 1.000.000 civarında yazma yapabilirsiniz. Okuma ömürden yemiyor.
Programı bu hali ile bırakırsak ortalama her 10 sn de bir kayıt yaptığını varsayarsak dakikada 6 kayıt yapacak demektir.
Saatte 60x6=360 kayıt, günde 24x360= 8.460 kayıt eder. Bunu 8500 kabul edersek kayıt ömrü ortalama 117 günde bitecek demektir.  Bu çok kısa bir süre değil bence.

Her neyse programında ADC işleminin kaç bit yapılacağını gösteren bir komut bulunmuyor.
Yine soruyorum neden sürekli programın orası ile burası ile oynuyorsun . Sana programın baş tarafının nasıl olması gerektiğini verdim ama sen yinede kafana göre takılmışsın yine.
Aşağıdaki komutlar olmadan bu ADC işlemi 8 bit çalışır. İşlemci 8 bit olabilir ama iki adres kullanarak 16 bitlik hatta 32 bitlik işlemleride yapabilir.

DEFINE ADC_BITS 10     ' ADCIN resolution  (Bits)
DEFINE ADC_CLOCK 1     ' ADC clock source  (Fosc/8)
DEFINE ADC_SAMPLEUS 11 ' ADC sampling time (uSec)

Bunlar veya benzeri değerler verdiğim program kısmında var idi. Ama ne hikmet ise sen bunları kaldırmışsın.
Bu konuyla ilgili son mesajımdır. Konu fazla uzadı burada konuyu bağlıyorum artık. Zaten işinde sonuna geldik sanırım.
Kolay gelsin.,
Ete

. Kağan

'****************************************************************
'*  İ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 
DEFINE ADC_BITS 10     ' ADCIN resolution  (Bits)
DEFINE ADC_CLOCK 1     ' ADC clock source  (Fosc/8)
DEFINE ADC_SAMPLEUS 11 ' ADC sampling time (uSec)

@ __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 = %00010001  ' 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)*/4500)       ' SUREYI HESAPLA   0-3 DK
     GPIO.1=1                            ' LEDI YAK     
     Write 16,HAM.byte1:pause 10
     Write 17,HAM.byte0:pause 10
     Write 32,SURE.Byte1:pause 10
     Write 33,SURE.Byte0:pause 10
     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


Kayıt sonrası read sonucu


Ayrıca
DEFINE ADC_BITS 10     ' ADCIN resolution  (Bits)
DEFINE ADC_CLOCK 1     ' ADC clock source  (Fosc/8)
DEFINE ADC_SAMPLEUS 11 ' ADC sampling time (uSec)

ekledikten sonra süre çooook uzadı. 80 mV da 2dk13sn bekliyor. Bu iş gittikçe garipleşti. Olmuyor.

Teşekkürler ETE.

ete

Bu konuyu en baştan tekrar okuyup verilenleri uygulasan olacak.
Bilip bilmeden programdan komut çıkarmaman gerekiyor. Soruyorum neden çıkardın diye cevap vermedin.
Elbette süren uzar. Ne demiştik? ADCON0 registerinin 7 nolu biti ADC okuma sonucunu sola yaslı yada sağa yazlı olarak ayarlar. Programda önceden ADCON0=%10000000 komutu var idi bu sonucu sağa yaslı olarak almanı sağlar Bu şu demek,
ADC=%0000001111111111   bu sayının karşılığı 1023 dür ve 10 bitlik okuma değeri 16 bitlik sayının sağ tarafına kaydırılmıştır (yaslanmıştır)
ADC=%1111111111000000   bu sayının karşılığı ise 65472 dir ve sayı sola yaslı şekildedir. Sende böyle okunuyor şu anda.
Bu nedenle programına  ADCON0=%10000000 komut satırını ilave etmen gerekiyor.
Hem sana programınbaş tarafı böyle olacak diye program parçası vermiştim neden akıl edipte onu programının başına yerleştirmiyorsun bunuda anlamış değilim doğrusu. Lütfen 2. sayfada verdiğim o programı al ve aynen programının baş tarafına yerleştir. Yada karşılaştır başka eksik var ise tamamla oradan.

Ete


. Kağan

Sevgili ETE,
Sabırla beni dinlediğin ve birebir uygulamalı olarak öğrettiğin için teşekkür ederim. Allah'ta senden razı olsun.
Sayende bilmediğim ve öğrenmek istediğim bir çok konuyu ve bu detayların önemini fark ederek öğrendim. Her ne kadar basit bir uygulama olsa bile, uygulamanın gerçekleştirilmesinin bir çok faktöre ve bilgiye bağlı olduğunu da gördüm. Tekrar teşekkürler.

Son düzeltmeyi de yaptıktan sonra program çok güzel çalıştı.

Not: Bir gün evcil hayvanınız bozulursa yada kalibrasyon gerekirse sabır ve zevkle sana ve forumdaki tüm arkadaşlara elimden geleni yapacağım. Benimde uzmanlık alanım bu. :)

kılıckaya

Sayın kaganayanoğlu, bugüne kadar tüm denemelerime rağmen 12f675'e yazılım atma konusunda başarılı olamadım.Bilmiyorum ; hata programlayıcımda mı yoksa deneme amaçlı kullandığım yazılımda mı. Siz hangi programlayıcıyı kullanıyorsunuz? Şu an tamamlamış olduğunuz ve kusursuz çalıştığını belirttiğiniz yazılımın ticari bir önemi yoksa ekler misiniz? Bir de sizin yazılımla deneyim. Teşekkürler.

Powered by EzPortal