PIC BASIC PRO'ya GİRİŞ ve YAŞADIĞIM SIKINTI..

Başlatan Acoustica, 29 Ocak 2011, 19:51:27

Acoustica

Herkese Hayırlı Akşamlar,

Aslında uzun zaman oldu forum sitelerinde dolaşmayalı,en son bundan 4 yıl önce eproje.com da modaratördüm.
Daha sonra hayat şartları bizi aldı biryerlerden biryerlere savurdu.Tabi kopmamak lazımdı,biz ise hayattan kopmayı seçtik.
Meslektenden de hayattanda yaşımız büyük olmasına rağmen koptuk,daha sonra şimdi eşim olan insan hayata ve elektroniğe bağladı tekrar beni.Yeniden 8 yaşından beri alaylı ve mektepli olarak devam ettiğim elektroniğe geri döndüm ve bir firmada analog kart tamircisi olarak çalışıyorum.(Alaylı,olarak Televizyon tamircisi yanında başladım 15-16yaşına kadar devam ettim,sonra meslek lisesi elektronik,daha sonra 2 adet yüksek okul birisi end.elektronik,diğeri ise elektronik haberleşme nasipse ona da daha bu yıl başladık),tabii bu vasıta ile yaş 28 oldu.


Hocalarımın beni çok sevmelerine ve bu işi iyi bildiğimi söylemelerine rağmen ve dijital elektroniğim iyi olduğu halde PIC programlamayı öğrenmeyi  reddettim.Çünkü nedeni o zaman sene 1998-1999 ve 2000 civarlarıydı ve o zaman hocalarımız bile tam vakıf değillerdi,ASM dilini sevmiyordum ve zor geliyordu,ta ki 28 yaşına kadar da zor gelmeye devam etti.


Çalıştığım firmadaki diğer arkadaşın argeci olması ağrıma gitmeye başladı,transistör ile mosfet süremeyen adam ordan burdan copy paste yapıp PICi yazıyor devreyi çalıştırıyordu,direnç hesaplamayı akım sınırlamayı,AC ve DC devre analizi bilmiyordu ama PIC yazıyordu.Ağrıma gitmeye başladı,daha mükemmel olduğum halde bu işin başında ben yoktum,bildiklerimide geri çekemezdim ve hatta hayalimdeki projeleri gerçekleştirmem için buna gerek vardı Mİmar SINAN ın  ÇIRAKLIK,KALFALIK ve USTALIK eserleri gibi benimde aklımda eserlerim vardı.(Çünkü USTAM'a ki öldü -Allah Rahmet Eylesin,söz verdim bildiğimi asla kimsenden saklamayacağım,çünkü bu meslekte kimse kimseye kolay kolay öğretmez ama öğretenler bu işi en iyi bilenlerdi demişti.)En sonunda bu işe el atmaya karar verdim.


320volt adlı (gevv in sitesidir) ETE hocanın ki eproje de de kendisi vardı hatırlıyorum PİC BASİC PRO derslerine baktım,ve benim için en iyi dilin BASIC olduğuna karar verdim.Lisede de bu dili iyi kötü öğrenmiş ve seviyordum yalın ve basitti.Kararımı verdim ve PIC BASIC öğrenip arkasından C++ ile devam edecektim.Beni tanıyan bir kaç mühendis bunu salık veriyor.


Neyse ilk kodumu yazdım bir multivibratör devresi yazdım yani diğer adı ile fliflop,
devre ARES ve ISIS ta mükemmel çalıştı derleyici kodu derledi,HEX dosyasını gösterdim ve simülasyon çalıştı.
Dünyalar benim oldu ilk kodum ve ilk devrem çalışmıştı.


Bu hevesle gittim bir adet USB PIC PROGRAMLAYICI aldım Konya Sokaktan.İçini açıp baktım 18F2550 var demek ki bu branner tip programlayıcı dedim.Neyse WİN7 kurulu olan sisteme gösterdim tanıttım programı çalıştırdım.Hemen PIC i taktım Hex dosyasını gösterdim içine attı.


Bir sevindim bir sevindim anlatamam,sanki ilk arızamı yapıyormuşum gibi oldum.
Gittim hemen pertinakstaki devreye taktım çalışmadı.5 tane PIC ve 5 kristal değiştim.Çalışmadı sanki garazi var gibi.
Çok üzüldüm küstüm kendime sonra buraya üye oldum,ustalara abilere sorayım dedim yardımcı olurlar dedim.
Bütün hepsini resim olarak koyuyorum.Yardımlarınızı bekliyorum.


Sağlıcakla ve esenlikle kalın,Allaha emanet olun.

Unutmadan bu programlayıcı 12F ve 12 C serisi programalamaz mı?


Ayrıca devre şemasında eklememişim PULLUP direnci var 8.2 K lık.











Dahilerin yüzde biri hüner, yüzde doksan dokuzu da terdir. "Thomas Edison"  Eski "TufanHan"

adoka

dostum bende senin gibi acemi sayılırım flipflop olarak tanıttıgın etiketten sonra ikinonta ust uste koymalısın (flıpflop:) seklinde derlemede hata vermeyebilir ama pice atarken picbasic bunu etiket olarak gormez ve islem yapmaz ayrıca etiketin hemen altına bir bekleme suresi daha eklemeni tavsiye ederim buton arkını sondurmek icin.
Kolay gelsin...
Bir mum diğer bir mumu tutuşturmakla, ışığından bir şey kaybetmez. (Mevlana)

Maxim

hoşgeldiniz
malesef resimler icon şeklinde ufak, normal olarak göremiyoruz.

ferit06

Sizin programlayıcı ile ilgili sorunuza cevap vereyim. 12 serisini 16 serisi olarak 8 pin seçeneği ile programlayabilirsiniz.

ete

Bu işe yeni başladığın için kusurlarının olmasını normal olarak karşılıyorum.
Her şeyden önce unutmaman gerekenbir şey vardır. İsis de çalışan devre gerçekte de mutlaka çalışır.
Yalnızca isisin varsaydığı bazı noktalara dikket etmen gerekiyor.
Bunlardan birincisi, isis mikro işlemcilere besleme (5V) bağlı kabul eder.
İkincisi işlmecilere kristal, rezonatör yada dahili harici RC osilatörlerin bağlı olduğunu kabul eder. Ama sen gerçek devrene mutlaka bunlardan birisini bağlamak zorundasın. Bunu yapmışsın.
Her işlemcinin bir Reset (MCLR) bacağı vardır. Pic in çalışması için bu bacağın HIGH da tutulması gerekir. Bacak Low da olursa pic e reset atılmış olur. İsis bu bacağa da bir pullup direncininbağlı olduğunu kabul eder. Dolayısıyla sen gerçek devrende bu bacağa 1K-10K arası bir pullup direnci bağlaman gerekir. Bunu yapmamışsın.

İsisin varsayımlarının dışında devrendeki hataları inceleyelim.

Birincisi PortA.0'a bir buton bağlamışsın. Butonun diğer ucu +5V da olduğuna göre PortA.0 pini (Buton Pini) LOW da bekleyecek ve sen butona basınca buton pinine HIGH uygulanacaktır. Peki o pini LOW da bekletecek bir tedbir almışmısın? tabiiki hayır. O halde ne yapman gerekir. Buton pinine bir Pull-Down direnci takman gerekir idi. Bunu yapmamışsın. Diyeceksinki devre çalışıyor isisde!!!!. Tamamen rastgele çalıştığından eminim.

Tabiiki devrende MCLR bacağına bağlanması gereken pullup direnci eksik. Bunuda bağlaman gerekiyor.

Diğer bir konuda ledlere bağlamış olduğun seri dirençler. Ledlerin bir forward yani yanma voltajları vardır. Ideal çektikleri akımlar ise 10-20ma arasında olmalıdır. Diğer yandan bir pic pini en fazla 20 ma akım verebilir fazlası pini dolayısıyla pici bozar yada yanmasına sebebep olur. Sen devrende ledlere seri 82 ohm direnç bağlamışsın. Bu dirence karşılık gelen yanma voltajı ;
Vf= 5V - (82 * 0,020)= 3,36V dolayında çıkıyor. Şayet kullandığın Mavi yada beyaz led ise bu direnç değeri doğrudur ancak yinede sınırları zorluyorsun gibi geliyor bana. Bu nedenle hesaplarını yaparken led akımını 10 veya en fazla 15ma olarak al.
hesap şekli R=(5V-Led_yanma_Voltajı) / 0,015  şeklinde olsun. Kullandığın normal kırmızı yada yeşil led ise oraya en azından 220 Ohm direnç bağlaman gerekir.

Devredeki kusurların bu kadar. Gelelim programa,

Yukarıdan aşağıya doğru programa baktığımda başta sigorta ayarlarının eksik olduğunu görüyorum. Hangi programlayıcıyı kullanırsan kullan, mutlaka sigorta ayarlarını programın başına koymayı ihmal etme. Pek çok programın sırf bu yüzden çalışmadığına dikkatini çekmek isterim.
Bu program için olması gereken sigorta ayarları ve komutların yazılış biçimi aşağıdaki şekildedir.

@ DEVICE pic16F628                     'hangi işlemciyi kullandığımızı belirliyor
@ DEVICE pic16F628, WDT_ON             'bekçi köpeği denilen geri plan sayıcısının aktif ediyor, WDT_OFF olursa da kapatıyor
@ DEVICE pic16F628, PWRT_ON            'Power On Timer özelliğini aktif ediyor. Pic beslemesi belirli voltaja ulaşıncaya kadar pic reset de tutulur.
@ DEVICE pic16F628, PROTECT_OFF        'kod koruması kapalı, açık olursa pic kopyalanamaz.
@ DEVICE pic16F628, MCLR_OFF           'Reset bacağı iptal edilebiliyor bu picde. Dolayısıyla Pullup direncine gerek yok.
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT 'Pic ini içindeki dahili OSC si kullanılıyor dolayısıyla kristal bağlanması gerekmez.

BU ayarlarları vermiş olsa idin devren en azından isis deki gibi çalışacak idi. Bir temel kriter devrenin çalışmasını engelliyor idi. Oda MCLR bacağına bağlamadığın pullup direnci bu ayarlarla iptal edildiği için devren muhtemelen çalışacak idi.

Kullandığın 16F628A işlemcisinde önseçimli (default) olarak açılan Komparatör pinleri vardır. AYnen bir opamp komparatörü gibi bu pinler komparatör amaçlı kullanılabilir. PortA nın ilk 5 pini bu iş için ayrılmıştır. Şayet tedbir almaz isen bu pinler analog komparatör olarak çalışır ve programında buna bağlı olarak çalışmaz. Bu pinlerin digital giriş-çıkış pini olaak kullanılabilmesi için CMCON=7 komutunun programın başına eklenmesi gerekirdi. Bunu eklemen gerekiyor.

Pic işlemcilerinde digital pinlerin girişemi yoksa çıkışamı çalışacağı TRIS registerlerine verilen değerlerle tanımlanır.
Her bir portun bir TRIS registeri vardır (12F serisinde bunun adı TRISIO registeridir). Bu registerin her bir biti sırasına göre ilgili pinin ne yönde çalışacağını belirler. Bit değeri sıfır (0) ise o pin Çıkış, bit değeri bir (1) ise o pin giriş olarak çalışır. Örnekle açıklar isek;
TRISB=%10001001 şeklindeki komut da yer alan ilk bit (sağdan sola doğru ilk bit) 1 değerini taşır. Bu PORTB.0'a denk gelen bitdir.
Değeri 1 olduğu için bu pin Giriş ("I"nput) olarak çalışacak demektir. Bir sonraki yani PortB.1 pini ise sıfır değerini taşımaktadır. O halde bu pin Çıkış yani ("O"utput) olarak çalışacaktır. Tırnak içine aldığım karekterler yaklaşık olarak değerlerin şekillerine karşılık gelmesi açısından hatırlatıcı rol oynar. Output için "0" yani sıfır , Input için "1" yani bir değeri verilmektedir. Şimdi senin devrene bakalım. PortA.0 da bir buton bağlı ve PortB de ise ledler bağlı.
Buton, bir giriş elemanıdır. O halde PortA.0 pini giriş olarak ayarlanmalıdır. Peki sen ne yapmışsın TrisA=%0000000 şeklinde verdiğin komut bütün PortA yı çıkış olarak ayarlamış Bu yanlış işte. Doğru komut TRISA=%00000001 şeklinde olmalı idi.

PortB de ledler bağlı idi. Led bir çıkış elemanıdır. Peki sen ne değer vermişsin TRISB ye ?. TRISB=%11111111 şeklinde verdiğin komut bütün B portunu giriş olarak ayarlamış. Buda tamamen yanlış bir komut tabiiki. O halde TRISB nasıl olmalı ?
TRISB=%00000000 şeklinde verilmeli idi.

BAsic de program satır takip eder. Bir satırdaki komutların yerine getirilmesinden sonra aksine bir komut (Goto ) yok ise bir sonraki satıra otomatik olarak atlar.
Etiketler Basicde bir isim ile tanımlanır ve ardından ":" işareti ile sonlandırılır. Sen bu kurala uymamışsın. Bu şekilde de çalışıyor ama doğrusu etiket adından sonra ":" işaretini kullanmandır.

Goto FlipFlop
FlipFlop:

şeklinde bir komut dizisi gereksizdir. Burada gereksiz olan Goto Flipflop komutudur. Çünki o komutu oraya yazmasan zaten program o satıra atlayacak. Başka bir alternatifi yok ki. Programın tabii akışını takip eden satırlar için ayrıca goto komutunu eklemek gereksiz ve fazladan komut satırı demek olur.

IF - ENDIF çevrimi içine aldığın komutların işlenmesinden sonra program satırların sonuna ulaşmaktadır. Orada bekleyecek ve muhtemelen WDT tarafından program resetlenip yeniden baştan başlatılacaktır. Buda yanlış bir uygulamadır.
Bu komut dizisini bir kerelik işletmek istersen program sonuna bir   END   komutu ilave etmen gerekir.
KOmutların yeniden değerlendirilmesini istersen ENDIF den sonra  GOTO FLIPFLOP  şeklinde bir yönlendirme komutu eklemen gerekir idi.
GOTO FLIPFLOP olmadan ne olur bir inceleyelim.
Programı ilk çalıştırdığında daha sen elini butona atmadan program satırları icra etmeye başlayacak ve butona basılıp basılmadığını kontrol edip ve basılmadığını da görüp anında ENDIF satırının bir sonrasına atlayacaktır. Orada bekleyecek ve sonuşta WDT tarafından resetlenip yeniden başlatılacaktır. Halbuki GOTO FLIPFLOP satırını eklersen program yeniden tuşa basılmışmı basılmamışmı kontrol edecek ve basılınca yazdığın komutları icra edecektir.

Son olarak, devrendeki ve programdaki eksikliklere ve hatalara rağmen program isisde rastgele çalışabilir. Çalışırkende isis sana hataları sıralar aslında onları görebilmen gerekir. Ama dediğim değişiklikleri ve düzeltmeleri yaparsan sistem düzgün çalışacaktır.

Pic işlemcileri genelde 5V ile çalışırlar. Devreye bağlanırken Voltaj bacaklarına çok dikkat etmelisin. Çok yapılan hataların başında işlemcilerin sokete ters takılması gelmektedir. Bazıları anında yanar ve bozulur bazıları ise pek etkilenmez. Ben yinede içlerinde bir yerlerin ters voltajdan bozulduğu kanaatindeyim. Pic'i yerine takmadan evvel on defa kontrol etmende yarar var.
Gerçek devrelerde picin besleme bacaklarına mutlaka 100nf kondansatör bağlamayı ihmal etme Hayat kurtarır. Çalışmayan yada abuk subuk çalışan devreleri çalışır hale getirir.

Bütün bu açıklamaları dikkatlice okumanı uygulamanı ve bundan sonraki programlarındada uygulamak üzere kafana yazmanı öneririm.

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

mufitsozen

Bravo Ete hocam,

Mukemmel bir egitmen ve ogretmen olarak yazmissin.

Keske bende bu kadar duzgun bir cevap yazabilsem dedirtdin bana.

Saglicakla kal,
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

Ruzgarbey

Merhaba.devrenizin Çalışmamasının büyük bir nedeni USB pic programlayıcılarında Sigortaların Tam Yapılması gerektiğidir.pic progmlamada sigorta ayarlarınızı kontrol ediniz.benimde daha öncebaşıma geldi 18f serisinde.aramıza katılmandan mutluluk duyuyorum.ülkemiz insanlarının bu güzel aileye katılmaları beni gerçekten seviniyorum.hiç elektronik bilgim olmamasına rağmen,okulunda okumama rağmen hobi olarak başladığım elektroniği pic yüzünden çok sevdim.piclerle uğraşırken elektronik bilgim oldu.araştırmak öğrenmenin bana göre hepsidir :) PBP diğer dillere nazaran daha görsel bir dildir.Pic e yeni başlamıssan bu dili ETE hocamızın dersleri ile çok kolay öğrenebilirsin.saygılarımla kolay gelsin.
Hayatta En Hakiki Mürşid İlimdir. M.K. ATATÜRK

frederic

Örnek alınması gereken nadide insanlardansınız ETE hocam,yaptıklarınız bildikleri üç beş satır bilgiyi nimetten sanıp saklayan budalalara ders oluyor her defasında.Sağlıcakla kalın,saygılar...

ihun

sayın ETE hocam, yazdığınız yazıları okuyunca, saygıyı fazlası ile hak ettiğinizi düşünüyorum. ben de PİC e yeni başlamış sayılırım. Assembly' i biraz öğrendikten sonra hangi dil ile ilerleyeceğime karar vermemde, yazmış olduğunuz yazıların etkisi inanılmaz. eğitim notlarınızı internetten indirdim ve onlar üzerinden ilerlemeye çalışıyorum. ve size en azından minnet borçlu olduğumu da bilmenizi isterim. hemen hemen internetten bulunabilecek nadir türkçe kaynaklardan ve önemlilerdendi.

bu yazıyı da sizin emekleriniz ve Pİc eğitimine olan katkınız sayesinde, bu alanda birşeyler yapmaya çalışan insanlara olan yardımınızın hiç de küçümsenmeyecek olduğunu bir kez daha idrak etmeniz ve kendinizle gurur duyulacak bir iş ortaya koyduğunuzu bilmeniz açısından yolluyorum.

siz ve sizin gibi insanlara çok çok TEŞEKKÜR etmek istiyorum.

Birçok insanın basit görüp cevap bile yazmaya gerek duymayacağı bir konuda, PİC öğrenmeye çalışan saygıdeğer kardeşimize böylesine yapmış olduğunuz açıklamalar yeni başlayan bizlerinde faydalanmasına vesile oluyor. Tekrar ALLAH sizlerden razı olsun.

ete

Bu sözleri hak etti isem ne mutlu bana.
Teşekkür ederim.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Acoustica

Herkese yardımları için çok teşekkürler,ilk 3 derse göre birşeyler yapmaya çalıştığım için olmadı.
Ama şimdi başardığıma inanıyorum,arkadaşımla bir iddaya girdik ve bunun sonucunda 12C508 İle  220 voltta bir lambayı
kontrol etmemi istedi.Bende kabul edip şu şekilde birşey yazdım.
İşyerinde olduğumuzdan deneyemedik,foruma sormayı kabul ettik,
Sizce bu devre çalışır mı?
[IMG]http://www.hizliupload.com/img/66855335841848089807.jpg[/img]
Dahilerin yüzde biri hüner, yüzde doksan dokuzu da terdir. "Thomas Edison"  Eski "TufanHan"

ete

Program ve devre genel anlamda doğru. Ancak bu program bu devrede çalışmayacaktır.
Muhtemelen derlenirken hata verecektir.  Nedendir dersiniz?
Tabiiki data sheet incelemesi yapmadığınız için 12C508 de Analog pinler ile Comparatör varmış gibi gerekli komutları oraya koymuşsunuz.
Her ikiside 12C508 de mevcut olmayan özelliklerdir.
Kısaca CMCON komutu ile ANSEL komutunu oradan kaldırırsanız program çalışır.
Ancak bana göre bir diğer eksiklik,  tuş basılmış ise role çıkışını high yaptıktan sonra 200 ms lik bir gecikme koymanız uygun olacaktır.
Aksi halde tuş basmada sıklıkla görülen bas-bırak olayı nedeni ile röle anlamsız şekilde çalışır.

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

Acoustica

#12
Sevgili ete hocam,
Program çalışmadı.Sadece butona bastığım an voltaj oluyor.
Elimi butondan çekince o volta çekiyor.İç osilatör frekansını 4.00Mhz ayarladım.
Dediğiniz gibi comparatör ve ADC ile ilgili komutları ANSEL VE CMCON kaldırdım.
Geri kalan kısmı birebir aynı.
Sistem tamamen çizdiğim şema ile aynı.Ama çalışmıyor.
Nerde yanlış yapıyoruım?
Yardımcı olursanız çok sevinirim.
Tufan Han DAĞ
Dahilerin yüzde biri hüner, yüzde doksan dokuzu da terdir. "Thomas Edison"  Eski "TufanHan"

Maxim

sanırım kodu bu şekilde değiştirirseniz çalışacaktır

ete hoca da onaylarsa eğer

ONOFF:

IF SWITCH=1 THEN
PAUSE 300
TOGGLE ROLE
ENDIF

GOTO ONOFF

muhittin_kaplan

Hocam Devre Doğru Programda Doğru Yanlız Mantık Yanlış
Siz Basınca Yanmasını ve Yanık Kalmasını, Tekrar Bastığınızda Sönmesini ve sönük kalmasını istiyorsunuz sanırım ?
Bunun İçin Maxim Hocanın yazdığını yazmanız yeterli olur.