Herkese Selamlar Dilerim,
Ben 10 gun sonra teslim edilmek uzere konu basliginda yazili projeyi vermem gerkiyor, pic hakkinda 135 dakikalik bir tanitim ve giris dersi haric hicbir bilgi almadim, biraz arastirma yaptim...
Oncelikle kafamda tasarladigim devreyi izah edeyim:
Ben bir tane foto direnc kullanmayi dusunuyorum seri bagli baska bir direnc uzerinden voltajin degisik degerlerini pice giricem fakat 16f877'de ADC konusunda cok az bilgiye sahibim, referans volataji nasil verilir konfigurasyon nasil yapilir bir iki kod gecti elime ama analiz etmekte zorlaniyorum,
ilk olarak bu konuda kaynak veya tutorial tarzi bir referans ya da tecrublerinizle yardimci olursaniz sevinirim.
Ardindan LCD gosterge kullanmam gerekiyor cok komplike ya da fiziksel gerceklere (luks gibi) uymam gerekmiyor mesela sadece 0 ile 10 arsi yazsa bile olur, fakat LCD hakkinda hicbir bilgim bulunmamakta ne diyip alicam ? kac bitlik ya da kac piksellik ya da komut setleri programlanmasi hic bir bilgim yok ?
Ardindan Assembly ile yazmayi dusunuyorum ama C gecmisim var PicC ile daha mi kolay yazarim ? tum cevaplarinizi bekliyorum yardimci olursaniz sonsuz mutlu olurum
TEsekkur ederim
10 gün yeterli bir süre.Rahatlıkla yetiştirebilirsin ;) Lazım olan bilgiler bordumuzda mevcut.
ADC konusu zor değil.İncelemen gereken register ADCON0 ve ADCON1. 0-10 arası için özel bir Vref vermen gerekmiyor.Besleme referansını kullanabilirsin.
ADCON0 ile örnekleme frekansı<7:6>,kanalseçme<5:4:3>,dönüşümü başlatma ve bitti flagı(dönüşüm bittiğinde otomatikman 0 olur,başlatmak için sen bir yaparsın) <2>,ADC açık veya kapalı flagı<0>(sen kontrol edersin) vardır.
ADCON1 ile sonuç sağa mı solamı yaklaşık olrak kaydedilsin<7> ve port config flagları<3:2:1:0> vardır.Config için tabloyu incelemelisin.
örnek bir kod(asm)
movlw 4
movwf ADCON1
.
.
movlw 193
movwf ADCON0
movlw 3
movwf saymac
decfsz saymac,f
goto $-1
bsf ADCON0.2
btfsc ADCON0.2
goto $-1
Lcd için kullanımı kolay ve bol kaynak bulunması sebebi ile HD44780 uyumlu bir lcd işini görecektir.8 data bacağımız,3 tane de kontrol bacağımız mevcut.Kontrol bacaklarımız E,R/S,R/Wdir.Genelde R/W pinini şaseye bağlarız.Normalde R/W bacağı lcd üzerindeki BF(busy flag) kontrol ederek yazma veya okuma yapmak için kullanılır.Fakat şaseye çekerek sadece yazma konumunda ve süre uygulaması ile kullanılabilir.Bazı modeller de backlight dediğimiz arka aydınlatma ve bunun besleme pinleri bulunabilir.Genelde 1,2 veya 15,16 nolu bacaklardır.Dataları 8 bit gönderebildiğimiz gibi 4 bit olarakda gönderebiliriz fakat süreler yaklaşık iki katına çıkar.Tek satır lcd için karakter yazdırmaya başlayabildiğimiz adres değeri 128 den başlar.16,20,40 karakterlik modeller vardır.
İsis de örnek sim var.Kendi devreni kurup simüle ederek çalışman çok hız kazandıracaktır sana.Bu konuları 16f877 (16 ailesinin en gelişmiç modeli)işlemcisi ile ilgili datasheeti inceleyerek kolayca çözebilirsin.
datasheet ve uygula notları burda (http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1335&dDocName=en010241)
Bir adc okuma örneği;
adcbul
bsf status,rp0
bsf adcon1,7
bcf status,rp0
clrf adcon0 ;çikis voltaj bulma
call adcoku ;rutin içinde voltajh, voltajl nin içine 10bit atılıyor.
goto $ ; program sonu
adcoku
bsf adcon0,6 ;ölçme araliğini ayarla (fosc/8)
bsf adcon0,0 ;a/d çalistir
call bekle10 ;bekle
bsf adcon0,2 ;a/d bitti bitini 1 yap
btfsc adcon0,2 ;a/d bittimi bak
goto $-1 ;bitmediyse bekle
movfw adresh ;bittiyse adresh yi yazmaca al
movwf voltajh
movfw adresl ;adresl yi yazmaca al
movwf voltajl
return
LCD ile ilgili aşağıdki adrese assembly'de bişiyler karalamıştım. Belki işine yarar bi bak istersen
http://www.diyot.com/makro.html
Saygılarımla
Bülent ŞIVGIN
www.diyot.com
Herkese tekrar selamlar
Cevaplarinizi icin cok teşekkür ederim oncelikle
ADC ile baslamak istiyorum, verdiginiz kodu inceledim bir takim ornek kodlar daha buldum komutlari anladim ve 16f877 data sheet'ini de inceledim. Birkac sorum olacak bu konuyla alakali:
"" __config _LVP_OFF & _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF & _BODEN_OFF
& _DEBUG_OFF
list p=16f877
include "p16f877.inc"
; Start at the reset vector
org 0x000
goto Start
org 0x004
Interrupt
retfie
Start
bsf STATUS,RP0 ;bank 1
bcf STATUS,RP1
movlw H'00'
movwf TRISC ;portc [7-0] outputs
clrf ADCON1 ;left justified, all inputs a/d
bcf STATUS,RP0 ;bank 0
movlw B'01000001' ;Fosc/8 [7-6], A/D ch0 [5-3], a/d on
movwf ADCON0
Main
call ad_portc
goto Main
ad_portc
;wait for acquision time (20uS)
;(non-critical for this test)
bsf ADCON0,GO ;Start A/D conversion
Wait
btfsc ADCON0,GO ;Wait for conversion to complete
goto Wait
movf ADRESH,W ;Write A/D result to PORTC
movwf PORTC ;LEDs
return
end
"""
[/b]
1. Yukaridaki kodda ADRESH registerinin anladigim kadariyla soldaki 4 bitinde analogtan digitale cevrilmis sinyal islenmis durumda dogrumu ? ADRESL 'de peki ne var ? Tekini kullanip mi cikis almak gerekiyor yoksa ikisi birden de kullanilabiliyor mu ?
2.
MAIN
YENILE
btfss INTCON,T0IF ;Bekleme Timer0 to çikışı
goto YENILE
bcf INTCON,T0IF
bsf ADCON0,GO ;basla A/D cevirmeye
Wait
btfss PIR1,ADIF ;islem bitene kadar bekle
goto Wait
movf ADRESH,W ;yaz A/D sonuç to PORTD
movwf RAM ;LED displeye
yukaridaki kodda da, btfss INTCON,T0IF gibi komutlar var bunlari kullanmam gerekecek mi bunlarin ne ise yaradigini anlayamadim, ilk yazdigim kodda da islem gercekles miyor mu ?
Foto direnc ve seri direncden olusan olcme devresi ile basin agrir.
R seri direncin degeri F de fotodirencin herhangi bir isik altindaki omik degeri olsun.
Devreye V voltaji verdiginde cikis Q olmak uzere
Q=V*F/(R+F) gibi bir baginti ile karsilasirsin. Bu durumda isik ile cikis voltaji arasinda guzel bir degisim olmaz. Iyilestirme icin bu bagintiyi hesaplama yoluna gidebilirsin. Ama vazgec derim.
Sen en iyisi Sabit akim kaynagi ile foto dirence akim bas ve fotodirenc uclarindaki gerilimi ADC ile olcmeyi dene.
Eger olcme araligi asilmis ise PIC ile akim kaynaginin akim degerini degistirerek sisteme AutoRange ozelligi katabilirsin.