c18 seri port sorunum

Başlatan Gökhan BEKEN, 24 Haziran 2013, 10:35:12

Gökhan BEKEN

Burdaki kodları kullanıp bir deneme yaptım:
http://elkitabim.net/2012/09/19/c18-diliyle-robot-programlama-rs232-seri-haberlesme-usart/
kristal 10mhz, picin frekansıda 10mhz, virtual driver baud rate: 9600
sonuç olarak yazdığım şeylerden farklı sonuç alıyorum.

Kodları ve isis dosyasını buraya yükledim: http://www.4shared.com/rar/W6tETTQK/c18_seri_port.html

Özel mesaj okumuyorum, lütfen göndermeyin.

kenan_re

BAUDCON ayarlarınıza dikkat edin bende aynı sorunu yaşamıştım. Derleyicim olmadığı için deneyemedim ama kod da bu adresin ayarı yapılmamış

XC8 derleyicide ki ayarım bu benim.

   baudUSART (BAUD_IDLE_RX_PIN_STATE_HIGH & BAUD_IDLE_TX_PIN_STATE_HIGH &   BAUD_IDLE_CLK_LOW & BAUD_16_BIT_RATE & BAUD_WAKEUP_OFF & BAUD_AUTO_OFF);

Gökhan BEKEN

#2
Teşekkürler.
4mhz ile denedim sorun yok. Yüksek frekansta sorun çıkıyormuş ancak benim yüksek frekansta çalıştırmam lazım.
putrsUSART("yazı"); komutu ile gönderebiliyorum sadece, diğerleri göndermiyor.
Özel mesaj okumuyorum, lütfen göndermeyin.

jackal183

yüksek frekansta sorun çıkacağını sanmıyorum, 18f452 ve 18lf25k22 ile hem 4 mhz hem 10 mhz hem de 16 mhz de usatr ile çalıştım, brgh ve pll kavramları önemlidir baud rate ayarların için. linkte vermiş olduğun kodları bilmiyorum , ben c18 de kütüphaneleri kullanmıyorum registerları kendim ayarlıyorum. ama koda baktığında brgh high yapılmış ve spbrgye 25 yüklenmiş galiba. bu değerleri datashetten kontrol edip uygun olanı seçmen gerekli

kenan_re

#4
benim içinde benzer bir durum gerkliydi. ilk 600baud ile sonradan 9600 baud çıkmam gerekiyordu BAUDCON ile SPBRG ve SPBRGH değerlerini 16 Bit olarak ayarlıyarak çok geniş bir yelpazede veri hızı ayarlıyabiliyorsun. Yukarıda verdiğim ayarlar ile 16 Bit olarak ayarlı.

Aşağıda verdiğim kodlar ise 877A için c18 yazdıklarım tanımlı olan init_comms_9600() makrosunu setup anında çağırsan otamatik olarka gerekli değerleri sana 8 Mhz için ayarlıyacaktır.
#ifndef _SERIAL_H_
#define _SERIAL_H_
     
#define FOSC 8000000L
#define NINE 0     /* Use 9bit communication? FALSE=8bit */
#define HIGH_SPEED 0
#define DIVIDER_9600 ((int)(FOSC/(16UL * 9600) -1)) //BRGH=0 hızına göre baud hesabı
#define DIVIDER_600 ((int)(FOSC/(64UL * 600) -1)) //BRGH=1 hızına göre baud hesabı
#define NINE_BITS_1 0x40
#define NINE_BITS_0 0
#define SPEED_9600 0x4
#define SPEED_600 0
#define RX_PIN TRISC7
#define TX_PIN TRISC6

/* Serial initialization */
#define init_comms_600()\
	RX_PIN = 1;	\
	TX_PIN = 1;		  \
	SPBRG = DIVIDER_600;     	\
	RCSTA = (NINE_BITS_0|0x90);	\
	TXSTA = (SPEED_600|NINE_BITS_0|0x20)
	
#define init_comms_9600()\
	RX_PIN = 1;	\
	TX_PIN = 1;		  \
	SPBRG = DIVIDER_9600;     	\
	RCSTA = (NINE_BITS_0|0x90);	\
	TXSTA = (SPEED_9600|NINE_BITS_0|0x20)

void putch(unsigned char);
unsigned char getch(void);
unsigned char getche(void);

#endif

Gökhan BEKEN

@kenan_re
hocam çok teşekkür ederim
SPBRG = ((int)(8000000L/(16UL * 9600) -1)); // 8mhz için bunu yaptım oldu
SPBRG = ((int)(20000000L/(16UL * 9600) -1)); // 20mhz için bunu yaptım oldu
Özel mesaj okumuyorum, lütfen göndermeyin.