Otomasyon Köşesi
Geçtiğimiz aylarda PIC16F877 ile ADC/Digital IO, aynı seri hat üzerine bağlanabilen IO birimi ve bazı gerekli yazılım bilgileri üzerinde durmuştuk. Bu ay yazı dizimize kaldığımız yerden devam ediyoruz.
   BİLGİSAYARLA  
 DÜNYAYA HÜKMETMEK – 5 
 PIC16F877 İLE ADC VE DIGITAL I/O
Merhaba sevgili amatör arkadaşlar!
 Uzunca bir süredir yazılarımı hazırlayıp gönderemiyorum. Öncelikle bunun için özür  
 dilerim sizlerden. Geçtiğimiz aylarda PIC16F877 ile ADC/Digital IO, aynı seri hat üzerine bağlanabilen IO birimi ve bazı gerekli yazılım bilgileri üzerinde durmuştuk. Bu ay yazı dizimize kaldığımız yerden devam ediyoruz.
Öncelikle PIC16F877 ile ADC/Digital IO uygulamamızın kontrolü için basit bir yazılım örneği vereceğiz. Tabi uygulamayı ihtiyaçlarınıza göre geliştirmek tamamen sizin hayal gücünüze kalıyor.
unit Unit1;
interface
 uses 
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
   StdCtrls, Spin, CPDrv, ComCtrls;
 type 
   TForm1 = class(TForm) 
     Button1: TButton; 
     ComboBox1: TComboBox; 
     Button2: TButton; 
     Button3: TButton; 
     Button4: TButton; 
     SpinEdit1: TSpinEdit; 
     Label1: TLabel; 
     Button5: TButton; 
     CommPortDriver1: TCommPortDriver; 
     IncomingRichEdit: TRichEdit; 
     Edit1: TEdit; 
     procedure Button1Click(Sender: TObject); 
     procedure Button2Click(Sender: TObject); 
     procedure CommPortDriver1ReceiveData(Sender: TObject; DataPtr: Pointer; 
       DataSize: Cardinal); 
     procedure Button3Click(Sender: TObject); 
     procedure Button4Click(Sender: TObject); 
     procedure Button5Click(Sender: TObject); 
   private 
     { Private declarations } 
   public 
     { Public declarations } 
   end;
 var 
   Form1: TForm1;
implementation
{$R *.DFM}
 procedure TForm1.Button1Click(Sender: TObject); 
 begin 
     CommPortDriver1.PortName:=ComboBox1.Text; 
     if not CommPortDriver1.Connect then 
         ShowMessage('Bağlantı kurulamıyor.'); 
     Button2.Enabled:=True; 
     Button1.Enabled:=False; 
 end;
 procedure TForm1.Button2Click(Sender: TObject); 
 begin 
     if CommPortDriver1.Connected then 
         CommPortDriver1.Disconnect;
     Button1.Enabled:=True; 
     Button2.Enabled:=False; 
 end;
 procedure TForm1.CommPortDriver1ReceiveData(Sender: TObject; 
   DataPtr: Pointer; DataSize: Cardinal); 
 var iLastLine, i: integer; 
     s, ss: string; 
 begin 
   // Convert incoming data into a string 
   s := StringOfChar( ' ', DataSize ); 
   move( DataPtr^, pchar(s)^, DataSize ); 
   // Exit if s is empty. This usually occurs when one or more NULL characters 
   // (chr(0)) are received. 
   while pos( #0, s ) > 0 do 
     delete( s, pos( #0, s ), 1 ); 
   if s = '' then 
     exit; 
   // Remove line feeds 
   i := pos( #10, s ); 
   while i <> 0 do 
   begin 
     delete( s, i, 1 ); 
     i := pos( #10, s ); 
   end;
   // Don't redraw the rich edit control until we finished updating it 
   //IncomingRichEdit.Lines.BeginUpdate; 
   // Get last line index 
   iLastLine := IncomingRichEdit.Lines.Count-1; 
   // If the rich edit is empty… 
   if iLastLine = -1 then 
   begin 
     // Remove line feeds from the string 
     i := pos( #10, s ); 
     while i <> 0 do 
     begin 
       delete( s, i, 1 ); 
       i := pos( #10, s ); 
     end; 
     // Remove carriage returns from the string (break lines) 
     i := pos( #13, s ); 
     while i <> 0 do 
     begin 
       ss := copy( s, 1, i-1 ); 
       delete( s, 1, i ); 
       IncomingRichEdit.Lines.Append( ss ); 
       i := pos( #13, s ); 
     end; 
     IncomingRichEdit.Lines.Append( s ); 
   end 
   else 
   begin 
     // String to add is : last line added + new one 
     s := IncomingRichEdit.Lines[iLastLine] + s; 
     // Remove carriage returns (break lines) 
     i := pos( #13, s ); 
     while i <> 0 do 
     begin 
       ss := copy( s, 1, i-1 ); 
       delete( s, 1, i ); 
       if iLastLine <> -1 then 
       begin 
         IncomingRichEdit.Lines[iLastLine] := ss; 
         iLastLine := -1; 
       end 
       else 
         IncomingRichEdit.Lines.Append( ss ); 
       i := pos( #13, s ); 
     end; 
     if iLastLine <> -1 then 
       IncomingRichEdit.Lines[iLastLine] := s 
     else 
       IncomingRichEdit.Lines.Append( s ); 
   end; 
   //IncomingRichEdit.Lines.EndUpdate; 
   // Scroll incoming text rich edit 
   SendMessage( IncomingRichEdit.Handle, EM_SCROLLCARET, 0, 0 ); 
 end;
 procedure TForm1.Button3Click(Sender: TObject); 
 begin 
     CommPortDriver1.SendString(Concat('X0',Edit1.Text)); 
 end;
 procedure TForm1.Button4Click(Sender: TObject); 
 begin 
     CommPortDriver1.SendString('X100'); 
 end;
 procedure TForm1.Button5Click(Sender: TObject); 
 begin 
     CommPortDriver1.SendString(Concat('X20',IntToStr(SpinEdit1.Value))); 
 end;
 end. 
 Programı derleyip çalıştırdığınızda aşağıdakine benzer bir ekran karşınıza gelecektir. 
 Örnekte 0. analog kanal okunuyor.
 
Gelecek ay kaldığımız yerden devam edeceğiz.
Saygılar
 (Delphi kaynak dosyaları için buraya basınız.) 
 Önemli Not Mutlaka Okuyun!!! 
 "Sevgili amatör arkadaşlar,Winamp için Kızılötesi Uzaktan Kontrol Sistemi başlıklı yazımda yayınlanan devrenin çalışmadığına dair bir çok e-mail alıyorum. Devre bir çok farklı bilgisayar üzerinde ve değişik işletim sistemlerinde defalarca test edildikten sonra yayınlandı. Ama yine de devreyi çalıştıramıyorsanız bunun belli başlı birkaç nedeni olabilir:
1. PIC'i programlarken OSC=XT, WDT=ON, CP=ON veya OFF parametreleriyle programlayın.
2. Devreyi monte ettikten sonra devrenin alt tarafını, özellikle kristal osilatörün bulunduğu yeri tiner veya asetonla iyice temizleyin.
3. Bazı anakartlar RS-232 için gerekli olan -/+11.00V gerilimi +5.00V üzerinden DC-DC dönüştürücüler ile sağlıyor. Bu tür anakartların RS-232 üzerinden akıtabileceği maksimum akım yaklaşık 1..2mA kadar olduğundan devremizi çalıştırması mümkün değildir zira devremiz uzaktan kumanda aygıtından sinyal alırken yaklaşık 15..20mA akım çeker. Eğer anakartınız bu tür anakartlardan ise devreden
* PNP transistör ve LED'i çıkararak bu sorunu çözebilirsiniz. Bu değişikliği yaptığınız zaman devrenin çekeceği maksimum akım 1mA'i geçmez bu da bir çok anakartın verebileceği bir akımdır.
 * 78L05'in çıkışı ile GND arasındaki elektrolitik kondansatörü daha büyük kapasiteli seçebilirsiniz ancak programı çalıştırdığınızda bağlantı hatal
arıyla karşılaşabilirsiniz.
* Devreyi RS-232'den beslemek harici bir besleme kaynağı kullanabilirsiniz. Gerekli olan +5V'u bilgisayarın güç kaynağından alabilirsiniz. (Güç kaynağından çıkan kırmızı kablolarda +5V vardır.)
Eğer devreyi yine de çalıştıramıyorsanız bana e-mail gönderin.
İyi çalışmalar Nusret SuzmeBilg. Prog."

 
																			 
																			 
																			 
																			 
																			 
																			 
																			 
																			 
																			 
																			 
																			 
																			