stm8s003 UART Data Bit i 7 olarak ayarlamak

Başlatan izturk, 26 Aralık 2016, 15:03:37

izturk

Merhaba arkadaşlar,

Hali hazırda çalışan bir rs485 haberleşmesinden bir takım bilgiler almak istiyorum. Docklight isimli terminal programıyla bilgilere bakıyorum.
Ancak data bit i 7 yaptığım zaman düzgün veriler geliyor.

Stm8s003 ile bu devreyi yapmak istedim. Ama data biti nereden 7 ayarlayacağımı bir türlü bulamadım.

/////////////////
Bit 4 M: word length.
This bit determines the word length. It is set or cleared by software.
0: 1 Start bit, 8 Data bits, n Stop bit (n depending on STOP[1:0] bits in the UART_CR3 register)
1: 1 Start bit, 9 Data bits, 1 Stop bit
Note: The M bit must not be modified during a data transfer (both transmission and reception) In LIN
slave mode, the M bit and the STOP[1:0] bits in the UART_CR3 register should be kept at 0.
//////////////////

sadece böyle bir register la 8 ve 9 bit ayarlanıyor.

direk ayarlanmasa bile yazılımsal olarak 7 bit için bişeyler yapılabilir mi?

herkese iyi çalışmalar.

eeburakdemir

Peki şöyle bir teklifte bulunsam :)

uint8_t UART1_ReceiveData8(void)
{
  return ((uint8_t)UART1->DR);
}

bu gelen veriyi almak değil mi ? Aldığın veriyi 1 bit kaydırsan nasıl olur ? Tabi 7 bit yaparken hangi bitin nerede olduğu önemlidir belki , ona göre de ara değişken tanımlayıp istediğin bitler ile oynama durumu oluşturulabilir.
Asla pes etme...

izturk

Benim de aklıma böyle birşey yapmak geldi ama veriler arasında bir bağıntı kuramadım.

Örneğin 0x2D  0x2D  0x2D  0x2D 0x6F 0x20 0x50 0x69 0x6E 0x67 gönderiyorum bilgisayardan
             0xAD  0xAB  0xA5  0xBD 0xA0 0x4B 0xEE 0xFE 0x00 0x00 alıyorum

MrDarK

8 Data bits dediği datanın içinde birde parity bilgisi olması gerek o dahil 8 Data biti kullanıyor olabilir.
Usart Init kodlarınızı tam olarak görmek daha kolay çözüm olacaktır.
Eğer Örneğinizdeki datayı tam almak istiyorsanız Data Bits kısmını 9 seçin.
Picproje Eğitim Gönüllüleri ~ MrDarK

Klein

#4
7 bit haberleşen olan uygulamalar genellikle parite biti kullanırlar.  Aldığın veriyi   0x7F ile AND işlemine sokarsan veriyi  düzgün alırsın. Pariteye bakmazsan bu işini görür.  Fakat  karşı taraf parite ile ilgileniyorsa o zaman gönderirken pariteyi eklemen gerek.  Hatırladığım kadarıyla STM serilerinde 7 bit haberleşme yok. Pariteyi kendin eklemen gerek.

Haberleşmeyi 8 bit No parity olarak kuracaksın.
Alırken veriyi 0x7F  ile AND işlemine sokacaksın.
gönderirken  pariteyi hesaplayıp  7. biti 1 ya da 0 yapacaksın.

MrDarK

Klein hocam stm8 de donanımsal parity kullandım. Kendisi hesaplıyor
Picproje Eğitim Gönüllüleri ~ MrDarK

izturk

Mrdark hocam init kodlarını yarın sabah eklerim.
Klein hocam ilk byte tamam
0x7F && 0xAD = 0x2D
Ama ikinci baytta iş bozuluyor
0x7F && 0xAB = 0x2B oysa 0x2D gondermistik.
Arada bir bit kayıp mı oluyor acaba

izturk

void InitUART(void)
{
  UART1_BRR2  = 0x01;           //Baud rate
  UART1_BRR1  = 0x1A;           //Baud rate       
  UART1_CR2_REN  = 1;           //RX açık       
  UART1_CR2_TEN  = 1;           //TX açık
  UART1_CR2_RIEN = 1;           //RX kesmesi aktif
 

}

Klein

Alıntı yapılan: MrDarK - 26 Aralık 2016, 22:19:03
Klein hocam stm8 de donanımsal parity kullandım. Kendisi hesaplıyor
Donanımsal parity var da. 7 bit yok. Parity kullandığında parite 9. bite yazılıyor. 7+1 yok. STM32F103'te yok.  STM8 de de olduğunu sanmam.

Klein

Alıntı yapılan: izturk - 26 Aralık 2016, 23:45:45
Mrdark hocam init kodlarını yarın sabah eklerim.
Klein hocam ilk byte tamam
0x7F && 0xAD = 0x2D
Ama ikinci baytta iş bozuluyor
0x7F && 0xAB = 0x2B oysa 0x2D gondermistik.
Arada bir bit kayıp mı oluyor acaba

Gönderici ve alıcının konfigürasyonu nedir?

Zoroaster

8 bit modunda veriyi göndermeden önce 0x80 ile OR işlemine tabi tut sonucu yolla.

Alırken de gönderen tarafa 2 stop bit yolla de. Ama kendini tek stop bite ayarla ya da gönderen tarafa makineli tüfek gibi veri yollatma iki karakter arasında fasılalar olsun.
Seytan deliginden kacti.

izturk

Arkadaşla sizi boş yere meşgul etmişim sanırım.

İlk denememde olmamıştı. sonradan tekrar baktım ve 8bit olarak ayarlayınca da sistemden aynı verileri aldım. Kusura bakmayın.

Ama yine de olayın mantığını anlamış değilim. Hem 7 bitte hem 8 bitte aynı acsi değerler geliyor. asci 8 bit değil mi. 7 bite ayarlayınca karışması gerekmez mi?