A

seri iletişimde sorun (YARDIM)

Başlatan ahmet22, 23 Şubat 2013, 02:47:32

ahmet22

merhaba arkadaşlar pc ile pic arasında seri iletişim kurmaya çalışıyorum fakat kafayı yemek üzereyim şuanda kullandıgım kodlar


define osc 4
include "modedefs.bas"
TRISB=%00000000          'B portu çıkış yapıldı
PortB=0                  'B portunun çıkışı Low(0) yapıldı.
         
yolla:
   SerOut portb.2,T2400,["A"]
 
 
    Pause 100
GOTO yolla
END


bunlar biraz acemilik var max232 ve 16f84a kullanıyorum 628 aradım taradım evde kalmamış bu saatte zor bulunur :)

kodumda yanlış varsa yardımcı olabilecek bir arkadaşa ihtiyacım var ve max232 nin kapasitör bağlantılarının ne şekilde olması gerekiyor elinde şeması olan paylaşırsa sevinirim iyi forumlar iyi geceler

ete

Programda eksikler var.  Birincisi sigorta ayarların yok. İkincisi programın açılış gecikmesi koymamışsın onu ilave et.

Genelde seri iletişimde bilgi paketi önüne bir işaretçi koyulur. Senin "A" şelinde verdiğin bilgi aslında bir işaretçidir. Asıl veri onun peşine takılmalıdır. Ama bu şekilde de A bilgisi yollanır.

Max232 bağlantısı için aşağıdaki linkte verilenleri incele.
http://etepic.com/index.php/topic,540.0.html
Ete

ahmet22

#2
SOrunu buldum ve çözdüm teşekkürler arkadaşlar


bilgisayara veri gönderebiliyorum fakat bilgisayardan veri alamıyorum arkadaşlar :(

pwm3434

#3
size  zahmet  ilgenirmisiniz.  pıc ile  pc  arasında  seri  iletişim  uyhulaması  yapmaya  çalışıyorum  ama  maalesef  beceremedim.  c#'da  arayüz  yazarak serial port  yazma ve okuma  yapıp seriport 2-3 pinleri  kısa  devre  yaparak  textbox'da gösterdim  ama  pıc  ile  iletişimi sağlayamadım  dsn ve  pbp dosyalarını ekledim.

pwm3434

ustalarımız  nerede  çok  meşgul  olduklarını  biliyorum  ama  :) yardıma  ihtiyacım  var.

pwm3434

#5
ETE hocam  ekteki  seri  iletişim  programı senin  uygulman. sen  programında  628a  kullanmışın  elimde  mevcut olmadığı  için 876  kullanmak  zorunda  kaldım.

kullandığım  kodlar:
@ DEVICE pic16F876                     'işlemci 16F876                           
@ DEVICE pic16F876, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F876, PWRT_ON             'Power on timer açık
@ DEVICE pic16F876, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE PIC16F876, LVP_OFF
@ DEVICE PIC16F876, CPD_OFF
@ DEVICE pic16F876, XT_OSC

'---------------------------INPUT-OUTPUT ARRANGEMENT----------------------------
PORTA=0:TRISA=0
PORTB=0:TRISB=0 'PORTB.1 is input all others are output.
PORTC=0:TRISC=%10000000
'-------------------COMUNICATION DEFINES----------------------------------------
ADCON1=7
DEFINE OSC 4

'-------------------------VARIABLES---------------------------------------------
Cnt       VAR BYTE 50' Cnt is a word variable
inputData var Byte 51' variable to receive data into
TEMP      var BYTE 52

SYMBOL GIE  =INTCON.7   'genel interruptları açıyor
SYMBOL PEIE =INTCON.6   'peripheralinterruptları açıyor
SYMBOL RCIE =PIE1.5     'USART Recive interrupt enable bit
SYMBOL RCIF =PIR1.5     'USART Receive interrupt flag bit
symbol led1=PORTB.4
SYMBOL Led2=PORTB.5
'---------------------------INITIALISATION--------------------------------------
RCIE=1
PEIE=1
GIE=1
INTCON=%11000000
ON INTERRUPT GOTO INT

START:
      IF Cnt=49 then
          led1=1-led1
          pause 100
          cnt=0
      endif   

      if CNT="A" then
        led2=1-led2
        pause 100
        cnt=0
      endif
      goto start
     
DISABLE
INT:
    GIE=0
    hSerIn , [WAIT ("ETE"),INPUTDATA]
    Cnt=inputdata
    TEMP=RCREG
    GIE=1
    Resume
enable

END


board  da  deneme  yapıyorum  ama  maalesef  hyper termınalden ETE1  ve   ETEA bilgilerini  giriyorum  ledler yanmıyor.  programında  yaptığım   değişiklik  9600 olan  baud'u 2400  yaptım.

hyper  terminalden  deger  girdiğimizde,herbir  girilen  değer  isteğimize bağlı olmadan hyper  tarafından  girildiği an mı  gönderiliyor yoksa  hypera  değer  girip enter'a  mı basmalıyız.

eem7490

Pic için veri alma işlemini kesme ile mi yapıyorsunuz?

pwm3434

yok  normal  olarak  seroin  komutu  kullanır  gibi.

pwm3434

eem7490  ekte ki  dosya  bakabilirsin.dsn  ve   bas dosyaları var

eem7490

Ben zaten basic bilmiyorum o yüzden bakma gereği duymadım. Bende şuan haberleşme sorunu yaşıyorum. Konu açmıştım da daha yanıt veren olmadı.

http://etepic.com/index.php/topic,1247.msg13035/topicseen.html#new

Kesme ile mi yaptın diye sormamın sebebi 16f84 de rs232 alıcı kesmesi bulunmuyor onu söyleyecektim. Ama sen zaten kesme ile yapmamışsın.

ete

Cevaplar şaşırtıcı doğrusu   Program usart kesmesi kullanıyor. Ama işlemci 16F876. Dolayısıyla usart portu mevcut. Elbette 16F84 de usart portu bulunmuyor ama nerden çıktı bu 16F84 ?

Her neyse programda gördüğüm kusur şu. Program sistemin hangi baud ile çalıştığını bilmiyor.
En başta define komutları ile
Txsta, rcsta ve spbrg registerlerine değer verilmesi gerekiyor.

Ete

eem7490

valla işlemci farklıymış :)
hocam cevaplar şaşırtıcı derken ne demek istediniz acaba?
ve benim derdime de derman bulabilir misiniz?

ete

Mesajına cevap yazdım. Derman olursa ne mutlu bana.

Ete

pwm3434

@ DEVICE pic16F876                     'işlemci 16F876                           
@ DEVICE pic16F876, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F876, PWRT_ON             'Power on timer açık
@ DEVICE pic16F876, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE PIC16F876, LVP_OFF
@ DEVICE PIC16F876, CPD_OFF
@ DEVICE pic16F876, XT_OSC

'---------------------------INPUT-OUTPUT ARRANGEMENT----------------------------
PORTA=0:TRISA=0
PORTB=0:TRISB=0 'PORTB.1 is input all others are output.
PORTC=0:TRISC=%10000000
'-------------------COMUNICATION DEFINES----------------------------------------
ADCON1=7
DEFINE OSC 4
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 25 ' 2400 Baud @ 4MHz, 0,17%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
'-------------------------VARIABLES---------------------------------------------
Cnt       VAR BYTE 50' Cnt is a word variable
inputData var Byte 51' variable to receive data into
TEMP      var BYTE 52

SYMBOL GIE  =INTCON.7   'genel interruptları açıyor
SYMBOL PEIE =INTCON.6   'peripheralinterruptları açıyor
SYMBOL RCIE =PIE1.5     'USART Recive interrupt enable bit
SYMBOL RCIF =PIR1.5     'USART Receive interrupt flag bit
symbol led1=PORTB.4
SYMBOL Led2=PORTB.5
'---------------------------INITIALISATION--------------------------------------
RCIE=1
PEIE=1
GIE=1
INTCON=%11000000
ON INTERRUPT GOTO INT

START:
      IF Cnt=49 then
          led1=1-led1
          pause 100
          cnt=0
      endif   

      if CNT="A" then
        led2=1-led2
        pause 100
        cnt=0
      endif
      goto start
     
DISABLE
INT:
    GIE=0
    hSerIn , [WAIT ("ETE"),INPUTDATA]
    Cnt=inputdata
    TEMP=RCREG
    GIE=1
    Resume
enable

END


ETE   hocam kodların  son  hali  bu.  hyper  termınal  ayarlarından  dosya<özellikler<baglan<yapılandırma<akışdenetimi içerisindeki seçenek, DONANIM  seçeneği mi  olmalıdır. 3 seçeneğide  denedim  şimdilik  olmadı. devre  bağlantısı  olarak da  2 mesaj önecesi yamesajımda eklediğim sizin kullandığınız  bağlantı  şekillerini  kullandım. sorun devreyi boarda kurma sorunumu ki of  desem  olmayacak üşengeçlik  araya  girmesin :)

ete

Program bu hali ile çalışıyor. Neyi yapamadın anlamadım doğrusu.
Ekranda Hyperterminal üzerine sağ tıklayacaksın açılan pencerede, "Edit Properties" seçeneğine tıklayıp yeni bir pencere (Hyper Terminal Özellikleri) açacaksın. Açılan pencerede "Baud Rate" isimli bir kutucuk ve karşısında 9600 rakamı olduğunu göreceksin.
9600 rakamının yanında pencere açma okuna bastığın zaman değeişik baud değerlerinden 2400 olanı seçp bırakacaksın.
Daha sonra simulasyonu çalıştırıp ETE1 veya ETEA yazacaksın. Ayrıca Enter girmene gerek yok. Bunuları yapınca ilgili ledler yanacak veya yananlar sönecektir. Ben denedim çalışıyor.

Ete


Powered by EzPortal