sn75176

Başlatan chaconne, 21 Haziran 2009, 19:39:32

chaconne

Merhaba.

İki pic arasında bir seri haberleşme devresinde RX ve TX bacaklarını direk olarak birbirlerine bağladığım zaman program normal çalışıyor.
Fakat sn75176 kullandığım zaman çalışmıyor. Veri gönderim ve alımı için her pice ait birer tane sn75176 entegresi var ve programın bu entergre ile beraber çalışabilmesi için tek yaptığım veri göndermeden önce de/re pinini set edip, veri gönderiminden hemen sonra bu pini sıfırlamak(her entegrenin de ve re bacakları birbirleri ile bağlı). Problem neden kaynaklanıyor olabilir?

Not: Programı hitech ile programlıyorum.

OG

PIC RX pini data alımı başlamadan önce High konumunda olmazsa (data invert ise LOW) ilk datayı kaçırabiliyor veya hatalı data alabiliyor. Bu pine pullup direnç bağlayın (data invert ise pulldown).

FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

askb

Alıcı tarafdaki SN ucunun RE ve D ucunu low durumda olması gerekır.Buna dıkkat et calısır.

chaconne

Pullup direnci ile olmadı.
Diğeri için ise dediğim gibi sadece veriyi gönderirken de/re pinlerini high yapıyorum, gönderme işlemi biter bitmez lowa çekiyorum. iki pic için de geçerli.
proteusta gözlemlediğim durum şu:
A denetleyicisi ilk veriyi gönderiyor, B denetleyicisi alıyor.
B denetleyicisi veri gönderiyor,  A denetleyicisi veri almıyor, B denetleyicisinin RCIF biti tekrar set oluyor.

chaconne

Şöyle gözlemledim.
A mikrodenetleyicisi bir veri gönderiyor. B mikrodenetleyicisi bu veriyi alıyor. Sonra B mikrodenetleyicisi aldığına dair bir onay mesajı gönderiyor. Bu mesaj karşıya gitmiyor, ayrıca B mikrodenetleyicisi A'dan gelen bir veri olmamasına rağmen veri alıyor(ya da aldığını sanıyor gelen veri 0).
Dediğim gibi iki denetleyicinin RX ve TX bacaklarını uygun şekilde birbirine direk bağlayınca program çalışıyor. Aradaki tek fark araya iki taraf için de birer max487 koyup, veri göndermeden önce de/re'yi set edip, gönderdikten sonra sıfırlamak.
Sorun ne olabilir?

Not: Veri alışverişinde kesme kullanmıyorum, iki programın da kendi döngüleri var, turu bitip geldiğinde kesme bayraklarını test ederek haberleşmeyi sağlıyorlar.

OG

chaconne,
Program yazan insanlar yani bunun ne demek olduğunu bilenler, kod/şema vs vermeden, nasıl olur da program hatalarında detaylı yardım isterler ben gerçekten anlayamıyorum.

Bu sitenin adını müneccimler sitesi olarak mı değiştirsek?
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

94220039

485 haberleşmesinde başlangıç olarak 4-telli yapının kullanılmasını tavsiye ederim. 2-telli çalışma biraz daha karmaşıktır.

chaconne

Bir forumda çok mesaj atan insanlar neden ters konuşmayı severler ben de onu anlayamıyorum.
Öncelikle mantık olarak bir hata olup olmadığı konusunda yardım almak adına gerekli ve yeterli açıklamaları yaptım. Yukarıda yazdığının yerine "Dediklerinde mantık olarak bir sorun görünmüyor kodlar olmadan daha fazla yardımcı olmak zor" denilebilir. Bu durumda ikinci aşama olarak kodlar gönderilir. Bu kadar basittir.

OG

Bunun neresi ters cevap, veya neresi mantığa aykırı?

Kardeş bak biz de birinci aşaması için bildiğimizi yazmıştık, üşenmedik prensip bir şema çizdik.  Sen de programındaki gizlemen gereken bölümleri silersin, basitçe problemli olan haberleşme kısmını alırsın, ufak bir zahmetle de isis şemasını yollarsın ki buradakiler hızlıca göz atıp görebildiğini aktarsın.

Veya oturup senin aklından geçenleri anlamaya çalışarak, senin için Hi-Tech de bahsettiğin şekilde bir program yazacak, sonra hata varmı bakacak, hata bulursa çözümünü arayacak...

Hangisi ters, hangisi mantık dışı?
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

chaconne

İlk aşamada öğrenmek istediğim yapılan işlemde basit olarak bi yanlış olup olmadığıydı. Yani direk bağlayınca çalışan devrede araya bu bahsettiğim entegreleri koyduktan sonra temelde tek yaptığım iş olan göndermeden önce dere'yi set edip gönderdikten sonra sıfırlama işleminin doğru ve yeterli olup olmadığı idi. Doğru olduğunu varsayarak kodları gönderiyorum:

// serLib.h
#ifndef SERLIB_H_
#define SERLIB_H_

#endif /*SERLIB_H_*/

#define BAUD 9600      
#define FOSC 4000000L
#define NINE 0     /* Use 9bit communication? FALSE=8bit */

#define DIVIDER ((int)(FOSC/(16UL * BAUD) -1))
#define HIGH_SPEED 1

#if NINE == 1
#define NINE_BITS 0x40
#else
#define NINE_BITS 0
#endif

#if HIGH_SPEED == 1
#define SPEED 0x4
#else
#define SPEED 0
#endif

#define	RX_PIN TRISB1
#define	TX_PIN TRISB2

//void KarakterGonder(unsigned char);
unsigned char KarakterAl(void);
unsigned char getche(void);
void init_comms(void);

void init_comms()
{
	TRISB1 = 1;
	TRISB2 = 0;
	SPBRG = DIVIDER;
	RCSTA = (NINE_BITS|0x90);
	TXSTA = (SPEED|NINE_BITS|0x20);
	//RCIE = 1;
	//GIE = 1;
}

void KarakterGonder(unsigned char byte)
{
	serialEnable = SEND_ENABLE;
	while(!TXIF)
		continue;
	TXREG = byte;
	serialEnable = RECEIVE_ENABLE;
}

unsigned char KarakterAl()
{
	return RCREG;
}


// SerialProcesses.h
void SerialProcesses()
{
	char temp;
	if(serialMode == WAIT_MODE)
	{
		if(RCIF)
		{
			if(serialIndexTX == 3)
			{
				arrayDataOut[serialIndexRC] = KarakterAl();
				serialIndexRC++;
				if(serialIndexRC > 2)
				{
					serialIndexTX = 0;
					serialMode = SEND_MODE;
				}
				else
				{
					serialMode = SEND_MODE;
					b_sendOk = 1;
				}
			}
			else
			{
				if(KarakterAl() == 55)
				{
					serialMode = SEND_MODE;
				}
			}
			RCIF = 0;
		}
	}
	else
	{
		if(b_sendOk == 1)
		{
			KarakterGonder(55);
			serialMode = WAIT_MODE;
			b_sendOk = 0;
		}
		else
		{
			KarakterGonder(arrayDataIn[serialIndexTX]);
			if(++serialIndexTX > 2)
			{
				serialIndexRC = 0;
				serialMode = WAIT_MODE;
			}
			else
			{
				serialMode = WAIT_MODE;
			}
		}
	}
	return;
}

// StartUp.h
void StartUp()
{
	TRISA = 0;
	TRISB = 0b10000010;
	PORTA = 0;
	PORTB = 0;
	GIE = 0;
	
	init_comms();
	
	return;
}

// picA Main
void main(void)
{
	StartUp();

        serialMode = SEND_MODE;
	serialIndexRC = 3;
	serialEnable = SEND_ENABLE;
	serialEnableReg = 1;
	
	while(1)
	{
		DataIn();
		SerialProcesses();
		DataOut();
	}
	
	return;
}

// picB Main
void main(void)
{
	StartUp();

        serialMode = WAIT_MODE;
	serialIndexRC = 3;
	serialEnable = RECEIVE_ENABLE;
	serialEnableReg = 1;
	
	while(1)
	{
		DataIn();
		SerialProcesses();
		DataOut();
	}
	
	return;
}

bymrz

Bence de OG haklı..

Eğer bi problem varsa, o problem tanıtılmalı. Yoksa verilenler olmadan problemin çözümü zordur. Herkes bir şeyler atar tutar denk gelirse alırsın çözümü içerisinden..

Bu arada sen diyorsun ki TX ve RX bacağını direk bağladığında sorun olmuyor. O zaman sorunun ya devre şemasında(sn75176 pin bağlantıları), yada 75176 ların TX ve RX fonksiyonlarını enable/disable yapmanda. Diğer bi ihtimal de kullandığın SN75176 entegrelerinde...

kolay gelsin...

chaconne

Denemeyi proteusta yapıyorum, bu yüzden entegreyle ilgili bir sorun olamaz.
Basitleştirilmiş şemayı da gönderiyorum:


Bu arada kodlarda görülen serialEnable PORTB.0'ı temsil etmekte olup, SEND_ENABLE 1, RECEIVE_ENABLE 0'a tekabul etmektedir.

chaconne

Sorun frame error'dan kaynaklanıyor sanırım. Ama frame error olmasına ne neden oluyor henüz onu bulamadım.