PIC ile ISIK SEVIYESINI OLCEN PROJE

Başlatan karakobra, 18 Mayıs 2005, 01:20:43

karakobra

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

Veli B.

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

SpeedyX

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

bsivgin

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

karakobra

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 ?

z

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.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com