#use rs232 parametrelerini sonradan değiştirme?

Başlatan Nedenler, 20 Ekim 2014, 11:55:57

Nedenler

#define _BAUD   9600
#define _BITS   8
#define _STOP   1
#define _PARITY E
#use rs232(baud=_BAUD, xmit=pin_D6, rcv=pin_D7, bits=_BITS, stop=_STOP, parity=_PARITY, stream=ASCII)

Kullanıcı kendi cihazının haberleşme ayarlarına göre stop bit, parity, baud değerlerini değiştirsin istiyorum.
Fakat ne #use rs232 komutu bir fonksiyon içinde kullanılıyor ne de parametre olarak bir değişken alıyor.
Ne yapabilirim?

Gökhan BEKEN

Madem değişkenden alıyor, siz de bu tanımları:
#define _BAUD   9600
#define _BITS   8
#define _STOP   1
#define _PARITY E

önce değişkene aktarın sonra, parametre olarak o değişkeni verin.
unsigned char baudrate=_BAUD;
unsigned char kacBitlik=_BITS;
unsigned char stopBiti=_STOP;
unsigned char eslik=_PARITY;
#use rs232(baud=baudrate, xmit=pin_D6, rcv=pin_D7, bits=kacBitlik, stop=stopBiti, parity=eslik, stream=ASCII)
Özel mesaj okumuyorum, lütfen göndermeyin.

Nedenler

Yok hocam yanlış anlaşılma oldu tam tersine değişkenden almıyor, sabit istiyor.
Programın başında tanıtıyorum sabitle sıkıntı yok.
Fakat program çalışma durumundayken kullanıcı "benim cihazımın paritisi none ayarlı bunun da paritisi none olsun, stop biti 2 olsun" diye değişmek istediğinde kalıyorum öyle.

sadogan

Çalışma anında uart hızınıdeğiştirmek için ccs de fonksiyon var
set_uart_speed(baud speed);

Nedenler

Baudrate cepte. Stop bit ve parity bilgilerini de değiştirmek istersem ne yapmaliyim?

RaMu

#5
#define ....
bir derleyici preprocessor (önişlemci) bildirimidir,
yani sadece program derlenirken kullanılabilir
sabit birşeydir,
derleyiciye şunu şöyle yap burayı şunlarla derle gibi şeyler söyler,
program çalışırken o görevini çoktan yapmıştır,
çalışma esnasında bir müdahalesi söz konusu değildir.

CcsC nin helpini inceleyin,
"set_uart_speed(istediğin baudrate )"
bu fonksiyonla program çalışırken (runtime) baud değerini değiştirebilirsin.

Parity değiştirmek için fonksiyon var mı bilmiyorum ama
aslında olmaması gereken bir durum yani gereksiz diyebiliriz,
yinede parity ayarını değiştirmek için sonradan yazılmış fonksiyon var,
bunun yanında kullandığım mcunun daasheetini inceleyip
hangi registerının hangi bitini değiştirirsen parity ayarını değiştirmiş olursun
bilgisine ulaşabilir bu şekilde runtime parity ayarı yapabilirsin.
Aşağıdaki linklerdede belirtildiği gibi
rs232 de karşındaki cihazın özelliklerini genelde önceden biliyor olursun
hatta biliyor olman gerekir,
yinede karşısındaki cihazın baudrate ine göre kendi baudrae ini
otomatik ayarlayan programlarda yazılmış zamanında.

http://www.ccsinfo.com/forum/viewtopic.php?t=45937&view=previous
http://www.ccsinfo.com/forum/viewtopic.php?t=26561
http://www.ccsinfo.com/forum/viewtopic.php?t=52349
https://www.ccsinfo.com/forum/viewtopic.php?p=52966
https://pic-c.com/forum/viewtopic.php?t=48765&view=next
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

oyaz

#6
Sisteminde Modbus vb. bir haberleşme var ise stop bit, parity gibi bilgileri register olarak dışarı çıkarırsan kullanıcı bunları istediği gibi değiştirebilir.

Sende be değişen değerleri alıp haberleşme ayarlarında kullanabilirsin.

Alıntı Yap#define ....
bir derleyici birdirimidir,

Ayrıca #define derleyici değil, preprocessor birimidir.
Become a learning machine...

RaMu

Alıntı yapılan: oyaz - 20 Ekim 2014, 13:11:55
Ayrıca #define derleyici değil, preprocessor birimidir.
Teşekkür ederim, mesajı düzelttim.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

justice_for_all

#byte variable_name = getenv("Register_Name")

yukarıdaki kodla registere ulaşabilirsiniz ordan ilgili registerin ilgili bitini değiştirebilirsiniz.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

Nedenler

Bu konuya yeniden değinmek istiyorum. Cevaplar beni bir yere kadar getirdi fakat tıkandım. CCS C üzerinde bulunan modbus kütüphanesini kullanıyorum. RTU Slave olacak cihazım.

TXSTAx registerının TX9 biti 0 olursa None Parity 1 olursa Even veya Odd parity olacak demek.
TXSTAx registerının TX9D biti de gönderilecek datadaki 1 değerinde olan bitlerin sayısına göre haberleşme hattı even kurulduysa çifte odd kurulduysa 1 veya 0 belirlenerek teke tamamlanıyor.

Ancak ben runtime'da parity'yi değiştirdiğimde TX9D değerini nerede değiştireceğim?
Data geldiğinde programın neresinde bunu karşılaştıracağım tüm bunları manuel yapacaksam kütüphaneler, derleyiciler neye yarıyor?

Kullanıcı cihazı alıp enerji verecek ve kendi master cihazına göre benim cihazımın haberleşme ayarlarını değiştirecek. Nasıl?
Bu son derece makul bir istek halbuki.

Nedenler

Bu konuda yardımcı olabilecek biri yok mu?
Runtime'da parity ve stop bit değerlerini değiştirmek istiyorum.
Yabancı forumlara da baktım çözümler yeterli değil.

Gökhan BEKEN

@Nedenler ccs c'de registerlara kolayca ulaşamıyorsun. Bu yüzden datasheetten ilgili register'ın hex adresine bak.
Sonra bir pointer tanımla, adres olarak datasheetten bulduğun adresi göster. Sonra istediğin gibi değer ver.
örn:
unsigned char * TXSTAx; // pointer tanımlıyoruz
TXSTAx = (unsigned char *)0xABCD; // registerin adresini gösteriyoruz
TXSTAx = 0x39; // değer veriyoruz
Özel mesaj okumuyorum, lütfen göndermeyin.

Nedenler

@meftun
Hocam malesef PIC'de stop bit ve parity değerlerini tutan bir register yok. Varsa da ben bulamadım. Bu değerler değiştirilecekse manuel olarak aktarılacak datadaki bitleri saymak uygun bir yerde parity hesaplayıp değiştirmek stop bitini ayarlamak vs gerekiyor. Bunlarla henüz uğraşamadım. Keşke öyle bir biti değiştirip stop biti 1 veya 2 olarak ayarlayabilsek parity'yi değiştirebilsek falan.

Salih

Alıntı yapılan: Nedenler - 29 Aralık 2014, 13:22:59
@meftun
Hocam malesef PIC'de stop bit ve parity değerlerini tutan bir register yok. Varsa da ben bulamadım. Bu değerler değiştirilecekse manuel olarak aktarılacak datadaki bitleri saymak uygun bir yerde parity hesaplayıp değiştirmek stop bitini ayarlamak vs gerekiyor. Bunlarla henüz uğraşamadım. Keşke öyle bir biti değiştirip stop biti 1 veya 2 olarak ayarlayabilsek parity'yi değiştirebilsek falan.

Hangi PIC için soruyorsun?

Nedenler