avatar_ete

PIC Basic Ders-05 (Analog Digital Çevirici Kullanımı)

Başlatan ete, 28 Ağustos 2011, 16:11:16

emrecelik3673

Ete hocam merhaba,

Ben dersleri çalıştım ve belli bir mesafe katettim. P16F84A ile led yakma / buton ile led yakma gibi programları yapabiliyorum. Aynı şeyleri P16F877A ile nasıl yapacağım? Port yönlendirmesi vs olması gerekiyormuş sanırım. Mesela aşağıdaki programı 877'ye nasıl yazabilirim hocam? (PBP ve micro code studio kullanmaktayım)

'===================================

trisa.0=1     'porta.0 giriş
trisb.0=0     'portb.0 çıkış
portb=0      'portb yi temizle
basla:

if porta.0=1 then     'eğer porta.0 1 ise portb.0 dakii ledi yak ve 500ms sonra sondür
high portb.0
pause 500
low portb.0
pause 500
else                        'değilse basla etiketine git ve tekrar kontrol et
goto basla
endif                       'if i bitir

end                          'program sonu

'================================
Bilen arkadaşlardan da yardım rica ederim. Teşekkür ederim.


ete

16f877 de fazladan analog pinler vardır. Data sheet'e b akarsan bunlar pinlerin üzerinde ayrıca AN0-AN1-An2...şeklinde isimlendirilmişlerdir.
Yazdığın program digital kontrol yaptığı için Analaog pin ihtiyacın yok. O halde default olarak Analog olarak açılan Analog pinleri digitale çevirmen gerekir. Programa sigorta ayarlarını daima ekle. Basla satırından evvel mutlaka bir açılış gecikmesi vermeyide ihmal etme.

Kullandığın işlemci 16F877A ise fazladan birde Komparatör seçimi vardır. Default olarak önce komparatörler aktif açılır. Iptal etmek için CMCON=7 komutunu vermen gerekir. Komparatörler iptal edilince pinler bu sefer Anaog pin haline gelmiş olur. Onuda iptal etmek için ADCON1=7 komutunu vermen gerekir. Bu aşamadan sonra aynen16F84A da olduğu gibi programını çalıştırabilirsin. Birde unutma 16F877 pin sayısı açısından fazla olan bir entegredir. A - B - C - D ve E portlarına sahiptir. Bunlara ait tris değerlerinide alışkanlık olarak kullanmasanda programda vermeyi unutma.
Ayrıca yalnızca 1 pin bile kullanacak olsan yineden bütün porta ait Tris registerine değervermeyide ihmal etme.

Ete


'===================================
@ DEVICE PIC16F877                      'işlemci 16F628                               
@ DEVICE PIC16F877, WDT_ON              'Watch Dog timer açık
@ DEVICE PIC16F877, PWRT_ON             'Power on timer açık
@ DEVICE PIC16F877, PROTECT_ON         'Kod Protek kapalı
@ DEVICE PIC16F877, XT_OSC  'Dahili osilatör kullanılacak
TRISA=%00000001  'porta.0 giriş
TRISB=%00000000  'portb.0 çıkış
TRISC=0
TRISD=0
TRISE=0

ADCON1=7  'ANALOG GİRİŞLER DİGİTİAL YAPILDI
portb=0      'portb yi temizle
PAUSE 300  'AÇILIŞ GECİKMESİ VERİLDİ

basla:

if porta.0=1 then     'eğer porta.0 1 ise portb.0 dakii ledi yak ve 500ms sonra sondür
high portb.0
pause 500
low portb.0
pause 500
else                        'değilse basla etiketine git ve tekrar kontrol et
goto basla
endif                       'if i bitir

end                          'program sonu


ETE

emrecelik3673

Anladım hocam, akşam evde uğraşacağım, teşekkür ederim değerli bilgileriniz için.

emrecelik3673

Ete hocam merhaba tekrar. Aklıma bir şey takıldı, 877 ya da 877A nın dahili osilatörü var mı? Sizin bana göndermiş olduğunuz programı inceliyordum orada fark ettim.

ete

Hayır Yok maalesef
16F887 nin var bu işlemci 877'nin yerine alternatif üretilmiş olup daha fazla özelliği barındırmakta olup hemde daha ucuzdur piyasada

Ete


emrecelik3673

Alıntı yapılan: ete - 20 Ocak 2014, 15:50:21
16f877 de fazladan analog pinler vardır. Data sheet'e b akarsan bunlar pinlerin üzerinde ayrıca AN0-AN1-An2...şeklinde isimlendirilmişlerdir.
Yazdığın program digital kontrol yaptığı için Analaog pin ihtiyacın yok. O halde default olarak Analog olarak açılan Analog pinleri digitale çevirmen gerekir. Programa sigorta ayarlarını daima ekle. Basla satırından evvel mutlaka bir açılış gecikmesi vermeyide ihmal etme.

Kullandığın işlemci 16F877A ise fazladan birde Komparatör seçimi vardır. Default olarak önce komparatörler aktif açılır. Iptal etmek için CMCON=7 komutunu vermen gerekir. Komparatörler iptal edilince pinler bu sefer Anaog pin haline gelmiş olur. Onuda iptal etmek için ADCON1=7 komutunu vermen gerekir. Bu aşamadan sonra aynen16F84A da olduğu gibi programını çalıştırabilirsin. Birde unutma 16F877 pin sayısı açısından fazla olan bir entegredir. A - B - C - D ve E portlarına sahiptir. Bunlara ait tris değerlerinide alışkanlık olarak kullanmasanda programda vermeyi unutma.
Ayrıca yalnızca 1 pin bile kullanacak olsan yineden bütün porta ait Tris registerine değervermeyide ihmal etme.

Ete


'===================================
@ DEVICE PIC16F877                      'işlemci 16F628                               
@ DEVICE PIC16F877, WDT_ON              'Watch Dog timer açık
@ DEVICE PIC16F877, PWRT_ON             'Power on timer açık
@ DEVICE PIC16F877, PROTECT_ON         'Kod Protek kapalı
@ DEVICE PIC16F877, XT_OSC  'Dahili osilatör kullanılacak
TRISA=%00000001  'porta.0 giriş
TRISB=%00000000  'portb.0 çıkış
TRISC=0
TRISD=0
TRISE=0

ADCON1=7  'ANALOG GİRİŞLER DİGİTİAL YAPILDI
portb=0      'portb yi temizle
PAUSE 300  'AÇILIŞ GECİKMESİ VERİLDİ

basla:

if porta.0=1 then     'eğer porta.0 1 ise portb.0 dakii ledi yak ve 500ms sonra sondür
high portb.0
pause 500
low portb.0
pause 500
else                        'değilse basla etiketine git ve tekrar kontrol et
goto basla
endif                       'if i bitir

end                          'program sonu


ETE

Sizin yazdığınız programda dahili osilatör kullanılacak yazmış da hocam ondan sordum. Bana yazmış olduğunuz programı olduğu gibi yazmam gerekiyor dimi hocam. watch dog timer, power on timer, kod protect kapalı ve dahili osc kullanılacak" bunlar hocam.

ete

Orada yazana bakma asıl komut da , XT_OSC yani 4Mhz Kristal OSC kullanılmış yazılı kısımlar kopyalanırken hep birlikte geliyor. Unutuyorum silmeye.
Sigorta ayarlarını örnek verdim. Önümde açık bir program vardı oradan alıp kopyaladım.
İster aynısını kullan istersen değiştir fark etmez. Değiştir derken;
WDT kapalı yapabilirsin.
PROTECT_OFF yapabilirsin.
yalnızca bu iki si ile oynayabilirsin diğerlerine dokunma
Programa birde
Define OSC 4
şeklinde kristal frekansını belirten komutu da yazmayı unutma ben unuttum sanırım.

Ete




emrecelik3673

Hocam günaydın,

Programı denedim akşam, picbasic @ DEVICE komutunu illegal kod olarak uyarı veriyor derlemede hata veriyor. Bunu düzeltmek için ne yapmam gerekiyor hocam.

ete


emrecelik3673

Ete hocam merhaba,

Arkadaşlar arasında MCS'da @ device derleme sorunu yaşayanlar var ise bilgilendirmek istedim. @ device derleme sıkıntısı 64 bit lik windowstan kaynaklanıyor. PC ye format atıp 32 bit yükledim herhangi bir problem kalmadı. bu sorunu yaşayan arkadaşlar var ise bilgilendirmek isterim

ete

64 bitlik makinada da sorunsuz kullanılıyor. Tek yapılacak iş derlemede assembler olarak MPASM kullanılacak ve elbette MPASM kullanılınca sigorta ayarları MPASM formatında verilecek.  Birde , PBP klasöründe yer alan , kullanılan işlemciye ait INC dosyasındaki PMASM ye ait sigorta ayarı satırları başlarına " ; " koyularak kapatılıp kayıt edilecek.
Bunları yapmak zor olmasa gerek.

MPASM formatında sigorta ayarları formatı için PBP klasöründeki o kapatılan satırları kopyalayıp kullanabilirsiniz.
Ayarların neler olduğunu ve kullanış biçimleri içinde MPASM klasöründe yer alan Pxxxx.INC dosyasını açıp alt kısımlara doğru yer alan sigorta ayarları listesini kullanabilirsiniz.

Ete


. Kağan

#72
ADCON1=%10001110 '7. bit 1 yapıldı 10 bit sonuç almak için.
'-------------------------------------------------------------------------------
HAM var word 'ADC den okunan ham Digital değer.
VOLT var word '16 bit değişken tipi seçtik kullanacağımız değer 10 bit olacak.

Mvolt var byte
BASLA:

ADCIN 0,HAM '0 nolu kanaldan Analog değeri oku ve RAW değişkenine aktar.

BAK: IF ADCON0.2=1 THEN BAK 'Çevirme işlemi tamamlanınca Adcon0.2=0 olacak.

lcdout $FE,1," HAM =",# HAM
Ham=ham+1


Önceki bir kodda verdiğiniz
IF ADCON0.2=1 THEN BAK  'Çevirme işlemi tamamlanınca Adcon0.2=0 olacak.
satırını anlayamadım. ADCIN1=1000XXX şeklinde yazarak 10 bit ve portların A/D olacaklarını ayarladığımızı öğrendim . Fakat burada ADCON0.2 registeri niçin yazılıyor. Bu registerle ilgili bilgi ders.5 de bulunmuyor. Anlatabilirmisiniz. Yada ders numarası verirseniz oradan bakayım.

Teşekkürler.

Hattuşa

slm kagan bahsettiğin IF ADCON0.2=1 THEN BAK  bayrak bitidir. yani adcon0.2 adc çevriminde çevrim tamamlandığında 0 yapılır, yani 1 olduğu sürece adc çevrimi devam ediyor demektir. genellikle biz küçük bir gecikme veririz. Ancak kod yazarken sürenin önemli olduğu yerlerde gecikmenin yerine bu bitin değişimi kadar beklemek için yani fazladan beklememek için bu bayrağı kontrol ederek işlemi ilerletiriz. malum ki işlemciler çalışılan frekansa göre hızları değişir.
sonuç olarak bir önceki açtığın bayrak biti nedir sorusu ile alakalı bir durum

. Kağan

#74
IF ADCON0.2=1 THEN BAK  'Çevirme işlemi tamamlanınca Adcon0.2=0 olacak.


kod açıklamasında  'Çevirme işlemi tamamlanınca Adcon0.2=0 olacak. deniyor. Ama EĞER ADCON0.2=1 ise BAK:' a git anlıyorum. BAK: ta ise Else  ADCON0.2=0 diye bir ibare yok bunu Anlayamıyorum. Kusura bakmayın.

Powered by EzPortal