Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

rs232 haberleşme acil yardım

Başlatan lerenler, 26 Temmuz 2012, 18:26:49

lerenler

Selam, bilgisayar yazılımları üzerine uzun zaman harcadım ancak pic programlama konusunda yeniyim. bilgisayarla 16f877 veya 16f887  kullanarak com portu üzerinden iletişim kurmaya çalışıyorum ancak aldığım karakterler gonderdiklerimle uyuşmuyor. Dahili osilatör ve harici osilatorlede denedim. bilgisayar ve pic arasındaki baud rate aynı yaptım farklı hızları denedim. karakterler sayısı dogru baud rate olunca duzgun ( mesala AAA donderdigimde ___  alıyorum) zun arastırmalar yaptım ama işin içinden çıkamadım yardımlarınızı bekliyorum. Hitech standart usart kütüphanesi kullandım ,Fırat Deveci kitabındaki usart örneklerinide denedim aynı sorun. usb to com çeviricidedir dedim onuda değitirdim ancak nafile. Yardımlarınızı bekliyorum.

serhat1990

Değerli Arkadaşım ,

Senden ricam eğer paylaşmanda sakınca yok ise ...

Kodlar + Devre Şeması ve Arayüz programını kendin yazdıysan onun kodları. Görmeden pek bir yardım yapılamıyor.

Eğer şema koyamayacaksan ,

C# ' ı kendin yazdıysan ama emin değilsen Hazır bir terminal programını kullanarak denemen. Max232 Vs her ne kullandıysan bağlantını tekrar kontrol etmen. Baud Ayarlarını iyi kontrol etmen. Baud Rate problemin olabilir. Haberleşme 8 bit data , no parity , 1 bit stop vs ne şekilde kullanıyorsan bunun pc veri alışverişi sırasında aynı şekilde olması...... Uzayıp gidiyor. Devre şeması + kod en iyisi :)

İyi çalışmalar...

lerenler

Yok hemen paylaşıyım ben zaten herhangi bir cod yazmadım problem de orda :)) bir cok farklı terminal denedim hep aynı. Problem gelen karakterlern farklı olması. ( printf("AAA") yazdıgımda ___ geliyor) Burdaki kod hi tech samples altındaki uasrt kodu. dedigim gibi bircok netteki kodu denedim temelleri aynı zaten, ama sonuc aynı oluyor. max232cpe kullanıyorum 1 uf capacitorlerle kullandım. arastırmalarım uzerine max232cpe = max232. farklı kristaller kullanarak farklı ayarlarıda denedim (fosc = 8000000 gibi) ama nedense hep aynı karakterler geliyor yani A yerine _ gibi.

devre semasıda http://www.flickr.com/photos/19818388@N03/7650999964/#in/photostream

main.c
#include <stdio.h>
#include <htc.h>
#include "usart.h"

/* A simple demonstration of serial communications which
 * incorporates the on-board hardware USART of the Microchip
 * PIC16Fxxx series of devices. */

void main(void){
   unsigned char input;

   INTCON=0;   // purpose of disabling the interrupts.

   init_comms();   // set up the USART - settings defined in usart.h

   // Output a message to prompt the user for a keypress   
   printf("\rPress a key and I will echo it back:\n");
   while(1){
      input = getch();   // read a response from the user
      printf("\rI detected [%c]",input);   // echo it back
   }
}


usart.h file
#ifndef _SERIAL_H_
#define _SERIAL_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

#if defined(_16F87) || defined(_16F88)
   #define RX_PIN TRISB2
   #define TX_PIN TRISB5
#else
   #define RX_PIN TRISC7
   #define TX_PIN TRISC6
#endif

/* Serial initialization */
#define init_comms()\
   RX_PIN = 1;   \
   TX_PIN = 1;        \
   SPBRG = DIVIDER;        \
   RCSTA = (NINE_BITS|0x90);   \
   TXSTA = (SPEED|NINE_BITS|0x20)

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


usart.c dosyamız
#include <htc.h>
#include <stdio.h>
#include "usart.h"

void 
putch(unsigned char byte) 
{
   /* output one byte */
   while(!TXIF)   /* set when register is empty */
      continue;
   TXREG = byte;
}

unsigned char 
getch() {
   /* retrieve one byte */
   while(!RCIF)   /* set when register is not empty */
      continue;
   return RCREG;   
}

unsigned char
getche(void)
{
   unsigned char c;
   putch(c = getch());
   return c;
}

serhat1990

Devre şemanda bir hata yok . Sen bu programı nerde deniyorsun. Ben sigorta ayarlarını göremedim. Configuration registerini kontrol etmeni tavsiye ederim.
Şimdilik aklıma gelen bu.

kudretuzuner

Merhaba
Program dilinizi bilmediğim için yazılım hakkında yorum yapamayacağım.Yanlız benim uzun sıkıntılar sonunda bulduğum bazı bilgileri paylaşayım.
1-PC'den yolladığınız 1 baytlık datayı PIC'te aynen görebilirsiniz.Örneğin klavye "1" değeri Hex 31 dir.PIC'in uygun pinlerinden  "00110001"ledlerin yandığını görürsünüz.
2-PIC'ten PC'ye 1 baytlık datayı yolladığınızda örneğin klavye "1"   Hex 31  yolladığınız zaman PC'de  DESİMAL
49 görürsünüz.Sebebini sormayın ben de bilmiyorum.Özetle aşağıdaki link PIC'ten hex olarak ne yollarsam PC'de ne görürüm sorusuna cevap olacak.Anlaşılmayan yerler olursa sorun lütfen.Not,isiste virtual terminalin
(normal-invert) formuna dikkat ediniz.Kolay gelsin.
http://www.table-ascii.com/
Amatör

serhat1990

Alıntı yapılan: kudretuzuner - 26 Temmuz 2012, 22:09:01
Merhaba
Program dilinizi bilmediğim için yazılım hakkında yorum yapamayacağım.Yanlız benim uzun sıkıntılar sonunda bulduğum bazı bilgileri paylaşayım.
1-PC'den yolladığınız 1 baytlık datayı PIC'te aynen görebilirsiniz.Örneğin klavye "1" değeri Hex 31 dir.PIC'in uygun pinlerinden  "00110001"ledlerin yandığını görürsünüz.
2-PIC'ten PC'ye 1 baytlık datayı yolladığınızda örneğin klavye "1"   Hex 31  yolladığınız zaman PC'de  DESİMAL
49 görürsünüz.Sebebini sormayın ben de bilmiyorum.Özetle aşağıdaki link PIC'ten hex olarak ne yollarsam PC'de ne görürüm sorusuna cevap olacak.Anlaşılmayan yerler olursa sorun lütfen.Not,isiste virtual terminalin
(normal-invert) formuna dikkat ediniz.Kolay gelsin.
http://www.table-ascii.com/


Hocam nedenini görmeniz için bu tablo yardımcı olacaktır. İncelemenizi tavsiye ederim.

http://www.asciitable.com/

kudretuzuner

Alıntı yapılan: serhat1990 - 26 Temmuz 2012, 22:16:38

Hocam nedenini görmeniz için bu tablo yardımcı olacaktır. İncelemenizi tavsiye ederim.

http://www.asciitable.com/
Merhaba
Aynı tabloyu ben de verdim de neden 49 geldiğini bilmiyorum.PC'ye Hex olarak gelen data neden desimale döndürülüyor.
Amatör

serhat1990

Hocam normalde PC'de yine '1' görürsünüz. PC klavye vs haberleşmesinde ascii kodlarını kullanır. Siz sonucu nasıl isterseniz öyle görüntüleyebilirsiniz.. Terminal vs programınızda bunu ayarlarsınız ( bazı programlarda ascii olarak görüntülemek , decimal , hexadecimal , binary vs vs ).
Yani aslında hepsi aynı şeye çıkıyor. Binary kodlamaya 1-0 :)
Siz '1' gönderiyorsunuz. 49 alıyorum diyorsunuz yani decimal karşılığını alıyorsunuz demekki kullandığınız program vs size decimal çıktı veriyor. Neden bu Hocam. Görüntüleme türünü ne belirlerseniz o şekilde görüntülersiniz ascii , hexadecimal , decimal...


lerenler

herkese ilgisi icin teşekkür ederim ben yazılımı  cip uzerinde deniyorum pickit 3 ile prog ve debug yapıyorum. mplab ile derliyorum simdi biraz once sizin dediginiz gibi bi durum degil ancak yani gelen veri decimal hex yada ascii olarak bir alaka kurumıyorum. 1 in karsılıgı hx31 gibi olmuyor putch(13) yapıyorum karsılıgında decimal ( 121) hex(79) ascii(y) alıyorum. Sigorta ayarlarımı resimde bulabilrsiniz. http://www.flickr.com/photos/19818388@N03/7652083230/#in/photostream

lerenler

Arkadaslar her nekadar konuyu kendim cozsemde sizlerle paylasmak istedim. Problem çin malı breadborddan kaynaklanıyormuş. pinlerden birinde bağlantı sorunu olusmus ve + besleme yapılmadıgı için rs232 uzerinden pic ne gonderiyorsa onu alıyormusum. Bunu da "A" yerine "_" aldımı soyledim ve biraz arastırınca  "_" karakterinin A karakterinin revert edilmemiş hali oldugunu gordum ve max232 uzerine yogunşastım ama hata dedigim gibi bread borddaymıs.