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