rs232 integer göndermek

Başlatan bigfish, 09 Ocak 2011, 01:54:43

bigfish

Merhabalar,

Seri port üzerinden karakter yollarken sorun yok, ancak integer yollamak istedigimde sorun yaşıyorum.Sayıları hangi formatta yollamalı ve pic tarafında hangi  fonksiyonla hangi formattaki değişkene atamalıyım?

Teşekkürler

[Umarım bu da üzeri çizilip kapanmaz,malesef arama özelliği ile bugüne kadar aradıgımı bulamadım ]

bigfish

Pic = 16f877
compiler = ccs c
Pc tarafında şimdilik CCS C nin içindeki seri port iletişim aracını ve windowsun hyperterminal programlarını kullanıyorum,ikisi de şimdilik işe yarıyor,ama 500,1000 gibi integer degerlerini göndermeyi beceremedim.

neural

RS-232 ile genelde bir defada 8 bitlik sayıları gönderebilirsiniz.
8 bitten daha büyük sayılar için iki defada ya da daha fazla tekrar ile gönderebilirsiniz.

Hyperterminale yazdığınız karakterler 8 bitlik ASCII karşılığı olan değerler halinde karşı tarafa gider. Alıcı tarafında aldığınız değerler sizin yorumunuza kalmıştır.
Örnek vermek gerekirse "A" karakterini gönderdiğinizde 65 integer değeri gönderilir. Bu değeri aldığınızda ister "A" olarak yorumlayın ister 65 sayısı olarak yorumlayın, bu size kalmıştır.

Hyperterminale 1000 sayısı yazdığınızda karşı tarafa bunların ASCII karşılığı gönderilir. Yani "1","0","0","0" değerleri gider. Siz bunları alıcı tarafında bir diziye yazıp basamak değerlerine göre gerçek değerini hesaplamanız gerekmektedir.

Ayrıca belirtmek isterim, iletişimi iki ayrı mikrodenetleyici ile yapıyorsanız daha farklı bir yol izleyebilirsiniz. Integer veri tipini 8 bitlik iki sayı halinde yollayıp, alıcı tarafında iki 8 bitlik sayıyı birleştirebilirsiniz.

Kolay gelsin.

bigfish

Hocam cevap için saol,

Pc tarafından sayı rakam karakterlerini yollayıp,pic üzerinde sırayla alıp sayıya çevirmeye çalıştım.Ama bu bazen çalışıyor bazen çalışmıyor.Ben kodumu 4 karakter okuyacak şekilde yazdım ama bazen 3 bazen 5 te ekranda sonuc görüyorum.Bazen de hiç veri gelmiyor.[Aldıgı sayıyı yazması için printf ekledim pic tarafında]
Bilmiyorum çok basit bi mantık hatası mı yapıyorum,pic tarafındaki kodumun sembolik hali şu :

******************
tanımlar vs
rs232.....

void main()
{
i=0;
char gelenveri[4];
while(1) //sonsuz döngü
{
4 tane karakter oku ,aralarında 50ms delay olsun,her okudugunu gelenveri dizisine at
4 karakteri birleştirip sayıya çevir
}
}

Kodum kabaca böyle.Aralardaki delaylerde ya da buffer boyutunda bir sorun olabilir mi?Saatlerce ugrastım ama işin içinden çıkamadım.Özetle tek bir karakter yollayıp alabiliyorum ama string olarak yollayıp almakta sorun var.

Teşekkürler şimdiden

sigmoid

ccs de 8bitlik sayilari 16 ve 32 bit yapmak için make16() ve make32() fonksiyonlari var. 16 ve 32 bitleri 8er bit yapmak için hazir fonksiyon var mi bilmiyorum. ben kaydirma ve and komutlari ile 8er bite ayiryorum

int sayi
char lsb, msb
lsb= sayi

iyildirim

PC den sayıları karakter olarak (ASCII 48-57 arası) yollayın. PIC tarafında aldığınız karakterleri atol, atof gibi bir fonksiyonla sayısal karşılıklarına çevirebilirsiniz.

bigfish

Alıntı yapılan: iyildirim - 09 Ocak 2011, 13:28:25
PC den sayıları karakter olarak (ASCII 48-57 arası) yollayın. PIC tarafında aldığınız karakterleri atol, atof gibi bir fonksiyonla sayısal karşılıklarına çevirebilirsiniz.
Hocam onu denedim.Ledleri yakarak da kontrol ettim atol veya atof la çevirdigimde sonuc "<=0" (sıfıra eşit veya küçük) oluyor.Integer limiti,okuma sıklıgı (araya konulan delay ler) ya da buffer size kaynaklı olabilir mi?Bu tarz bi işlemde sık düşülen hata nedir söylerseniz onu bulmaya çalışayım.

Teşekkürler tekrar

iyildirim

unsigned char s[5];
unsigned int i;

char = "1234";
i = atol(char);

Buna benzer birşeyin çalışması gerekli. String'in sonu 0x00 ile bitsin. hem string hemde integer declarasyonlarını kontrol edin. Eğer library den sadece Atol fonksiyonu kullanmanız gerekli ve bellek sorunlarınız oluşursa alttakine benzer birşey de kullanılabilir.  Tavsiyem olabildiğince standart fonksiyonları, kütüphaneleri kullanmanız. Sorun devam ederse string doğru aldığınızdan emin olun.
signed long getval()
{
	signed char signVal = 1; 
	signed long cmdVal = 0; 
	signed char exitLoop = 0;
	unsigned char BufferPtr = 0;
	
	while (exitLoop == 0)
	{
		switch(cmdBuffer[BufferPtr])
		{
		case '-': 	
			signVal = -1;
			BufferPtr++;
			break;
			
		case '+':
			signVal = 1;
			BufferPtr++;
			break;
			 
		case '0':
		case '1':
		case '2':
		case '3':
		case '4':
		case '5':
		case '6':
		case '7':
		case '8':
		case '9':
			cmdVal = cmdVal * 10 + cmdBuffer[BufferPtr]-48; 
			BufferPtr++;
			break;

		default:
			exitLoop = 1;
			break;
		}
	}

	cmdVal = signVal * cmdVal;

	return(cmdVal);
}


kudretuzuner

Merhaba

"neural
Müdavim   Ynt: rs232 integer göndermek
RS-232 ile genelde bir defada 8 bitlik sayıları gönderebilirsiniz.
8 bitten daha büyük sayılar için iki defada ya da daha fazla tekrar ile gönderebilirsiniz.
Hyperterminale 1000 sayısı yazdığınızda karşı tarafa bunların ASCII karşılığı gönderilir. Yani "1","0","0","0" değerleri gider.
Hyperterminale yazdığınız karakterler 8 bitlik ASCII karşılığı olan değerler halinde karşı tarafa gider. Alıcı tarafında aldığınız değerler sizin yorumunuza kalmıştır.
Örnek vermek gerekirse "A" karakterini gönderdiğinizde 65 integer değeri gönderilir. Bu değeri aldığınızda ister "A" olarak yorumlayın ister 65 sayısı olarak yorumlayın, bu size kalmıştır."

Arkadaşın yazdıklarına tamamen katılıyorum.Yalnız müsaade ederseniz ufak bir farkı belirteyim.terminalden
1000 değerini yollarken karşı tarafa 1'in ASCII karşılığı   H'31'  (binary  B'00110001') sıfırların da karşılığı olarak üç tane  H'30' (binary B'00110000') gider.Bu ayrıntıyı kaçırmamanızı tavsiye ederim.PIC'e giren bu datalar PIC'te "xor" ile karşılaştırılarak PIC'teki mevcut program dataları ile karşılaştırılabilir.Kolay gelsin.

Amatör

EMG81

Arkadaşlarlar affınıza sığınarak soruyla alakasız ama konuyla alakalı bir şey sormak istiyorum...

Şimdi yapacağım yeni bir projede 10 tane ayrı devreyi rs232 ile kontol edicem. haberleşme için her birine 10 kod gönderiyorsam başına "1" ,"2" gibi verileri gönderip devreleri seçicem. Her devreye max232 atayım diyorum ama maxlar tek com porttan çalışacağından ( yani girişleri aynı ve paralel) empedans yada başka bi sorun çıkartırmı ? böyle bir deneyimi olan varmı ?

EMG81

Onlarıda kullandım, biliyorum... Fakat pc den göndereceğim için direk Rs232 olsun istedim. Diğer türlü pc kısmına bi Max 232(lojik seviyeye çekmek için) ve birtanede 75176(rs485) ve güç kaynağı kullanmam gerekicek buda eğer max232 paralel bağlantıda sorun çıkartmıyorsa gereksiz teferruat oluyor...

iyildirim

EMG81
Lojik seviyede kapı veya diyotla 3 lü paralel bağlantı yapmıştım. rs232 seviyesinde ne olur bilmiyorum. logic seviyeden 232 seviyesine geçerken işaret invert edilip +12 -12 volt seviyesine yükseltiliyor. datasheetinde max232 nin giriş empedansı 3-7k, çıkış empedansı min 300ohm yazılmış (ki neden sadece min yazıldığını anlamadım.). Çalışırmı yada kaç tane paralel bağlantıya kadar çalışır denemek lazım. max232 çıkış katı nasıldır bilmiyorum. PC tarafındaki rx ile devre tarafındaki tx ler arasına katodu pc ye bakacak şekilde diyot ekleyerek bağlantı yapmayı deneyebilirsin. Anotdan önce uygun bir direnç de, sanırım 2-3 k şaseye bağlanabilir.

EMG81

#12
Yani Diyot ile Pc nin RS232 sini yalıt diyorsunuz değilmi ? Doğrumu anlamışım ? pralel ler diotların katoduna anotlarda max232 lere .



haa bu arada şase değilde Vcc olması gerekir diye düşünüyorum. Rs232 terrs oduğundan beklemede 0 olacak diyot iletimde 1 lerde kesimde olduğunda max girişi Hi z olacağından 12 v  luk 1 ler iletilmeyebilir...

iyildirim

Doğru, katotlar birleşecek.
Bu max232lerin aynı anda veri göndermeyeceğini varsaydığımızda, rs232 de stop veya idle durumunda -12 volt, start biti +12, stop bitide -12 volt ve bitleri de invert ederek 0 olan bitleri +12, 1 olan bitleri -12 volt ve ile gönderdiğini de düşündüğümüzde  +12 ile -12 yi yalıtmayı sağlar.
Edit: Anotlardaki  dirençler eğer gerekirse empedans uyumluluğunu sağlamak için.


Ancak katotları ortak ve pcye bakan diyotlardan nasıl -12 volt geçeceği de sorun. Eğer şase yani 0 volt pc tarafının işini görürse ortak katotları 1-2k ile şaseye bağlamak yetebilir. Yok eğer bu iş görmez ise max232 lerde çift devre olduğundan max232lerden birinin tx pininden 1 kablo fazla çekip  -12volt sağlanıp buna bir direnç atılabilir. Bu durumda tx den kablo çektiğimiz devrenin girişi de sinyalin invert edildiğini düşünerek Pull-up yapılmalı.
Sanırım biraz deneme yapılmalı. Varsa bir osiloskopla sinyal seviyeleri incelemek doğru direnç değerleri için faydalı olur. Olup olmayacağını bende merak ettim.


bigfish

iyildirim hocam örnek kod için saol denerim en kısa zamanda.