16F88 İLE 5 VOLTA KADAR VOLTAJ ÖLÇMEK

Başlatan . Kağan, 28 Mayıs 2014, 20:15:35

. Kağan

Arkadaşlar merhaba;

16f88 ile, 5 volta kadar olan voltajı 5 voltu 1024 olarak kabul edip oransal olarak ölçmek istiyorum fakat aşağıda verdiğim programda voltaj mv bile olsa 1024 çıkıyor yardım edermisiniz.

@ __config _CONFIG1, _INTRC_IO & _WDT_ON & _LVP_OFF & _CP_OFF & _MCLR_OFF & _PWRTE_ON  & _WRT_PROTECT_OFF 

DEFINE OSC 4
DEFINE ADC_BITS 10      ' ADCIN resolution  (Bits)   
DEFINE ADC_CLOCK 3      ' ADC clock source  (Fosc/8)   
DEFINE ADC_SAMPLEUS 20  ' ADC sampling time (uSec)

ANSEL  = %00100000  ' AN5 ANALOG, DİĞERLERİ DİJİTAL, 
'ANSEL = 0
ADCON1 = %10100000  ' 1024 (10 BİT) hesaplanacak, (VREF+ vref+) (VREF-AVSS)
'ADCON0 = %11101101  ' internal A/D module RC oscillator,  11000000
OSCCON = %01101110  ' İNTERNAL OSİLATÖRÜ 4mhz' E AYARLA
   
CMCON  = 7           ' KOMPARATÖRLER KAPALI   
TRISA  = %00000000   ' RA tamamı ÇIKIŞ   
TRISB  = %00100000   ' RB5 GİRİŞ
PORTA  = 0           ' PORTA SIFIRA ÇEK   
PORTB  = 0           ' PORTB SIFIRA ÇEK                                               
'****************HPWM PRESETİNG*********************

Pause 100 ' 100 ms AÇILIŞ GECİKMESİ

DEFINE LCD_DREG PORTA      'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT 0          'LCD data bacakları hangi bitten başlıyor? ***
DEFINE LCD_RSREG PORTB     'LCD RS Bacağı Hangi Porta bağlı ?         
DEFINE LCD_RSBIT 1         'LCD RS bacağı Hangi Bite bağlı ?        4 ***
DEFINE LCD_EREG PORTB      'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT 2          'LCD Enable Bacağı Hangi bite bağlı ?    5
DEFINE LCD_BITS 4          'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES 2


OLCUM VAR WORD
ORTALAMA VAR WORD
I VAR BYTE
ILK VAR WORD

pause 100

ortalama = 0
i = 0
ILK=0
OLCUM=0


ANA:
 
    FOR I = 0 TO 24         
      ADCIN 5 , OLCUM   
      ORTALAMA = ORTALAMA + OLCUM
    NEXT I
      OLCUM = ORTALAMA/25
               

  LCDOUT $FE,1
  PAUSE 23
  LCDOUT $FE,$80, "SNC: "         
  LCDOUT $FE,$84, DEC4 olcum       
  PAUSE 23

GOTO ANA

ete

Hata -1 ; ADCON1 registerine yanlış değer verilmiş.
Şayet besleme voltajı aynı zamanda ref voltajı olacak ise ADCON1=%10000000  değeri verilmesi gerekir.

Hata-2 ; Her ne kadar AN5 pini giriş olarak ayarlanacak isede bu PORTB.6 pini olduğundan TRISB=%00100000 yerine TRISB=%010000000 şeklinde değer verilmelidir.

Hata-3; Ortalama alma işlemine başlamadan bütün ölçümlerin toplanacağı değişkenin sıfırlanması gerekir. Aksi halde değer taşması meydana gelir ve hesaplanan değer yanlış olur. Bu nedenle ADC okuma döngüsünün başına;
ORTALAMA=0 komut satırının koyulması gerekir.

Buraya kadar ana hataları açıklamış oldum. İlave olarak programın çalışmasını etkilemeyen ancak bence yine bir kusur olan ;
'  LCDOUT $FE,1  komut satırının her ekran gösteriminden evvel kullanılmasıdır. Bu komut her gösterimden evvel ekranı sileceği için sürekli olarak görüntüde bir kırpışma görülür. Halbuki ekranda zaten DEC4 kullanıldığı için değişen değer gösterilmekte olup hep aynı yere yazıldığı için bütün ekranın silinmesi gerekmiyor. Böylece bu satırı silerseniz titreşimsiz bir görüntü sağlamış olursunuz.

Ete

. Kağan


muyat

Konuyla ilgili oldugu için ayrı bir konu açmak istemedim
1-)16f88 de kod koruma _cpd_on şeklinde midir?_CP_on yazınca hata veriyor.
2-12volt gerilimi dirençle bölerek 5 voltla pice giriş yaparak okunan gerilime göre işlem yaptırmak yani röle istiyorum.Örnegin aşagıda gerilim 2,5volt olursa röle çeksin istiyorum
Ve son olarak  ADCON0 VE ADCIN1 'e verilmesi gereken degerleri ilgili işlemcinin datasheetindeki ilgili sayfaya bakarak nasıl veriyoruz.O kısmı da anlamadım.Kodlarım ve 16f88in adcon1 ve adcon0 ile ilgili sayfası aşagıdaki gibidir.
Örnegin
ADCON1=%10000000
ADCON0 = %11101101  bu iki kod aşagıdaki resime göre yorumlanıp nasıl belirleniyor.AN2 analog olarak gösterdim bu arada



@ __config _CONFIG1, _INTRC_IO & _WDT_ON & _LVP_OFF & _CPD_ON

CMCON=7      'komparatörler kapalı
DEFINE OSC 4

DEFINE ADC_BITS 10
DEFINE ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 50
ANSEL  = %00000100  ' AN2 ANALOG, DİĞERLERİ DİJİTAL,
OPTION_REG.7=0
ADCON1=%10000000
ADCON0 = %11101101  ' internal A/D module RC oscillator         
OSCCON=%01101110        'İNTERNAL OSİLATÖRÜ 4mhz' E AYARLA
TRISA=%11111101         '
TRISB=%11000000


SYMBOL ROLE=PORTB.1


PORTB=0
PORTA=0
VOLT VAR BYTE
SONUC VAR WORD
SAY VAR BYTE
DEGER var WORD
ORTALAMA VAR WORD
TOPLAM VAR WORD


CLEAR

BASLA:

TOPLAM=0
for say=1 to 10
ADCIN 2,DEGER
TOPLAM=TOPLAM+DEGER
pauseus 20
NEXT SAY
SONUC=TOPLAM/10   'SONUC=0-1023 ARASI
VOLT=(SONUC*/1250)/100
IF SONUC=512 THEN ROLE=1
GOTO BASLA

ete

CPD eprom hafızasının korumasıdır. Kod Koruma için CP_ON veya iptali, için CP_OFF kullanılıyor.
16F88 de analog pinlerin aktive edilmesi için önce iligli pin TRIS registerinden Giriş olarak ayarlanır.
Ardından o pine ait ANSEL registeri 1 yapılır. Daha sonra ADCON1 registeri ayarlanarak hem ADC okuma değeri format şekli hemde referans voltajları ADCON1 registerinden ayarlanır.
Verdiğin ADCON1 register tablsounda ;
Bit-7 için ADFM yani A/D sonuç format biti deniliyor. Format ihtiyacı şundan kaynaklanıyor. Değişken 16 bitlik ve senin okuman ise 10 bitklik olacak. Şayet bu 10 bit sağa yaslanır ise 0-1023 arasında okum yamış olursun. Bu durumda 16 bitlik değerin ilk 10 biti senin ADC değerin olur. Şayet bu 10 bit sola yaslanır ise Bu seferde 16 bitlik değişkenin ilk 6 biti sıfır kabul edilir ve kalan 10 bit değerlendirilirki bu seferde
Bu bit şayet 1 olur ise 10 bitlik okumanın HIGH Byte kısmına ait sondaki 6 bit sıfır kabul edilir. Bu durumda okuyacağın değer 0- 6565472 arasında değişikki bu kafa karışıklığına sebep olur. Bu nedenle biz daima sağa yaslı seçeneği tercih ederi.
ADFM biti 1 olur ise sistem sağa yaslı hale gelir ve soldan itibaren 6 bit sıfır kabul edilir.
ADFM biti 0 olur ise sistem sola yaslanır ve sonraki 6 bit sıfır kabul edilir.
Bu durumda biz Bit7=1 seçeceğiz , ADCON1=%1 ............. oldu

Bit 6, ADCS2 yani A/D Clock 2 ye bölünsünmü bölünmesinmi seçeneğidir.
Bu bit 1 olur ise ve sistem CLK kullanırlır ise 2 ye bölünecek demektir.
Bu bit 0 olur ise bölme iptal olacaktır.
Her ikiside tercih edilebilir ama biz 0 kullanalım , ADCON1=%10...... oldu

Bit 5-4, VCFG, yani A/D voltaj Referans seçme bitleri
Bu bitler %00 olarak seçilir ise ,+referans için +besleme , - referans için ise GND seçilmiş olur.
Bu bitler %01 olarak seçilir ise , + besleme ve , - referans için ise harici girişten girilen - Besleme (PORTA.2)kullanılacak demektir.
Bu bitler %10 olarak seçilir ise , + ref. harici ref girişinden (PORTA.3) girilecek, - Ref ise GND olarak beslemeden alınacak demektir.
Bu bitler %11 olarak seçilir ise bütün ref voltajları harici kaynaklardan alınacak demektir.
Biz besleme değerlerini ref voltajı olarak kullanacağız bu nedenle ADCON1=%1000.... oldu

Bit 3-0 bitleri kullanılmıyor 0 olarak girilmeli denmiş.  O halde ADCON1=%10000000  olmuş oldu.

Normalda ADCON0 registeri ile Basic de pek uğraşmayız özel bir durum yok ise tabiiki. Yinede buradaki register bitlerine bakalım;
Bit 7-6  Çevirim CLK seçme biti denilmiş.  ADCON1 registerinin 6 nolu bitinin (ADCS2)  aldığı değere göre yorum yapılacak. Biz 0 vermiştik bu bite.
Şayet ADCS2=0 ise ve ADCON0 7-6 bitlerine ;
%00 verilir ise  ADC osilaötünde FOSC/2 yani osilatör frekansı 2 ye bölünmüş olacaktır.
%01 verilir ise FOSC/8 seçilmiş olacaktır.
%10 verilir ise FOSC/32 seçilmiş olacaktır.
%11 verilir ise FRC dahili ADC osilatörü seçilmiş olacaktır.
Bu değeri aslında pic-multicalc programı bizim için hesaplayıp define komutu olarak bize veriyor.
 
DEFINE ADC_CLOCK 1     ' ADC clock source  (Fosc/8)
Bu radaki değer Fosc(8 değerinin kullanılacağına işaret ediyor ve bu seçim işlemci osilatör frekansına göre seçiliyor. Data sheet de bir tablo verilmiş olması gerekir Bu tabloda hangi frekanslar için hangi ADC osilatör seçenekleri uygun gösterilmektedir.
ADCS2=1 seçildiğinde ise farklı OSC seçenekleri karşımıza çıkmakta olup onları ayrıca değerlendirmeyeceğim artık.

Bit 5-3 Analog kanal seçim bitleri oluyor. Burada dikkat edilmesi gereken şey şudur. Bu register ASM yada manuel ADC uygulaması kullanılırsa kullanılacak seçme işlemini gösterir. Bu işlemi de BAsic otomatik halletmektedir.
ADCIN 0,HAM şeklinde komut verdiğimiz zaman 5-3 bitlerine %000 değeri verilerek kanal-0 seçilmiş olmaktadır.
Bu nedenle ADCON0 registerine pek dokunmamak daha uygun olacaktır.
ASM de kod yazarken bir adc okuma komutunuz olmadığı için buradan kanal seçmeniz gerekir ama Basicde buna gerek yoktur.

Bit 2 , GO/DONe bitidir. Kanal seildikten sonra bu bit 1 yapılarak ADC işlemi başlatılır ve bu bit pic tarafından çevrim tamamlanınca otomatik olarak sıfırlanır. Buda ADC okuma işleminin bittiğini gösterir. Ancak bu işide Basic otomatik yaptığından bunuda kullanmıyoruz.

Bit 1 kullanılmıyor 0 olarak yazılmalı.
Bit 0 ise ADC çevirim modülünü aktif hale getirmek için kullanılır. Bu işde basic tarafından otomatik yapılır.
Bu durumda Basic de 16F88 için program yazıyor ve ADC kullanıyor iseniz ADCON0 registerine herhangi bir değer vermeniz gerekmiyor.

Umarım anlaşılmıştır.
Ete


muyat

Hocam üstte yazdıklarınız için teşekkürler.Tekrar okuyacagım...
Fakat 16f88de sigorta ayarlarını aşagıdaki gibi yaptıgımda (_CP_ON)
Symbol not previously defined(_CP_ON)hatası veriyor.

@ __config _CONFIG1, _INTRC_IO & _WDT_ON & _LVP_OFF & _CP_ON

Aşagıdaki gibi yaptıgımda hata vermiyor ama bu sefer de kod koruması kapalı olmuş oluyor.
@ __config _CONFIG1, _INTRC_IO & _WDT_ON & _LVP_OFF & _CP_OFF


Nedeni ne olabilir

ete

Nedeni kullandığım MPASM versiyonunda işlemci için verilen INC dosyasındaki farklılık olabilir.
Bu programı MPASM ile derliyorsun değilmi? yani makinen 64 bit ve derlemede MPASM kullanıyorsun.
Şimdi MCS da View menüsünde Complie&Program Options seçeneklerine bak. Assembler seçeneğinde MPASM için hangi yol verilmiş. Bu yol senin makinanda bulunan MPASM klasörünün yerini gösteriyor.
Yine MCS içinde o klasöre git ve yüklenecek dosya olarak P16F88.INC yaz ve ekrana gelen dosya içinde aşağılardaki tek tek verilmiş sigorta ayarlarına bak bakalım CP_ON yada OFF için nasıl bir format kullanılmış.
Bendeki şekli vereyim daha iyi anlarsın;
_CP_ON               EQU  H'1FFF'; 0000h to 0FFFh code-protected (all protected)
_CP_ALL              EQU  H'1FFF'; 0000h to 0FFFh code-protected (all protected)
_CP_OFF              EQU  H'3FFF'; Code protection off

Genellikle Proteus , Tools klasörü içind eyer alan MPASM klasörünü kullanıyoruz onun içinde de bu satırlar yer alıyor ve bu hatayı verdirmemesi gerek. Ya sendeki İnc dosyasında bu satırlar yok yada başka şekilde açıklanmış.

Ete

muyat

Hocam win7 enterprise 32 bit kullanıyorum.Şimdiye kadar 12f675,12f683,16f628aları sorunsuz programladım.
Mpasm 5.22 yüklü
Microcodestudio 4.00
inc dosyasının içerigi aşagıdaki gibidir.Assembler içindeki yolda da proteusun içindeki dosya gözükmektedir.Normalde find automatically seçenegini seçiyorum hep.Ne yapmalıyım?Mpasm versiyonunu mu değiştireyim?


;****************************************************************
;*  16F88.INC                                                   *
;*                                                              *
;*  By        : Leonard Zerman, Jeff Schmoyer                   *
;*  Notice    : Copyright (c) 2004 microEngineering Labs, Inc.  *
;*              All Rights Reserved                             *
;*  Date      : 01/07/04                                        *
;*  Version   : 2.45                                            *
;*  Notes     :                                                 *
;****************************************************************
        NOLIST
    ifdef PM_USED
        LIST
        include 'M16F88.INC' ; PM header
        device  pic16F88, hs_osc, wdt_on, lvp_off, protect_off
        XALL
        NOLIST
    else
        LIST
        LIST p = 16F88, r = dec, w = -302
        INCLUDE "P16F88.INC" ; MPASM  Header
        ;__config _CONFIG1, _hs_osc & _WDT_ON & _LVP_OFF & _CP_ON &
        NOLIST
    endif
        LIST


[IMG]https://resmim.net/f/Maq0Nq.jpg[/img]

ete

dediğimi tam olarak anlamadın galiba;
Verdiğin INC dosyası derleyici (PBP) klasöründe yer alan INC dosyasıdır. Orada MPASM sigorta satırı kapılmış olması gerekir sende kapatmışsın zaten başına ; koyarak.
Ben ise MPASM klasörünü bulacak ve onun içindeki P16F88.INC dosyasına bakmanı söylemiştim. BU yokarıda verdiğin direk 16F88.INC dosyasının içeriğidir ve PBP kalsöründe yer alır.
View menüsüne bakılırsa Proteus içindeki MPASM yi kullanıyorsun.
C içinde program Files onun içinde Labcenter electronics ve onun içinde Proteus ve onun içinde Tools menüsünde yer alan MPASM içine bakacaksın. Oraya kadar gel ve yüklenecek dosya adı olarak P16F88.INC yaz ve dediğim şekilde alt kısımlarda yer alan sigorta ayar satırlarına bak.

Ete

muyat

Hocam bu şekilde.
Programfiles-labcenter electronics-proteus-tools-mpasma girip
16f88i buldum.Sigorta ayar satırları aşagıdak gibi.
_cp_on yok..Bu durumda ne yapmalıyım.Mpasm programını güncellemem mi gerekiyor.
Bir de _CP_ALL komutunun _cp_on dan farkı nedir?





ete

Listenin baş tarafında CP_ALL var işte budur bazı versiyonlarda bu CP_ON bazılarında ise CP_ALL diye geçiyor. Bu yüzden bu dosyaya bakmanı önermiştim. Sen kendi sigorta satırındaki CP_ON yerine CP_ALL yazacaksın hepsi bu.

Ete

muyat


Powered by EzPortal