C# ile basit bir PIC programlayicisini nasil yazabilirim?

Başlatan Digimensch, 10 Ocak 2009, 14:47:48

Digimensch

Biliyorum burasi Visual Basic.net bölümü ama benim kullandigim dilde bir .Net dili oldugu icin burayi uygun gördüm.
C#.net ile bir basit PIC 16F84 Programlayici devresine , veri yazan program yazmak istiyorum.
Elektronuik Devre su hazir olan Devrelerden.
Ben sadece yazilim kismini cok basit sekliyle yazmak istiyorum.
C#.net ile serial port bilesenini kullanmasini biliyorum.Fakat ben simdi elimdeki bir *.hex dosyasini  elimdeki alete göndermek bu aletinde bu *.hex dosyasini  PIC'e yazdirmasini saglamak istiyorum.
Bu is icin nasil bir yöntem yürütmem lazim?
Elimdeki bu aletin veri gönderebilmek icin herhangi bir adresi falan lazimmi?
Tam olarak ben sadece (*.hex Dosyasini karekter karekter ) veri olarak Serial Porta göndersem bu PIC'e yazilirmi?Yada bu alete özel göndermem gereken bir komut varmi??
Bana bu konuda bilgi verebilecek arkadaslara simdiden tesekkürlerimi sunarim.

controller

Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.

Digimensch

Öncelikle link icin tesekkürler.
Eger bilgin varsa bir kac kelime ile bilgi verseydin.
Yada bunun türkce aciklayici bir kaynagi yokmu?

Ben sadece Serial Port'u su bildik okuma ve yazma metotlariyla okusam veya yazdirsam yeterli olurmu?Pic yazci alete takili,yazici alette serial Porta bagliyken.Su kodlarla PIC 16fxx serisindeki bir pic'i okuyup bu pice veri yazabilirmiyim??
private static void SendSampleData()
{
  // Serial Port ayarlari yapiliyor
  SerialPort port = new SerialPort(    "COM1", 9600, Parity.None, 8, StopBits.One);
  
  // Port aciliyor
  port.Open();
  
  // String yazdiriliyor
  port.Write("Hello World");
  
  // Byte olarak yazdiriliýor
  port.Write(new byte[] {0x0A, 0xE2, 0xFF}, 0, 3);
  
  // Port kapaniyor
  port.Close();
}


Yada kücük bir C veya C++  kodu olsa herhalde cözerim isi...

Tagli

İş küçük bir kodla yapılabilecek kadar kolay değil. Yukarda bahsettiğin şekilde yapamazsın. Konu hakkında benim de pek bilgim yok ama sadece kolay olmadığını biliyorum. Öncelikle cihaza giden programlama voltajını da kontrol edebilmelisin, daha doğrusu bu voltajı istediğin zaman açıp kapayabilmen gerekir. C# ile seri portun düşük seviye özelliklerini kontrol edebilir misin bilmiyorum. Senin yazdığın kod sadece veri alış verişi içindir, ayrıca clock eşliğinde göndermez. Düşük seviye programlamayla seri portun her bacağına istediğin görevi verebilmen gerekiyor, başka türlü yapamazsın. Emin değilim ama düşük seviye bir program herhalde C veya C++ ile yazılır, belki de Assembly ile. İnternetten araştırmak gerek.

Bir diğer yöntem programlama işini PIC ile yapmak olabilir. Bu durumda seri portu değil PIC'i programlamış olursun. Programlayacı görevini üstlenen PIC bilgisayardan gönderilen verileri senin yazdığına benzer bir şekilde alır ve aldığı bu verileri gerekli biçime dönüştürerek hedef PIC'i programlar. Zaten USB üzerinden çalışan ve içlerinde PIC olan programlayıcılar bu mantıkla çalışıyor sanırım.
Gökçe Tağlıoğlu

Digimensch

Yani diyorsunuz ki sen Serial Portdan bir emir gönder , Serial Portda bagli olan Cardwriter'e bir PIC koy , o PIC senden gelen emire göre hedefteki PIC'i  okusun veya yazssin.
Mantikli ....
Pic ile hedef Pic'i programlama olayi saniyorum cogunlukla kullaniliyor.Cünkü bu Cardwiter üzerlerinde baska PIC'lerinde oldugunu görüyorum.
Isin tuhaf yani nette bu isi kodlarla anlatan  hic bir Kaynak bulamadim.
Bazen kücücük bir Delphi ile veya VB ile yazilmis  bu tür Programlara(Loader) rastliyorum.Bu Programlar örnegin bir smart kart iceriklerini basit bir Cardwriter 'den tiki tikir okuyup veya bu kartlara yazabiliyorlar.
Bende ayni sekilde bu isi en basitinden bir PIC'i okuyup yazmakla baslamak istiyorum.
C# ile bu isi yapmazmiyim?
Pic ile hedef Pic'i programlama olayi saniyorum kullaniliyor cogunlukla.Cünkü bu Cardwiter üzerlerinde baska PIC'lerinde oldugunu görüyorum.
Son bir sorum olacak Veri - Alis verisinin Clock esliginde yapilmasi ne anlama geliyor?Birde bu tür yazilimlar *.Hex dosyalari PIC'in neresine yaziyorlar?Eepromuna'mi?

Tagli

İnternette gezinirken gözüme "modem komutları" gibi birşeyler çarptı. Belki de çok düşük seviyeye girmeden Windows API ile (ki bunun nasıl kullanıldığını bilmiyorum, sadece kavram olarak biliyorum ne olduğunu) olay halledilebilir. Mesela çok bilinen IC-Prog programının ayarlarında programlama yöntemi olarak iki seçenek var: 1) Direct I/O 2) Windows API. Demek adam yazarken ikisini de kullanmış. API daha yavaş kalıyor sanırım, desteklediği durumlarda direct I/O yapmak daha iyi olur. Neyse, konuya geri dönersek, modem komutları anlaşılan seri portun bazı pinlerinin açılıp kapanmasını sağlıyor. Bu şekilde 4 bacağı (toprak hariç) gerektiği şekilde kontrol edebiliyor.

Clock eşliğinde göndermek derken senkronize seri iletişimden bahsettim. Normalde C#'da yukarda yazdığın gibi bir kod kullanırsan bitler birbiri ardına bir referans olmadan gider ve zamanlama önceden belirlenmiş sabit bir hız değerine göre yapılır. Senkronize iletişimde ise bitlerin başlaması ve bitmesi ikinci bir hattan giden kare dalga denebilecek bir sinyalle belirlenir ve bu sinyal master cihaz tarafından kontrol edilir.

Bu arada benim JDM programlayıcıyı elime alıp şöyle bir baktım. Görüyorum ki zaten standart veri bacaklarını kullanmamış, daha doğrusu RX ve TX bacaklarını kullanmamış.

İnternette düşük seviye seri port programlaması ile ilgili kaynak bulunabilir mi bilmiyorum. Ben biraz araştırdım ama pek başarılı olamadım. Belki de modem komutları olarak araştırılırsa bir şeyler çıkabilir.
Gökçe Tağlıoğlu

Digimensch

Ustam
bende bir kaynak bulamadim.Eger bu konuda kaynak bulursan buraya sunarsan sevinirim.

Anlamadigim su sekildeki cok basit bir Devreye dahi.
http://img293.imageshack.us/img293/1703/sxema3ti.jpg

Program yazip bu Program ile bir cok PIC serisini programliyorlar.
Örnegin su asagida Linkini verdigim Winpic Programi.Bu yukardaki basit Devreyle calisiyor ve Devreye yerlestirilen bi cok PIC serisini Programliyor.
http://freenet-homepage.de/dl4yhf/winpicpr.html

Bende örnegin yukarda verdigim bu cok basit bu PIC programlayici devresine C# ile nasil baglanip PIC'e elimdeki *.HEX dosyasini yükleyebilir veya okuma yapabilirim.
Bu Devreye göre yazdigim Program Serial Port üzerinden , PIC'in RB6 ve RB7 bacaklarina birseyler gönderecek ama ne ve nasil bu konuyu anlayamadim ve nette bulamadim.Insallah bir bilen cikarda bilgi verir.
Bekliyorum bu arada bende arastiriyorum birseyler bulursam buraya sunarim.

z

Bir zamanlar DOS isletim sistemi uzerinde Borland C ile yazdigim programla PIC16F84 u programliyordum. Bu yazilimin kaynak kodunu ve kullanilacak programlayici semasini picproje sitesinde vermistim. Yani aradigin sey su anda picprojenin bir kosesinde duruyor. Linki ustun koru bir  aradim ama bulamadim.

Hic bir sey yapamiyorsan microchip sitesinde islemcilerin nasil programlanacagina dair dokumanlar var ben onlardan yararlandim.

SPI, I2C benzeri bir iletisimle yapiyorsun. Detaylari hatirlamiyorum.
6-7 tane komut var. Bu komutlardan uygun olaninii yolladiginda flashi adim adim programliyorsun.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

controller

Alıntı yapılan: "Digimensch"http://img293.imageshack.us/img293/1703/sxema3ti.jpg

yukarıda verdiğin resimde de görüldüğü üzere veri alış-veriş i TXD-RXD üzerinden yapılmıyor. programlama iki pin üzerinden senkron olarak yapılır. bu pinler DATA (PGD) ve CLOCK (PCD) dur. şemada clock pini seri portun RTS pinine bağlanmış. data pinindeki iletişim çift yönlü olduğu için, pc den pic e doğru olan veri akışı için DTR pini, pic den pc ye doğru olan veri akışı için CTS pini kullanılmış. yani sen c# da ki standart veri okuma ve yazma fonksiyonları olan "Read" ve "Write" kullanarak pic ile haberleşemezsin. senin, haberleşmede kullanacağın veri byte larını bit bit  RST ye bağlı CLOCK senkronizasyonu ile DTR pininden gönderen ve CTS pininden okuyan bir fonksiyon (bitbang deniyor buna) yazman gerekir.
Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.

Digimensch

Yani sonuc olarak Serial Portun
CTS <->  RB7  (Okumak)
DTR <->  RB7  (Yazmak)
RTS <->  RB6  (arasinda CLOCK senkronizasyonu kullanmak)

Bu yukardaki pinleri dikkate alarak bu isi yapabilirim diyorsunuz?
Peki ben *.hex dosyasini DTR pinine programla dillerindeki hangi foksiyornla gönderecegim? Write ve Read fonksiyonlarini kullanmiycaksam?
Neyse biraz nette bu konulari arastirayim.
Eger baska bir bilginiz veya tecrübeniz varsa benimle paylasirsaniz sevinirim.
saygilarimla

Digimensch

Peki böyle bir Program yazmak isin icinde PIC oldugundan dolayimi?
Birde su sekilde programlar var.
Örnegin bir Uydu alicisina (Receiver) yine bu tür Programlarla Serial Port üzerinden Receiverin kendine özgü formatlardaki veriler yüklenip okuna biliniyor.
Bu tür Programlardami yine ayni mantikla calisiyor veya yaziliyor?Böyle bir  Program yazilirken Receiverin icindeki Flash isini gören micro islemcimi dikkate aliniyor?
Yoksa islem farklimi?

controller

Alıntı yapılan: "Digimensch"
C#.net ile serial port bilesenini kullanmasini biliyorum.

yazmışsın ancak serialport1 yazıp noktaya basınca çıkan menüyü hiç incelendin mi? seri porttaki kontrol pinlerini kullanmak için gereken herşey o menüde mevcut. ayrıca hex dosyasını Write("program.hex"); gibi gönderebileceğin bir hazır fonksiyon yok. hex dosyasını text modunda açıp her satırdaki asdres ve veri kısımlarını parse eden fonksiyonu kendin yazman gerekir. bunun için intel hex dosya formatını incele.

seri port asenkron haberleşme yapar. pic ise senkron haberleşme ile programlanır. bu yüzden seri portun standart fonksiyonunu kullanarak programlayamazsın. seri portta programlama için yaptığın sadece pinlerin 1-0 durumunu ayarlamaktır. yani sen aynı program ile paralel portun pinlerini kullanarak paralel porttanda programlama yapabilrsin. seri portun normal asenkron fonksiyonunu kullanarak programlama yapmak istiyorsan, verileri seri porttan asenkron olarak alıp işleyerek port pinlerine bağlı olan pici proglamlayan ikinci bir pic kullanman gerekir. bu şekilde bir programlayıcı yaparsan pc tarafında bir program yazmanada gerek kalmaz. hex dosyayı doğrudan hyper terminal gibi bir programdan gönderebilirsin. uydu cihazlarında kullanılan yöntemde buna benzerdir. içinde seri porttan gelen verileri alıp flash ı programlayan bir işlemci ve yazılım vardır. veya diğer bir yöntem olan bootloader ı denemelisin.
Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.

Digimensch

Yani sonucta PIC'e baska bir PIC'i programlatmak daha kolay olur diyorsunuz.
Öyleyse ben o zaman bir PIC ile baska bir PIC nasil Programlanir onu ögreneyim ve bu PIC'e elimdeki *.HEX dosyasini asenkron olarak Serial Port'dan göndereyim oda bu verileri Hedefteki PIC'in Flashina yüklesin.Sanirim bu en basit yöntem olacak benim icin.
JDM Programlayicilarda saniyorum böyle calisiyor.

Tagli

Alıntı yapılan: "Digimensch"Yani sonucta PIC'e baska bir PIC'i programlatmak daha kolay olur diyorsunuz.
Evet, bence de bilgisayarda seri portun düşük seviye programlamasıyla uğraşmaktansa (ki anladığım kadarıyla oldukça zahemetli bir iş) daha alışık olduğun PIC ortamında bu işi halletmen daha rahat olur. Ama şimdiden söyleyeyim, çok da kolay bir program olmayacak.

Alıntı yapılan: "Digimensch"JDM Programlayicilarda saniyorum böyle calisiyor.
JDM dediğimiz üzerinde PIC falan olmayan, doğrudan seri porta bağlanan dandik programlayıcı değil miydi? Yanlış biliyorsam düzeltin, çok emin değilim çünkü.

Burda bir sorun daha var: 13 V civarında olan programlama voltajının nasıl üretileceği. Elektronikten pek anlamadığım için aklıma birşey gelmiyor. Ama sanırım bir çeşit "charge pump" kullanmak gerekiyor. Bu konuda ustalar merakımı giderirlerse sevinirim.

Ekleme: Gerçi yukarda işi PIC ile yapmanın daha kolay olacağını vurguladım ama farkettim ki daha önce bu konuyu araştırırken bir site bulmuşum ve yer imlerine eklemişim. Bu sitede Linux ortamında C ile seri portun düşük seviye programlanmasını oldukça iyi anlatıyor. Windows'takinden daha kolay gibi gözüküyor.
Gökçe Tağlıoğlu

Digimensch

Su sekilde olacak galiba?
Ben Serial Port'dan elimdeki *.HEX dosyasini karakter karekter programlayacak PIC'e gönderecegim, o PIC'de bu gelen verileri Hedefteki Programlanacak PIC'in Flash'ina yazacak.
Yani ben Pic C veya CCS ile programlayacak PIC'e Serial Port'dan gelen cerileri al ve Programlanacak hedefteki PIC'in Flashina gönder islevini yapacak Program yazmam gerekecek.