PIC BASIC PRO Öğreniyoruz soru cevapları

Başlatan aster, 19 Mayıs 2005, 17:33:33

H@S@N

hocam ALLAH sizden razı olsun.tek seferde anladım.zaten zor bişey değill ama olsun.siz olmasaydınız belki pic diye bişey bilmiyor olcaktık.hocam bir sorum daha olucak.benim elimde 4 çeşit pic var.ben bu piclerin atıyorum dahili osilatörü olup olmadığını bilmiyorum.bu piclerin bu tarz özelliklerini anlamak için datasheetlerdeki can alıcı noktalar nelerdir.yani nasıl anlarım.birde ben us-burn programını kullanıyorum.eğer pıc yazılımında sigorta ayarlarını belirtmemişsem burdan ayarlayabiliyorum.bunun herhangi bi sakıncası varmıdır.teşekkür ederim.
satılık STM32F4-Discovery kit...

Tagli

Microchip'in datasheet'lerinin genelde ilk 5 sayfası içinde (genelde 3. sayfa) bir yerde maddeler halinde bir liste olur. Bu listede "internal oscillator" gibi bir ifade olarak görebilirsin varsa eğer. Karmaşık seçenekler sunan modellerde PDF'nin sol tarafındaki başlıklar arasında (üstlerde bir yerde) "Oscillator Configurations" başlığının olması da dahili osilatörün varlığına bir işarettir.
Gökçe Tağlıoğlu

ete

Datasheet denilen şeyin Türkçesi Bilgi Formudur adı üzerinde bilgi formu yani her şeyin yazılı olduğu belge.
Şu önemli bu önemli diye ayırmak gerçekten zor. Ama bir genelleme yaparsak ben çoğunlukla, ADC ayarlamaları için bakarım,
Sigorta ayarları için bakarım ama sigorta ayarları için daha güzel bir kaynak mevcut yazının sonunda açıklayacağım.
Muhtelif registerlere bakarım. Mesela Option, INCON, T1CON gibi registerlere bakarım. Aklıma gerçekten gelmiyor.
Hiç bir zaman data sheeti açıp bakalım ne özellikleri varmış demedim. Hep belirgin bir veya iki konu lazım olduğu için açtım data sheetleri . Bu nedenle sende lazım oldukça bak.

Sigorta ayarları için en güzel kaynak bence  MPASM klasörü içinde yer alan ve Pxxxxxx.INC dosyalarıdır. Bu dosyanın sonuna doğru bakarsan configürasyon kısmında tüm olası sigorta ayarlarını isimleri ile görürsün. Hangisini merak edersen gerekirse data sheete bakar açıklamasını okumaya çalışırsın değilse orada belirtildiği şekilde kullanmaya çalışırsın.

Sigorta ayarlarını programdan ayarlamak en iyisidir. Ama zorunlu değildir. Programlayıcı üzerinden de ayarlama yapabilirsin. Bir şey değişmez. Sorunda çıkarmaz.

Ete

Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

H@S@N

hocam bir sorum daha olucak. isisde kurduğumuz devre, gerçekde örtüşmüyor.atıyorum 12 volt luk bi lambamız var.bunu transistörün emiterine bağlıyorum.tranasistörün beslemesini 12 volt veriyorum.picden çıkan 5 voltu ise beyze bağlıyorum.şaçmalık o ki lamba yanıyor.gerçekde denediğimse ise lamba çalışmıyor.bildiğim transistör akım kazancı sağlar.beyzine 5 volt gırersek emiterinden de 5 volt çıkar.ama mosfet olsa işler değişir.5 volt ile mosfeti max. iletime sokabiliriz.anlamadığım ares gibi 6 ayda bir güncelleme yapan bir program böyle şeyleri nasıl oluyorda göz ardı ediyor.:)
satılık STM32F4-Discovery kit...

JKramer

Sizin durumunuzda npn tranzistör kullandığınızda yükü (lambayı) kollektöre bağlamalısınız.

H@S@N

ben lambayı örnek olarak vermiştim.benim kullandığım 12 voltluk şerit ledler.
satılık STM32F4-Discovery kit...

Wellnes

Ete hocam selamlar iyi varsınız.program konusunda başımız sıkıştığında sizinle iletişime geçerek sorunları çözüyor..çözerken birşeylerde öğreniyoruz.
Bende pic basic proğramlama dilini çözmeye çalışanlardanım.Benimde bir sorum olacak;
SORUM:Her dakikada belirlenmiş bir sayının katları şeklinde üst üste toplayan bir yazılım yaptım Örneğin verilen yada belirlenen sayı '15' katları her dakikada '15' ekleyerek devam ediyor..15-30-45 vs. Ben ekrandaki bu sayıları 1.5-3.0-4.5 -6.0 şeklinde görülmesini istiyorum. Nasıl bir proğram yazmalıyım..Şimdiden teşekkürler.

ete

Elde ettiğin sayılar ekrana vereceğin sayıların 10 ile çarpılmış hali ise (ben öyle anladım) işin zor değil.
Sayı=15 olsun. Ekrana şöyle yazdıracaksın;
Lcdout $fe,$02,dec SAYI/10,",",dec SAYI//10

Bu komut ne yapıyor onu izah edeyim.
Sayı değerini 10'a bölerek önce sayının tam sayı kısmını ekrana veriyor (15/10=1 çıkar ve ekrana 1 yazdı)
Sonra bir virgül koyuyor "," komutu bunu yapıyor. Görünenler   1,
Sonra sayı üzerinden mod işlemi uyguluyor yani sayının 10'a bölündükten sonra kalan sayıyı ekrana veriyor. Buda SAYI//10 komutu ile yapılıyor ve ekrana 5 yazdırılıyor. Sonuçta görülen kısım 1,5 şeklinde olacaktır.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

rercan

sayın ete  bende şöyle bişey yapmak istiyorum acaba bu modlu bölmeyi orada kullanabilir miyim ?

i2c ile pt2258 e veri yolluyorum

mb6=mb6+1 
x=x+1
If mb6>%11101001 Then ma6=ma6+%00000001       'b6 max ise a6 yı 1 arttır
If mb6>%11101001 Then mb6=%11100000                 'b6 max dan büyük ise b6 min e çek
If ma6>%11011001 Then ma6=%11011001                 'a6 max ise max degerde sınırla
If ma6=%11011001 Then mb6=%11101001                 'a6 max ise b6 yıda max da sınırla
i2cwrite sda,scl, $88,[ma6,mb6]
pause 100
GoTo main

burada amaç 8 bitlik iki veri var bunlar birisi 10 lar basamagına ait  volume verisi digeri birler basamagına ait veri . yani 99 kademeli ses ayar entegresi 6 kanal.  bu 8 bitin ilk 4 ü hangi kanal oldugunu gösteriyor. diger 4 de  volume degerini. istedigin kanalın ilk 10lar verisini sonra 1 ler verisini yolluyorsun.  0 dan başlıcak 9 dan 10 a geçince 10lar basamagı 1 artacak ve 1 ler basamagı sıfırlanacak öyle öyle artacak. bu durumu daha kısa yolla sizin modulüs bölme ile nasıl yapabiliriz ?   8 bitlik veride  4 biti kanal verisi oldugundan onu degiştirmeden ilk 4 biti değiştirmek.o noktada bilgim yetersiz. yardımcı olursanız memnun olurum.

ete

#249
whyliving,
Açıkladıklarını çok iyi anlamadım. Anlayabilsem bir şeyler önerebilirim belki.
Daha açık anlatmanın yolu yokmudur.
Anlaşılan entegrede bir register var ve bu 8 bitlik register iki parçada iş görüyor. İlk 4 biti birler hanesini sonraki 4 biti onlar hanesinimi tutyor yoksa başka fonksiyonlarıda varmı. Bu izahatı tek register üzerinden yap mesela;
REG=%0000 0000  şeklinde olsun. Bunun %0000 xxxx x ile gösterilenler birler hanesini gösteriyor.
%000x 0000 x ile gösterilen onlar hanesini gösteriyor  gibi anlatırsan daha kolay anlarım.
Bu açıklamadan sonra ne yapmak istediğinide bir kez daha açıklayıver lütfen.
8 bitlik veride bir denfazla fonksiyon olması sıklıkla kullanılan bir sistemdir.Genelde RTC ler bu sistemi kullanırlar (DS1302 - DS1307 gibi).
Benzer bir şeymidir. ?

Ete

Not: data sheet'i inceleyince anladım. Sanırım volum değerini 1 desibel artırıp 9 dan 10 a geçince 10'ar artırılan değeri de bir artırmak zorunluluğun var. Özetlersek alete 68 desbile emrini verdin ama 8 değerini bir artırdın 69 oldu bir artırdın 70 olunca 60 lık desibel değeri 70'e ayarlanmalı demek istiyorsun sanırım.  Değil ise tam olarak ne istegini anlatıver lütfen.

Şayet isteğin dediğim gibi ise işin çok zor değil. Vol_1 yani 1. kanal volum değeri şeklinde bir değişken tanımla Byte cinsinden.
BU senin o kanala ait volum değerin olsun. Artırmak için
Vol_1=Vol_1+1
IF VOL_1=100 then Vol_1=99 demen gerekiyor maksimum sınırlama için

Azaltmak için;
Vol_1=Vol_1-1
If Vol_1=255 then Vol_1=0  'buda minimum sınırlaması sıfırdan küçük olmayacak demektir.

Şimdi Bu volum değerinin 10 hanesine ait bilgiyi yollamak için;
Onlar=Vol_1/10  şeklinde bir hesap yapman yeterli. Bu değeri 10 lar hanesi için yolluyorsun.
Daha sonra birler hanesi için ise  Birler=Vol_1//10  şeklinde bir hesap yapıp yolluyorsun hepsi bu.

Diğer kanallar için yalnızca Vol_2 ... Vol_3 gibi değişkenler tanımla ama her biri için Onlar , Birler diye değişken tanımlamana gerek yok. Bunları bir kere tanımla ve her kanal için kullan.
Umarım anlaşılmıştır.

Ete

Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

rercan

hocam sağol anladım. birde şöyle bişey de sorun yaşıyorum hocam. 628 de a portunda osc cıkışlarını kullanacagım mclr falanda . uzaktan kumanda yapacagım. 4 bit kalıyor ancak direk giriş yerine 4 biti diyotlar ile 15-20 kanala cogaltmak istiyorum. 

şöyle ki

if porta = 10101001 dedigimde  osc ve mclr bitleri dolu oldugundan nasıl algılar bilemiyorum. maskeleme diye bişey var sanırım.
porta.1 2 3 bitlerini yani osc mclr uclarını sıfır alıp  kullandıgım girişleri öyle algılatacagım. bu durumda port a 4.5.6.7. bitleri deger olacak

buton 1 e basıldıgında  if port a = % 10010000  ' ilk dört bit kullanılamadıgından 0 degeri görülür mantıgıyla yaklaşsam dogru olur mu ?
mclr veya osc uclarının başka görevlerde olmasından etkilenir mi .  umarım anlatabilmişimdir. malesef rahat ortamda olmadıgımda alel acele çözüm üretmem gerekiyor lütfen mazur görün. anlayışınız ve yardımlarınız için cok teşekkürler.

ete

Bu işler için maskeleme denilen metodu kullanman gerekiyor.
Her hangi bir 8 bitlik değişkenin istediğin bitlerini alabilmen için alınacak bitleri 1 ile AND işlemine tabi tutman gerekiyor.
Senin örneğine göre açıklar isek;
PORTA=%10110110  olsun
Bunun 4-5-6-7 nolu bitlerini ayırıp almak için
PortA & %11110000 şeklinde and işlemine sokman gerek. Bakalım ne olur AND işelminden sonra;
%10110110
%11110000
bit7 lerin ikiside 1 olduğundan 1 AND 1=1 dir o halde and işleminden sonra elde edilecek değerin 7. biti 1 olacak
bit-6 ların birisi 1 diğer 0 olduğundan 1 AND 0=0 olur ohalde altıncı bit sıfır olacak demektir.
5. bitler her ikiside 1 olduğundan sonuç 1 olacak
4 . bitler de her ikisi  olduğundan sonuç 1 olacak
O halde ayırma işlemi sonucunda elde edilecek değer %10110000 olacaktır. SOnra gerekirse bu sayıyı sağa doğru 4 bit kaydırarak gerçek değerine getirebilirsin.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

rercan

cok teşekkür ederim açıklamalarınız için.

yucelcem


erkanert

İyi günler aradaşlar . Öncelikle ben yeni başladım pic öğrenmeye ve sizin sayenizde ilerlemeye çalışıyorum. Benim bir sorum olacak
Önce PORTB.2 nin 1 olması (2 SN)  sonra  PortB.0 ve Port B.1 aynı anda 1 olmasını  bu koşul sağlanırsa PortA.1 in high Olmasını nasıl yazarım acaba :P Walla Çok uğraştım ama yazamadım .. Bir yol gösterirseniz çok sevinirim...Şimdiden Teşekürler