Picproje Elektronik Sitesi

DERLEYİCİLER => PIC C => Konuyu başlatan: bigfish - 09 Ocak 2011, 01:54:43

Başlık: rs232 integer göndermek
Gönderen: bigfish - 09 Ocak 2011, 01:54:43
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 ]
Başlık: Ynt: rs232 integer göndermek
Gönderen: bigfish - 09 Ocak 2011, 02:59:31
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.
Başlık: Ynt: rs232 integer göndermek
Gönderen: neural - 09 Ocak 2011, 11:08:29
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.
Başlık: Ynt: rs232 integer göndermek
Gönderen: bigfish - 09 Ocak 2011, 12:56:55
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
Başlık: Ynt: rs232 integer göndermek
Gönderen: sigmoid - 09 Ocak 2011, 13:00:12
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
Başlık: Ynt: rs232 integer göndermek
Gönderen: 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.
Başlık: Ynt: rs232 integer göndermek
Gönderen: bigfish - 09 Ocak 2011, 13:34:26
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
Başlık: Ynt: rs232 integer göndermek
Gönderen: iyildirim - 09 Ocak 2011, 13:56:20

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);
}

Başlık: Ynt: rs232 integer göndermek
Gönderen: kudretuzuner - 09 Ocak 2011, 14:00:20
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.

Başlık: Ynt: rs232 integer göndermek
Gönderen: EMG81 - 09 Ocak 2011, 14:23:06
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ı ?
Başlık: Ynt: rs232 integer göndermek
Gönderen: EMG81 - 09 Ocak 2011, 15:04:22
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...
Başlık: Ynt: rs232 integer göndermek
Gönderen: iyildirim - 09 Ocak 2011, 15:52:52
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.
Başlık: Ynt: rs232 integer göndermek
Gönderen: EMG81 - 09 Ocak 2011, 16:14:04
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...
Başlık: Ynt: rs232 integer göndermek
Gönderen: iyildirim - 09 Ocak 2011, 16:45:02
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.

Başlık: Ynt: rs232 integer göndermek
Gönderen: bigfish - 09 Ocak 2011, 19:03:12
iyildirim hocam örnek kod için saol denerim en kısa zamanda.
Başlık: Ynt: rs232 integer göndermek
Gönderen: bigfish - 09 Ocak 2011, 20:29:52
Hocam burda cmdBuffer ın tanımını göremedim.Kod eksik çıkmış olabilir mi?

Alıntı yapılan: iyildirim - 09 Ocak 2011, 13:56:20

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);
}

Başlık: Ynt: rs232 integer göndermek
Gönderen: iyildirim - 09 Ocak 2011, 21:40:37
Unutmuşum ...
cmdBuffer' ı fonksiyon dışında genel olarak tanımlarsan sorun çıkmaması gerekli.
Başlık: Ynt: rs232 integer göndermek
Gönderen: bigfish - 10 Ocak 2011, 00:41:10
Hocam kodla ilgili 1-2 sorum var :
*Bellek sorunu olursa ' dan kastınız sadece atol fonksiyonu için .h dosyasını eklemek lüks olur anlamında mı?
*Sizin verdiginiz kodu anladım ama orada tanımladıgımız fonksiyon input argumanı almıyor,stringin sayı degerini hesaplayıp çağrıldıgı yere geri döndürüyor.Dışarda tanımla demiştiniz bu durumda cmdBuffer=gets() işimizi görür mü? Ya da bunun dışında nasıl okuyabiliriz?Çünkü esas sorun elimde olan bi stringi çevirmekten ziyade PC tarafından gelen sayıyı alıp (string olarak) sayı tipine çevirmek.
*Bir de son olarak şu kod için stringin sonu 0X00 ile bitsin demişsiniz.Onu nasıl ekleyebilirim?Ascii karakteri olarak mı?
unsigned char s[5];
unsigned int i;

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

Tşkrler tekrar
Başlık: Ynt: rs232 integer göndermek
Gönderen: iyildirim - 10 Ocak 2011, 02:21:53
Evet, Sadece atol için bellek de kısıtlıysa lüks olur anlamında. Ekteki kodu da topu topu 8 k belleği olan bir mcu için çok önceleri yazmıştım. Library ye yer kalmadığı için.  Eğer bellek sorunun yoksa standart kütüphane fonksiyonlarını kullanmayı tercih ediyorum, öneririm.

Kodu anladı isen kendine göre istediğin gibi düzenleyebilirsin. Fonksiyon dediğin gibi dışarıda tanımlanan bir string üzerinde işlem yapıyor.
gets() eğer standart IN doğru tanımlandı ise iş görmeli.
Bunun dışında direkt olarak UART modülünden kendin okuyabilirsin. Basit anlatımla; bir sayac-pointer-indis kullan, bunu sıfırla, UART RX kesmelerinde gelen datayı  sayacı da kullanarak buffera at sayacı arttır. CR (ASCII 13)  gibi bir karakter geldiğinde sona 0x00 ekle atol veya diğer fonksiyona yolla. 
C de stringlerin sonunu 0x00 karakteri ile anlıyoruz.
Özel olarak 16F ve CCS için UART okuma ile ilgili bir elimde bir şey yok. Derleyiciden bağımsız konuların dışında yardımım maalesef olmaz.
Olası hatalardan biri de baut hızlarının hatalı olmasıdır. Test etmek için önce PIC den PC ye birşeyler yolla. PC de doğru olduğunu gördükten sonra PC'den PIC'e veri gönderme kısmına geçmeni öneririm.
Kolay gelsin.
Başlık: Ynt: rs232 integer göndermek
Gönderen: bigfish - 10 Ocak 2011, 03:17:00
Peki çok teşekkürler.UART ı başka forumlarda da tavsiye ettiler biraz araştırsam iyi olucak..