16F877 Pic to PC - Seri Haberleşme Sorunu [ Çözüldü ]

Başlatan mehmet14, 15 Ekim 2014, 17:40:43

mehmet14

İyi günler yaklaşık 2 yıl kadar elektroniğe ara vermek zorunda kaldım. Arayı bu kadar uzun tutmamın bana verdiği bir hamlık olsa gerek bir çok şeyi unutmuşum. Kötü bir olay yüzünden bilgisayarım ve projelerim kül olduğu için eski dökümanlarımın hiç birine de erişimim yok. Uzun bir aradan sonra halen görüyorum ki Erol hocam herkese yardım eli uzatmaya devam ediyor, öncelikle size saygılarımı sunarım hocam yıllardır bu işi karşılık beklemeden ve onca eleştiriye rağmen sürdürmeniz gerçekten takdire değer bir başarı.
Benim sizlere sormak istediğim bir sorum var.

Bir devreye ihtiyaç duydum aslında çok basit birşey fakat kilit bir noktada takılı kaldım ve dökümanlarım olmadığı için işin içinden çıkamadım.

mikro işlemci olarak 16F877 kullandım. BaudRate 2400,8,n,1 ( 9600 da da denedim) . Isis ve Virtual Serial Port Driver kullanıyorum
Çalışmasını kısaca anlatmak gerekirse
Bilgisayardan belirli aralıklarda 8 bitlik bilgi gönderiyorum ve bu gelen bilgiyi direk portb'ye aktarıyorum
daha sonra PortD ' deki 8 bitlik bilgiyi sürekli olarak bilgisayara gönderiyorum.
ek olarak eğer gelen bilgi "A" ise pic bilgisayara "B" gönderiyor. eğer bilgi A dan farklıysa portları birbirine aktarıyor.

Takıldığım nokta ise Seri porttan gelen 0 bilgisini portb'ye yazsam bile portb.5 ve  portb.6 nolu uçlar enerjileniyor.
ve Bilgisayara hiçbir şekilde tek bir karakter dahi iletemedim.

Bilgisayardaki veriyi işleyen programı VB6 ile yazdım zaten msComm nesnesinin BaudRate ayarıda uyumlu fakat bir şekilde veri programıma gelmiyor.

Pic Basic Programım
INCLUDE "modedefs.bas"
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

TRISB=0
TRISD=255
TRISC=%01111111

TX VAR PORTC.6
RX VAR PORTC.7
Bilgi VAR BYTE

PORTB=0
PORTC=0
PORTD=0
cmcon=7
adcon1=7

MAIN:
pause 50
SERIN RX,T2400,bilgi

if bilgi = "A" then
    SerOut TX ,T2400,["B"]
else
    PORTB = Bilgi
    SerOut TX ,T2400,[PORTD]
endif

GOTO MAIN
END



Devrenin Isıs Çizimi :

Yardımlarınızı bekliyorum Selametle...

ete

Önce programdaki eksikliklerden bahsetmek lazım.
1. Hiç bir sigorta ayarı verilmemiş.
'@ DEVICE pic16F877a                      'işlemci 16F628a                                
'@ DEVICE pic16F877a, WDT_OFF             'Watch Dog timer kapalı
'@ DEVICE pic16F877a, PWRT_ON             'Power on timer açık
'@ DEVICE pic16F877a, PROTECT_OFF         'Kod Protek kapalı
'@ DEVICE pic16F877a, XT_OSC              'harici osilatör kullanılacak
@ __config _XT_OSC & _WDT_ON & _LVP_OFF & _CP_OFF


2. Pic çalışma frekansı belirtilmemiş. Baud rate hesaplanırken bu frekansa göre hesaplanır. Her ne kadar default değerler var isede mutlaka programın başında,
Define osc 4
şeklinde çalışma frekansı belirtilmelidir.

3. USART pinlerini haberleşme amaçlı kullanmışsınız. Bu usart portunu kullandığınız anlamına geliyor. Bu durumda RX pini giriş diğerleri çıkış olarak ayarlanması gerekirken tam tersini (TRISC=%01111111)  yapmışsınız. Bu komut TRISC=%10000000 şeklind eolmalı idi.

4. Her program ilk açılışta parametrelerin ayarlanması registerlerin değerlerinin yerleştirilmesi için minimum 150-200 ms civarında bir gecikme verilerek başlatılmalıdır. Aksi halde registerler rastgele değerler alabilir yada bir takım arka plan registerleri gerektiği şekilde kurulamayabilir. Bu nedenle MAIN satırından evvel mutlaka ;
Pause 300
komutu verilmelidir.

5. Seri haberleşmenin söz konusu olduğu durumlarda senkron tutturma açısından mümkün olduğunca Pause kullanımından kaçınılmalıdır. Bu nedenle MAIN etiketi altında yer alan Pause 50 kaldırılmalıdır.

5. Seri haberleşmenin olmazsa olmazlarından biriside işaretçi kullanmaktır. Ortam parazit almaya meyillidir. Bu tür yanlış bilgi alımını engellemek için yollayacağınız veri paketi başında mutlaka bir uyandırma (preambl) yer almalı ardından veri paketi başına bir işaretçi yerleştirilmeli ve onun peşinden asıl verinizi vermelisiniz.
Bu durumda PC tarafından yollanan bilgi 5 adet $AA, 5 adet $00 ve 5 adet $FF bilgisi yollanıp peşinden, 3 karekterli bir işaretçi (Mesela "ETE") ve ardından BILGI yollanıp peşine 1 adet Linefeed (CHR$10) ve 1 adet RETURN (CHR$13) eklenmelidir.
Bu durumda veri paketiniz şu görünümde olacaktır, $AA,$AA,$AA,$AA,$AA,0,0,0,0,0,$FF$FF,$FF,$FF,$FF,"E","T","E",BILGI,10,13
İşaretçiye kadar olan kısım pic'i seri haberleşme konusunda uyarmak için gereklidir. İşaretçi gelen bilginin kime ait olacağını belirler. Böylece gelen verinin size ait verimi yoksa parazitmi olduğunu ayırt edebilirsiniz.

6. Madem USART portunu kullandınız o halde alış verişte USART komutlarını kullanmanız daha doğru olur.
SERIN RX,T2400,bilgi ..........yerine  HSERIN ,[BILGI]
SerOut TX ,T2400,["B",10,13].........yerine HSEROUT, ["B"]
SerOut TX ,T2400,[PORTD,10,13]....yerine HSEROUT, [PORTD]  yazmanız daha doğru olur

Program bu hali ile doğru çalışmaktadır. Denemesini yaptım. Çalışan halinde Virtual terminalden yollanan bilgi ters çevrilmeden yollanmalıdır (TX/RX Polarity==>Normal).
Gerçek devrede pic ile PC arasında Max232 seviye çevirici olması gerekir. Zira PC tarafında(RS232)  HIGH= -10Vdur.  Pic tarafında (TTL) HIGH=+5V dur. PC (RS232) tarafında LOW =+10V dur. Pic Tarafında (TTL) LOW=0V yada GND dir.
Bu seviyelerin bir birine uydurulması gerekir. Max232 entegresi bu işi yapar.

Hepsi bu kadar.

Ete

mehmet14

Cevabınız, ilgi ve alakanız için teşekkür ederim hocam.
Dediklerinizin anladığım kısımlarını düzelttim, gelen bilgiyi somut olarak görmek için B portuna 2x16 LCD bağladım ve değişkenleri oradan izleyi planlıyorum. HSEROUT komutu derlerken [] köşeli parantezleri işaret ederek hata veriyor. Hata içeriği ;

ERROR Line 49: Bad expression. (877SeriPort.pbp)
ERROR Line 49: Expected '['. (877SeriPort.pbp)
ERROR Line 51: Expected '['. (877SeriPort.pbp)
ERROR Line 51: Expected ']'. (877SeriPort.pbp)

HSEROUT komutlarını sildiğimde ancak derleyebiliyorum, bu şekilde derlediğimde HSERIN ,[BILGI] komutu ile seri bilgiyi "BILGI" değişkenine yazması gerekiyorken program HSERIN komutunda takılı kalıyor ve alt satıra geçmiyor. Sizin 5. maddede anlattığınız olayı tam olarak anlamadım, mantığını anladım ne için kullanıldığını da fakat ben bilgiyi Visual Basic' de
MSComm1.Output = Text1.Text diyerek gönderiyorum textbox içeriği 0-255 arasında sürekli değişiyor.Acaba bu göndermeye ek birşeyler mi gerekli sizin bahsettiğiniz $AA,$AA,$AA,$AA,$AA,0,0,0,0,0,$FF$FF,$FF,$FF,$FF,"E","T","E",BILGI,10,13 şu dizi gibi.

Programımın son hali bu şekilde
@ DEVICE pic16F877a                      'işlemci 16F877a                                
@ DEVICE pic16F877a, WDT_OFF             'Watch Dog timer kapalı
@ DEVICE pic16F877a, PWRT_ON             'Power on timer açık
@ DEVICE pic16F877a, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F877a, XT_OSC              'harici osilatör kullanılacak
'@ __config _XT_OSC & _WDT_ON & _LVP_OFF & _CP_OFF
INCLUDE "modedefs.bas"                       
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

DEFINE LCD_DREG     PORTB 'LCD DATA BACAKLARI PORTB'YE BAGLI
DEFINE LCD_DBIT     4     'LCD DATA BITLERI HANGİ BITTEN BASLIYOR
DEFINE LCD_EREG     PORTB 'LCD ENABLE BACAGI HANGI PORTA BAGLI
DEFINE LCD_EBIT     3     'LCD ENABLE BITI HANGI PORTA BAGLI
DEFINE LCD_RSREG    PORTB 'LCD RS BACAGI HANGI PORTA BAGLI
DEFINE LCD_RSBIT    2     'LCD RS BACAGI HANGI BITE BAGLI
DEFINE LCD_BITS     4     'LCD 4 BIT BAGLI
DEFINE LCD_LINES    2     'LCD KAC SIRADAN OLUSUYOR

TRISB=0
TRISD=255
TRISC=%10000000

TX VAR PORTC.6
RX VAR PORTC.7
Bilgi VAR BYTE
SAYI VAR BYTE

PORTB=0
PORTC=0
PORTD=0
cmcon=7
adcon1=7

LCDOUT $FE,1

pause 300

MAIN:
HSERIN ,[BILGI]

SAYI = 255 - PORTD 
LCDOUT $FE,$2,"PORTD " , #SAYI
LCDOUT $FE,$C0,"BiLGi :" ,#bilgi

if bilgi = "A" then
    HSEROUT, ["B"]
else
    HSEROUT, [SAYI]
endif

GOTO MAIN
END


Devrenin son hali ise bu :


Bu arada PBP 2.46 kullanıyorum ve HSEROUT parantezlerinden kaynaklanan sorunu HSEROUT, [SAYI, 13, 10] bu şekilde değiştirince çözülüyor fakat bilgi yine Hyper terminale ulaşmıyor.

ete

Her şeyden önce dosyaları mesaj ekinde vermeniz gerekir. Ordan kopyala şemaya bak aynısını yeniden çiz bunlar zaman alıcı işler.
Hiç şema çizilmemiş olsa bir derece kabul edilebilir ama elinde var zaten oraya eklesen bir sürü zaman kaybı önlenmiş olurdu değilmi.

Senin yapmadığını ben yaparak ilişikte çalıştırdığım dosyaları gönderiyorum.
Elbette virtual terminal ekranında gelen gideni takip etmektense programa ufak bir ilave yaparak gelen bilgi A ise hem portB yi sil hemde seri portdan B yolla dedim. Böylece gelen bilginin A olduğunu ve karşılıklı olarak B nin gönderildiğini biliyorum.
Virtual terminalde Pic in yolladığı B bilgisini de görmek istersen COMPIM komponentini oradan silmen gerekiyor.
Böylece ekrana sen A yazar yazmaz hemen yanına B eklendiğinide görebilirsin.
Bu arada PBP 260 versiyonu kullansan senin için daha iyi olur. Bu versiyonun A-B-C diye yamalarıda mevcut olup sırası ile bunlarıda yapman gerekiyor.


Ete

mehmet14

Teşekkür ederim hocam haklısınız yükleseydim daha kolay olurdu. İlginiz için teşekkürler

Powered by EzPortal