23 Mayıs 2007 Çarşamba

Pic Basic Pro MU Pic Assembly Mİ ?

Şu ana kadar kullandığım mikrodenetleyici programlama dili Pic Basic Pro idi. Fakat karşılaştığım bazı sorunlar nedeni ile bu dil bana yeterli gelmemeye başladı.Bunların başında zaman geliyordu tabiki.Kısa gecikmeler için basic dili yetersiz kalıyordu veya bazı komutların işlenme süresi uzun olduğu için devrede zaman bakımından sorun ortaya çıkıyordu.Birde programların bellekte kapladığı alan Assemblye göre yaklaşık %30 kadar daha fazla idi.Bunların dışında anlam veremediğim azı komut vaya tanımlamalar oldu.Pic asm de satırlarca yazdığımız bir programı Basic de birkaç satır ile halledebiliyoruz.Bu belki amatör kullanıcılar için iyi bir durum.Kolaylık sağlıyor.Veya mikroişlemci yapısını veya mantığını bilmeyenler için iyi diyebiliriz.Fakat iş profesyonelliğe gelince değişiyor bence.Pic asm ye geçtiğimde mikrodenetleyiciler içinde bulunan register(yazmaç) lardan haberim oldu desem yalan olmaz.Elbetteki vardı birkaçı hakkında ama hepsini bilmiyordum.En azından bi ADC veya Usart kullandığımda hangi yazmaçların hangi biti etkileniyor veya yetkilendirmek gerekiyor bunları Pic asm sayesinde öğrendim.Hatta zamanla yazmaçların neelerde kullanıldığını ezberler duruma geçiyorsunuz.Bir işlemciyi tam anlamıyla kavramak ona hükmetmek bence Basic dilinden geçmiyor.Basic her yerde olduğu gibi Pic tede basit gözüküyor ama yetrsiz bence.Eğer işlemci bilginiz yoksa yavaştan Pic Basic ile başlayın ama fazla uzun sürmesin.Uzun ama kalite program kısa fakat basit programa göre bence her zaman daha iyidir...

11 Mayıs 2007 Cuma

Pic ile 0 to 999 Sayıcı

İsmail abinin yanına gittiğim birgün saolsun bana pic16f877 verecekti.Gel dedi sana eski yaptığım devrelerden de veriyim.Verdiği devreler içinde 3lü 7 segment display de vardı.Bu güne kadar üşenip de yapmadığım sayıcı devresini yapmaya karar verdim.Oturdum displayin uçlarını belirledim.Sonra program yapmaya koyuldum.Lookup table sayesinde oldukça kısa bir program ile hallettim bu işi de.Programı tarama mantığı ile yaptım.Proteusta çalışmayan program breadboard üzerinde yüksek performans sergiledi.Hala da yanımda çalışmakta.İlk etapta gecikmelerde hata yapmıştım onları düzelttim.Şuan sayıyor ama tam 1 saniye olmadı gecikme bunu programdaki 333 değerini değiştirerek yapabilirsiniz.Yazdığım program aşağıdadır...

Kurduğum devrenin videosu aşağıdaki linktedir



  • TRISB=0
  • TRISA=0
  • I VAR BYTE
  • DEGER VAR word
  • N VAR BYTE
  • BEKLE VAR WORD

  • BASLA:
  • FOR DEGER=0 TO 999
  • BEKLE=0
  • GOSUB AYAR
  • NEXT DEGER
  • GOTO BASLA

  • AYAR:
  • FOR I=0 TO 2
  • N=DEGER DIG I
  • GOSUB GOSTER
  • pause 1
  • NEXT I
  • IF BEKLE<333>
  • RETURN

  • GOSTER:
  • BEKLE=BEKLE+1
  • porta=0
  • LOOKUP N,[$03,$9F,$25,$0D,$99,$49,$41,$1F,$01,$09],PORTB
  • PORTA=DCD I
  • RETURN
Her türlü sorunuz ve öneriniz için yorum yapabilirsiniz veya mail atabilirsiniz.

9 Mayıs 2007 Çarşamba

Biraz GeyiK

8 Mayıs 2007 yani dün samsun büyük otelde siemensin motorlarla ilgili bir reklamı şey yani semineri vardı :D Daha önce okulda seminer verdikleri için pek umutlu değildim birşey öğreneceğimizden.Neyse gittik öğlen 13:00'de.Seminer 18:30'a kadar sürdü.heralde hayatımda hiç bu kadar uzun sandalyede oturmamıştım.İlk gösterdikleri iki formül beni heyecanlandırmıştı fakat semierin uyku getirici etkisi herkesi çökertti diyebilirim.Neden buna katlandık konusuna gelince seminer sonunda yemek olduğunu söylediler.Ne yalan söyliyim değdi.

Birkaç komik anlar oldu (en azından benim için).Yetkili birinin seminer sırasında motorların kullanım süresinin uzunluğundan bahsederken kullandığı çorabı örnek göstermesi bana garip gelmedi değil doğrusu.Adam kullandığı çorabını 10ytl ye almış ve 10 senedir giyiyomuş.Valla gülüyümmü ağlıyımmı anlamadım.Oldu bide istersen 10 yıldır hiç çıkarmadım de bari.Acaba bunu sallarken 10 yıl önce 10 ytl nin değerini düşündümü hiç çok merak ediyorum.Gelde bu adamın verdiği semineri ciddiye al şimdi.

İkinci bir trajikomik an da şuydu; Başka bir mühendis bir motoru tanıtırken "bu motor bizim önceden kötülediğimiz bir motor şimdi bu şirketle ortak olduk tavsiye ediyoruz " dedi.Bu ne demek ya :) Şimdi kötülediğin motorların gerçekten kötümü iyi mi olduğunu nasıl inandırcaksın bize hiç düşündünmü.

Gözümden düştün siemens beni işe almazsan sallamıycam bak seni :))

7 Mayıs 2007 Pazartesi

PIC16F877 ile ADC

Dış dünya ile iletişimi analog dijital dönüştürücüler yardımı ile yapmaktayız.Bazı pic modellerinde bu amaç doğrultusunda adc modül konuşmuştur.Bunun sayesinde birkaç komut ile analog verilerimizi dijitale dönüştürebilmekteyiz.Pic 16f877 de adc için ayrılmış iki adet yazmaç (register) bulunmaktadır.bunlar ADCON0 ve ADCON1 yazmaçlarıdır.Bu yazmaçlar 8 er bitliktir ve bitlerin 1 ve 0 olması halinde adc nin özelliklerini değiştirebilmekteyiz.Ayrınlı bilgi için Pic programalama bölümündeki registerlara bakabilirsiniz.Analog veriyi picin içinde bir değişkene şu komut ile almaktayız ;
  • ADCIN 0,VERI
Bu komutun bize söylemek istediği analog veriyiyi 0 nolu pinden al ve veri adlı değişkene kaydet.0 nolu pin porta nın 0.pinidir.Peki bu adc'nin örnekleme zamanını,kaç bit olduğu gibi özellikleri nasıl belirleyeceğimiz kısmına.Bunun için yazdığım bir programı örnek olarak gösterip bunun üzerinden anlatmak istedim.Buyrun bakalım...

DEFINE ADC_BITS 8 'A/D çevirim sonucu kaç bit olacak
DEFINE ADC_CLOCK 3 'Clock kaynağı (3=rc)
DEFINE ADC_SAMPLEUS 50 'Örnekleme zamanı mikro saniye cinsinden.
TRISB=0
PORTB=0

VERI var byte 'ADC den okunan digital değer.

'8 bit değişken tipi seçtik kullanacağımız değer 8 bit olacak.
BASLA:

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

BAK:
IF ADCON0.2=1 THEN BAK


PORTB=VERI

GOTO BASLA

Programdan görüldüğü gibi adc nin çözünürlüğü 8 bit yapılmıştır.Örnekleme zamanı 50 mikro saniyedir.Frekans kaynağımız ise pice bağlı olan kristalin frekansıdır.
Bu programda amacım PortA nın 0.pininden aldığım analog veriyi dijitale çevirip PortB den göstermekti.Adcon yazmacının 3.biti 0 olduğunda analog veri alınmış demektir.Bu yüzden if le bir döngü yapıyoruz.VERI değişkenine alınan değer ise PortB ye aktarılıyor.Burada İf li komuttan sonra istediğiniz ayarlamaları yapabilrsiniz.İster karşılaştırma,İster LCD ye gönderme.Oraya kadar herey aynıdır ama.Umarım birilerine yardımcı olurum.Yorum ve sorularınıza açığım Hatalarım için 0544....... :)

LooKUp Table

Belki basit bir komut gibi gelebilir ama bu güne kadar işim düşmediği için ilgilenmemiştim doğrusu fakat bir lookup table'a ihtiyacınız olduğu anda imdadınıza yetişen mükemmel bir komutolduğunu düşünüyorum.Assemblyde uğraştığımız o lookuptable'lara göre çok kolay.Programda yazımı şu şekilde ;
  • LOOKUP İndeks,[sabit,sabit,.....],değişken
şimdi burada indeks değeri tablodan alacağı değerin hangisi olduğunu belirlemekte.eğer indeks değeri sıfırsa ilk sabit,1 ise 2.sabit değişkene atanmaktadır.burada sabitler 8 bitliktir.İşte lookuptable kullanmak bu kadar kolay.size sadece tabloyu oluşturmak kalıyo.Dijital saat vb. uygulamalarda başarılar...