2 Haziran 2007 Cumartesi

Pic ile PC iletişimi

Yaptığım bir projeden 877 kullanarak potansiyometreden aldığım analog veriyi dijitale dönüştürdüm ve seri port vasıtası ile pic'e gönderdim.Yapmış olduğum proje tam bitmediği için şuan sadece videosunu koyuyorum.Bu devrede max232(level converter) entegresi kullanıldı pic ile pc arasında.Pic ten gelen verileri görmek için ise hyper terminal programını kullandım.

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...

28 Nisan 2007 Cumartesi

PIC'te Tanımlamalar

Piclerde bazı özel uygulamalar için tanımlamalar yapılması gerekmektedir.Lcd,ADC,Usart gibi birimler kullanıldığında picbasic pro buunlara özel tanımlar getirerek kolaylıklar sağlamıştır.DEFINE ile yaptığımz bu tanımlamaları aşağıda vermek istedim.Yalnız tavsiyem ilk önce register(yazmaçların) öğrenilmesidir.Yanda pic programlama bölümünde registerların sitesini verdim(Special Function Registers ) ordan bakabilirsiniz.Verdiğim bu bilgiler başlangıç için karmaşık gelebilir ama bilmemiz şart.kolay gelsin...
  • DEFINE ADC_BITS 8 'Number of bits in ADCIN result
  • DEFINE ADC_CLOCK 3 'ADC clock source (rc = 3)
  • DEFINE ADC_SAMPLEUS 50 'ADC sampling time in microseconds
  • DEFINE BUTTON_PAUSE 10 'Button debounce delay in ms
  • DEFINE CCP1_REG PORTC 'Hpwm 1 pin port
  • DEFINE CCP1_BIT 2 'Hpwm 1 pin bit
  • DEFINE CCP2_REG PORTC 'Hpwm 2 pin port
  • DEFINE CCP2_BIT 1 'Hpwm 2 pin bit
  • DEFINE CHAR_PACING 1000 'Serout character pacing in us
  • DEFINE DEBUG_REG PORTB 'Debug pin port
  • DEFINE DEBUG_BIT 0 'Debug pin bit
  • DEFINE DEBUG_BAUD 2400 'Debug baud rate
  • DEFINE DEBUG_MODE 1 'Debug mode: 0 = True, 1 = Inverted
  • DEFINE DEBUG_PACING 1000 'Debug character pacing in us
  • DEFINE DEBUGIN_REG PORTB 'Debugin pin port
  • DEFINE DEBUGIN_BIT 0 'Debugin pin bit
  • DEFINE DEBUGIN_MODE 1 'Debugin mode: 0 = True, 1 = Inverted
  • DEFINE HPWM2_TMR 1 'Hpwm 2 timer select
  • DEFINE HPWM3_TMR 1 'Hpwm 3 timer select
  • DEFINE HSER_BAUD 2400 'Hser baud rate
  • DEFINE HSER_CLROERR 1 'Hser clear overflow automatically
  • DEFINE HSER_SPBRG 25 'Hser spbrg init
  • DEFINE HSER_RCSTA 90h 'Hser receive status init
  • DEFINE HSER_TXSTA 20h 'Hser transmit status init
  • DEFINE HSER_EVEN 1 'Use only if even parity desired
  • DEFINE HSER_ODD 1 'Use only if odd parity desired
  • DEFINE I2C_HOLD 1 'Pause I2C transmission while clock held low
  • DEFINE I2C_INTERNAL 1 'Use for internal EEPROM on 16CExxx and 12CExxx
  • DEFINE I2C_SCLOUT 1 'Set serial clock to bipolar instead of open-collector
  • DEFINE I2C_SLOW 1 'Use for >8MHz OSC with standard speed devices
  • DEFINE I2C_SDA PORTA,0 'Data pin for I2C (12-bit core only)
  • DEFINE I2C_SCL PORTA,1 'Clock pin for I2C (12-bit core only)
  • DEFINE LCD_DREG PORTA 'LCD data port
  • DEFINE LCD_DBIT 0 'LCD data starting bit 0 or 4
  • DEFINE LCD_RSREG PORTA 'LCD register select port
  • DEFINE LCD_RSBIT 4 'LCD register select bit
  • DEFINE LCD_EREG PORTB 'LCD enable port
  • DEFINE LCD_EBIT 3 'LCD enable bit
  • DEFINE LCD_RWREG PORTE 'LCD read/write port
  • DEFINE LCD_RWBIT 2 'LCD read/write bit
  • DEFINE LCD_BITS 4 'LCD bus size 4 or 8
  • DEFINE LCD_LINES 2 'Number lines on LCD
  • DEFINE LCD_COMMANDUS 2000 'Command delay time in us
  • DEFINE LCD_DATAUS 50 'Data delay time in us
  • DEFINE LOADER_USED 1 'Bootloader Used D
  • EFINE NO_CLRWDT 1 'Forces manual use of CLRWDT
  • DEFINE ONINT_USED 1 'Serves as LOADER_USED for versions before 2.33
  • DEFINE PULSIN_MAX 1000 'Maximum counts allowed before pulsin times out
  • DEFINE OSC 4 'Oscillator speed in MHz: 3(3.58) 4 8 10 12 16 20 24 25 32 33 40
  • DEFINE OSCCAL_1K 1 'Set OSCCAL for PIC12C671/CE673
  • DEFINE OSCCAL_2K 1 'Set OSCCAL for PIC12C672/CE674
  • DEFINE SER2_BITS 8 'Set number of data bits for Serin2 and Serout2
  • DEFINE SER2_ODD 1 'Use odd parity instead of even parity
  • DEFINE SHIFT_PAUSEUS 50 'Slow down the Shiftin and Shiftout clock
  • DEFINE USE_LFSR 1 'Use 18Cxxx LFSR instruction
  • DEFINE XINXLAT_OFF 1 'Don’t translate Xin commands to BS2 format
  • DEFINE XOUTXLAT_OFF 1 'Don’t translate Xout commands to BS2 format

18 Nisan 2007 Çarşamba

HoşGeldiniz

Kontrol sistemleri için gerekli olan denetleyicilerden sürücülere kadar , tüm gereksinimleri yayınlamaya çalışacağım bu sayfa umarım birilerine yardımcı olur.Kolay gelsin...