PIC 16F877 Seri Port Haberleşmesi

Katılım
15 Ara 2009
Mesajlar
406
Puanları
16
Yaş
40
arkadaşlar konu sitede birçok yerde açılmış fakat incelediğim bütün çalışmalarda sıkıntılar var o yüzden konu açmayı ve çalıştıklarımı paylaşmak istiyorum.

#include <16F877.h>

#device adc=8

#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES NODEBUG //No Debug mode for ICD

#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
void main()
{
int sayi=0;
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);

set_tris_b(0x00);

output_b(0x00);

while (1){

output_b(0xff);



printf("start\n");//başlangıçta bu stringi gönder
delay_ms(2000);
sayi=getc();//karakter al

if (sayi==1){//alınan karakter 1 ise aşağıdaki işlemleri sürekli yap
while(1){
output_b(0xff);
delay_ms(1000);
output_b(0x00);
delay_ms(1000);
printf("if\n");
}
}
else{ //alınan karakter 1 değilse aşağıdaki işlemi sürekli yap
while(1){
printf("else\n");
}
}

}//while için
}//main için

program basit sadece printf ile veri gönderip hyper terminalde ve indirdiğim terminal programında gözlemleyebiliyorum fakat iş veri almaya geldiğinde durumlar karışık..Yukarıda kodda birinci açılış metnini (start) hiç göndermiyor sonrada karakter almaya çalışıyor ama gönderiyorum istediğim işlemleri yapmıyor.stdio kütüphanesinide dahil ettim oda işe yaramadı..

ccs c de sadece gönderme ve alma ile ilgili alınan veriye göre bir işlem yapacak şekilde kod yazmak istiyorum şimdiden teşekkürler..
 
1. while(1) döngülerinde programın takılır kalır. Dışarı çıkamaz.
2. Donanım olarak sorunun olabilir. Max232 kullandın mı.
3. Önce RC6 ve RC7 pinine gelen kabloları birbirine deydir. Hyperterminalde yazdıkların ekrana çıkmalı. Deydirmeden de çıkıyorsa deydirince çift çift çıkmalı. Çıkmıyorsa Max232 girişine bilgisayardan gelen tx ve rx kablolarını birleştirip dene. Hala çıkmıyorsa seriport kablolarını yanlış bağlamışsın veya seri port kullanılamıyor.
4. Toprak hattını da taşıyor musun. bilgisayara 3 tel gitmeli. 2 gidiyorsa olmaz
5. Set_tris_c ile tx çıkış rx giriş olarak ayarla. CCS otomatik ayarlamıyor olabilir.
 
dediklerinin hepsini yaptım sayın silvestir hyper terminale veri geliyor veri gidiyor fakat sıkıntı var;
veri alırken yada aldıktan sonra ne kadar zaman sonra veri gönderebiliyorum,
ben veriyi yani basit bir printf("merhaba"); deyimini gönderiyorum ve döngünün içinde sürekli bu işi yapıyor döngü içinde bir if kullandığımda if koşulunu ne zaman yaptığı belli olmuyor tam işlemciye reset atarken veri gönderebiliyor if in koşulunu doğruluyor yani ,int rda kesmesi kullandım onunla birlikte düzeldi.
simdi sadece veri göndermek sonra bir değişken almak klavyeden 1,2 gibi bir sayı ve buna göre yeni veriler göndermek istiyorum bununla alakalı bir örneğiniz varmı acaba?
 
Merhaba
Data yollama ve data alma işlemini asm kodları ile yaptığım için sizin yazılımınız hakkında bir fikir yürütemeyeceğim.
Sizin de bildiğiniz gibi Seriporta gelen datalar byte byte paketler halinde belli bir baudrate (1200.....9600..vs)hızında gelir.Bu gelen paketin bayt adedini ve de hızını bilirseniz PC tarafında yazacağınız basit bir program ile görebilirsiniz.Tabii burada dikkat edilecek nokta,örneğin PC'ye gelen,mesela klavyenin bir rakkamı HEX'31' PC'de 49 okunur.PC tarafındaki yazılımda yazacağınız basit bir kod ile bu gelen 49 rakkamını (1) olarak gösterebilirsiniz.Burada kritik bilgi,gelen byte sayısı ve hızıdır.Not:Byte adedi bilinmiyorsa VB kodları:
Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
Dim gelen As String = SerialPort1.ReadLine
MsgBox(gelen)
End Sub
SerialPort1_DataReceived evantı ile gelen mesajı,mesaj boxta (1)bir rakkamını 49 olarak görebilirsiniz.
Ama byte adeti tam bilinirse gelen paketler tek tek işlenerek daha kullanışlı hale getirilir.
Demo çalışması:​
 

Ekli dosyalar

  • PC_to_PIC_temz.rar
    187.4 KB · Görüntüleme: 17
yorumlarınız için teşekkür ederim aslında asm yi daha çok seviyorum basic yada c yazabilirim programı.Sayın uzuner aslında çalışmanızı takip etmiştim indirdim ve deneyecektim fakat seri port programı çalışırken hata verdi sizden kaynaklı değil ben laptop ile denediğimden
com port hatası yaşadım.aslında usb com çeviricimde var ama bakmaya fazla zamanım olmadı.Asm de çok zor değil aslında sadece asm de iyi bir kaynak yok tüm pic komutlarını içeren...
 
Merhaba
Linkteki driver ile laptopta sanal bir seriport oluşturabilirsiniz.Yazmış olduğum VB kod ile de hangi usb'nin otomatik olarak seriport olarak atandığını bulabilirsiniz.Kolay gelsin.


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
ComboBox1.Items.Clear()
Dim port As String
Try
For Each port In System.IO.Ports.SerialPort.GetPortNames()
ComboBox1.Items.Add(port)
Next
Catch ex As System.Exception
End Try
ComboBox1.SelectedIndex = 0
End Sub
 

Ekli dosyalar

  • PL-2303_Driver_Installer.rar
    1.4 MB · Görüntüleme: 7
Terminale sayı yazdığınızda string olarak gönderilir. Yani 1 yazdığınızda 0x01 değil 0x31 iletilir. Muhtemelen doğru çalışmaması bu yüzden.

Pic açılışına biraz gecikme (1000 ms kadar) koyup printf("start\n\r") yazdığınızda da terminale hala herhangi birşey basmaz ise sorunu başka yerde arayalım.

Terminal programı olarak da şunu kullanmanızı şiddetle tavsiye ederim. Hyperterminal, Realterm vb. birçok programı kullandım ama bir şekilde hep sorun yaşadım.

Aylardır her türlü seri port işlemlerimde bu açık kaynak kodlu programı kullanıyorum. Gerçekten güzel. Gerekirse kaynak kodu açıp istediğiniz şekilde de düzenleme yapabilirsiniz.
 
sayın Pioner5900;

yazdığınız programda adc çakışması var. belki de sorunun kaynağı budur.

adc çakışmasını engellemek için #device adc=8 satırını silmelisiniz.

kolay gelsin..

iyi çalışmalar
 
teşekkür ederim arkadaşım ona hiç dikkat etmemiştim
 

Forum istatistikleri

Konular
128,198
Mesajlar
915,767
Kullanıcılar
449,979
Son üye
schule48

Yeni konular

Geri
Üst