Y

MAX487 modbus

Başlatan YasarGunaydin, 16 Mart 2014, 21:55:48

YasarGunaydin

Arkadaşlar Merhaba,
basit bir max487 çalışıyorum ama sitedeki ete hocanın master slave uygulamasına bakmama rağmen ekteki uygulamayı yapamadım.gönderen butona basılınca 1 er artan sayı 3 olunca gönderecek.
veriyi alan ise  ise gelen 3 ise  içerisindeki sayı 2 olacak.bu.

nereyi input nereyi nezaman high yapmalıyım yapamadım arkadaşlar.

YasarGunaydin

#1
alıcı devre


TRISA=%00000001
TRISB=%00000110
'-----------------------------------------------------------------
@ DEVICE pic16F628A                      'işlemci 16F628                               
@ DEVICE pic16F628A, WDT_OFF              'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_off            'MCLR pini kullanılıyor.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
'-----------------------------------------------------------------
                                     
'-------------------------------------------------------------------------
'ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
OPTION_REG=%10000101   'Pull up dirençleri İPTAL- Bölme oranı 1/64.
'INTCON=%10100000  'Kesmeler aktif ve TMR0 kesmesi aktif
'TMR0=0

CMCON=7    '16F628 de komparatör pinleri iptal hepsi giriş çıkış
'----------------------------------------------------------------------------

INTCON=%11000000
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


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


DEFINE LCD_DREG PORTB 'LCD  data bacakları hangi porta bağlı?
DEFINE LCD_DBIT 4 'LCD data  bacakları hangi bitten başlıyor?
DEFINE LCD_RSREG PORTB 'LCD  RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT 3 'LCD RS  bacağı Hangi Bite bağlı ?
DEFINE LCD_EREG PORTB 'LCD  Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT 0'LCD  Enable Bacağı Hangi bite bağlı ?
DEFINE LCD_BITS 4 'LCD 4  bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES 2 'LCD Kaç  sıra yazabiliyor

TEMP VAR BYTE
GELEN VAR WORD 'VISUAL BASICTEN GELECEK OLAN VERİ
SYMBOL ART=PORTA.0
SAY VAR WORD  'PERDE YUKARI ÇIKARKEN aşağı inerken SAY
symbol SEC=PORTA.6
A VAR BYTE
Y VAR BYTE
SAY2 VAR BYTE
PORTB=%00000000

I VAR BYTE
  'SEC=0
RCIE=1
PEIE=1
GIE=1
ON INTERRUPT GOTO INT
lcdout $FE,1,"LUTFEN  BEKLEYIN"
FOR I=0 TO 10200
PAUSEUS 5
NEXT
'------------------------------------------------------------------------------
BASLA:
  LCDOUT $FE,$84,DEC GELEN
LCDOUT $fe,$C0,"SAYI= " ,DEC SAY

IF SAY=2 THEN
PORTA=%00001000
ELSE
  PORTA=%00000000
  ENDIF

IF ART=0 THEN
PAUSE 10
While PORTA.0=0 : Wend
SAY=SAY+1
'LCDOUT $FE,$84,DEC SAY ,":" ,DEC A,":",DEC Y ,":",DEC SAY2
IF SAY=4 THEN SAY=0
PAUSE 50
ENDIF

GOTO BASLA
               
DISABLE

INT:

    GIE=0
    HSERIN 5,ATLA, [WAIT("YSR"),GELEN] 
    SAY=2

ATLA:
    TEMP=RCREG
    GIE=1
    Resume
    enable
end



gönderen devre

TRISA=%00000001
TRISB=%00000010
'-----------------------------------------------------------------
@ DEVICE pic16F628A                      'işlemci 16F628                               
@ DEVICE pic16F628A, WDT_OFF              'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_off            'MCLR pini kullanılıyor.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
'-----------------------------------------------------------------

'-------------------------------------------------------------------------
'ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
OPTION_REG=%10000101   'Pull up dirençleri İPTAL- Bölme oranı 1/64.
'INTCON=%10100000  'Kesmeler aktif ve TMR0 kesmesi aktif
'TMR0=0

CMCON=7    '16F628 de komparatör pinleri iptal hepsi giriş çıkış
'----------------------------------------------------------------------------

INTCON=%11000000
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


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


DEFINE LCD_DREG PORTB 'LCD  data bacakları hangi porta bağlı?
DEFINE LCD_DBIT 4 'LCD data  bacakları hangi bitten başlıyor?
DEFINE LCD_RSREG PORTB 'LCD  RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT 3 'LCD RS  bacağı Hangi Bite bağlı ?
'DEFINE LCD_RWREG    PORTB
'DEFINE LCD_RWBIT      3
DEFINE LCD_EREG PORTB 'LCD  Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT 0'LCD  Enable Bacağı Hangi bite bağlı ?
DEFINE LCD_BITS 4 'LCD 4  bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES 2 'LCD Kaç  sıra yazabiliyor

TEMP VAR BYTE
GELEN VAR WORD 'VISUAL BASICTEN GELECEK OLAN VERİ
SYMBOL ART=PORTA.0
symbol SEC=PORTA.6
SAY VAR WORD  'PERDE YUKARI ÇIKARKEN aşağı inerken SAY
A VAR BYTE
Y VAR BYTE
SAY2 VAR BYTE

PORTA=%01000001
PORTB=%00000010
   SEC=0
I VAR BYTE
RCIE=1
PEIE=1
GIE=1
ON INTERRUPT GOTO INT
lcdout $FE,1,"LUTFEN  BEKLEYIN"
FOR I=0 TO 10200
PAUSEUS 5
NEXT
'------------------------------------------------------------------------------


BASLA:
  LCDOUT $FE,$84,DEC GELEN
LCDOUT $fe,$C0,"SAYI",DEC SAY

IF ART=0 THEN
PAUSE 10
While PORTA.0=0 : Wend
SAY=SAY+1
'LCDOUT $FE,$84,DEC SAY ,":" ,DEC A,":",DEC Y ,":",DEC SAY2
PAUSE 50
ENDIF

IF SAY=3 THEN GOSUB YOLLA
IF SAY=5 then SAY=0
GOTO BASLA

   
    DISABLE
INT:
GIE=0

'hSerIn , [WAIT("ETE"),GELEN]
'hSerIn , [GELEN]


TEMP=RCREG
GIE=1
Resume
enable


DISABLE


YOLLA:
SEC=1
HSEROUT ["Y","S","R",#SAY]
SEC=0
RETURN


ete

Bir sürü örnek verdim açıklamalar yazdım ders notları verdim buna rağmen hala yapamadım diyorsan işin temeline inmemişsin demektir. Sürekli olarak kopyala yapıştır yöntemi ile çalışanlar sonunda bu duruma düşüyor maalesef.
Halbuki işin mantığını öğrensen yada öğrenmeye çalışsan hiç de zor olmadığını kolaylıkla anlayacaksın.

Yüzlerce kez söyledim. Bir programda kesme var ise PAUSE komutunu kullanmayın. Bütün işleri aksatır diye. Ama ısrarla bir pause kullanma hastalığı var her nedense anlayamıyorum.

Ayrıca yine bir çok kez söyledim neden Alma işinde kesme kullanıyoruz ? çünki kimin ne zaman ne göndereceğini bilmiyoruz. Hal böyle olunca bilgi girişininbaşında oturup beklemek lazım. Ama bir yandan da işim var başında bekleyemiyorum!! o halde senin yerine birisinin bakması lazım onun adınada kesme diyorlar işte. Kesme bekler ve bilgi gelince sana haber verir sende işlerini yaparsın. Bu durumda alma işinde kesin kesme kullanılması gerekir ve bu haberleşme emniyeti açısından büyük fayda sağlar.
Bilgi yollama işinde kesme kullanılmasını hiç tavsiye etmiyorum. Çünki bilginin ne zaman yollanacağına sen karar veriyorsun. Her şey senin elinde o zaman kesmeye gerek yok.

İşin içinde RS485 meselesi var ise bu anlatılanlara ilave olarak data akış yönü kontrolü sisteme eklenmesi gerekiyor.
Bu iş için Kullanılan entegrenin RE/DE pinleri var. Bunlar birleştirilip bir pic pinine bağlanması gerekiyor. Sİstem alma konumunda beklerken bu pin LOW da beklemelidir. Bilgi yollanacağı zaman bu pin HIGH yapılıp bilgi yollanmalı ve sonra tekrar LOW a çekilmelidir.

Bu işi yapamamanın sebepleri kesinlikle bu açıkladıklarım ile alakalıdır. İyice okuyup programlarını söylenenlere uygun olrak değiştir ve yeniden dene bakalım.

Program ve şemaları verdiğinizi düşünüyorsunuz. Özellikle şema konusunda simulasyon versiyon 8 kullananlara sesleniyorum.
Gerek kullanım zorluğu ve gerekse henüz oturmamış olması nedeni ile ben dahil pek çok kişi kullanmayı tercih etmiyor. Bu nedenle şemalarınızı verirken mutlaka jpg uzantılı olarak resim dosyası şeklinde de verinki verdiklerinizi açamayanlar ne olduğunu görebilsinler.

Programları dosya halinde verdikten sonra neden bir de ayrıca mesaj olarak verdin onuda anlamadım. Üstelik sürekli söylüyorum program parçalarını kod tag içinde verin diye. Bunada dikkat edelim lütfen.

Ete

YasarGunaydin

Hocam Haklısınız,
max 487 yi Çalıştım ve serout ve serin ile çalıştırdım.Fakat hserin ile aynı devreyi neden çalıştıramıyorum.Benim bunu hserin ile yapmam lazım.

çalışan komut
BASLA:
  SERIN SI,2400,#B0
if B0=3 then PORTB=%10000000
  if B0=4 then PORTB=%00000000
GOTO BASLA

çalışmayan komut
BASLA:
HSERIN 5,BASLA, [WAIT("YSR"),GELEN]
'HSERIN [GELEN]
if GELEN=3 then PORTB=%10000000
  if GELEN=4 then PORTB=%00000000
GOTO BASLA

ete

Çalışanda işaretçi ("YSR") kullanmamışsın diğerinde kullanmışsın.
Çalışanda gelen veriyi sayı formatında almışsın (#B0) , diğerinde ASCII formatında almışsın.
HSerin komutunda da aynı formatları denesene .

Ete

Powered by EzPortal