Seri haberleşme Yardım

mecrix

Üye
Katılım
21 Eyl 2012
Mesajlar
21
Puanları
1
Yaş
39
Arkadaşlar 3 adet 16f877 yi haberleştirmeye çalışıyorum ama başaramıyorum kodlar burada bir bakıp hatamı söylerseniz sevinirim

alıcı master
Kod:
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_RWREG PORTB 'LCD RW BACAGI HANGI PORTA BAGLI
DEFINE LCD_RWBIT 2 'LCD RW BACAGI HANGI BITE BAGLI
DEFINE LCD_RSREG PORTB 'LCD RS BACAGI HANGI PORTA BAGLI
DEFINE LCD_RSBIT 1 'LCD RS BACAGI HANGI BITE BAGLI
DEFINE LCD_BITS 4 'LCD 4 BIT BAGLI
DEFINE LCD_LINES 2 'LCD KAC SIRADAN OLUSUYOR


pause 500




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
symbol SEC=PORTC.5   






Pause 500
SEC=0
RCIE=1
PEIE=1
GIE=1
ON INTERRUPT GOTO KESME




trisb.0 = 1
w1 var byte
g1 var byte
g2 var byte
g1=1
g2=2
al var byte
adr var byte








basla:
lcdout $fe,1
lcdout "Mert"
pause 1000
goto basla
end




Gelen1:
lcdout $fe,1
lcdout "gelen1"
pause 1000
goto basla


Gelen2:
lcdout $fe,1
lcdout "gelen2"
pause 1000
goto basla


kesme:
GIE=0
HSERIN 10,ATLA, [WAIT("$ME"),adr,al]
if adr=g1 then goto gelen1
if adr=g2 then goto gelen2
return


ATLA:
     
    GIE=1
    Resume
    enable                                                  
    END

Verici 1
Kod:
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
SYMBOL SENSOR=PORTB.7
symbol SEC=PORTB.3


YOLLA VAR BIT


pause 500
SEC=0
RCIE=1
PEIE=1
GIE=1


YOLLA=0


adr var BYTE
ADR=1
     
pause 2000




basla:
while portb.1=1
HSEROUT ["$","M","E",adr]
wend
pause 500
goto basla

verici iki



Kod:
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
SYMBOL SENSOR=PORTB.7
symbol SEC=PORTB.3


YOLLA VAR BIT


pause 500
SEC=0
RCIE=1
PEIE=1
GIE=1


YOLLA=0


adr var BYTE
ADR=2






basla:
while portb.1=1
HSEROUT ["$","M","E",adr]
wend
goto basla
 
iyi akşamlar ilk olarak

alıcı
Kod:
HSERIN 10,ATLA, [WAIT("$ME"),adr,al]

if adr = g1 then
.
.
endif

if adr = g2 tehn
.

.
endif
yapmalısın

vericide is hatan veriyi eksik yollaman
yazdığın kodda "al" değişkeni için kod göndermediğinden alıcı ilk gelen 4 byte alınca 5. yi bekliyor ( 10ms ) göndermediğin içinde hataya gidiyor vericide bunu şöyle değiştir
HSErout ["$ME",adr,13]

13 verisi klavyede "enter" tuşudur bu iletişiminin son byte olduğu içinde doğru iletişim yapıldığının da kanıtı olur mesala
alıcı kodunu şöyle deneyelim

kesme

Kod:
HSERIN 10,ATLA, [WAIT("$ME"),adr,al]

if al = 13 then              'son değer 13 ise gelen veri doğru ve işle

if adr = g1 then
.
.
endif

if adr = g2 tehn
.

.
endif
endif

atla:

cevabını bekliyorum
 
verici programı

Kod:
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 25  ' 9600 Baud @ 0,16%
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
SYMBOL SENSOR=PORTB.7
symbol SEC=PORTB.3


YOLLA VAR BIT


pause 500
SEC=0
RCIE=1
PEIE=1
GIE=1
trisc=%10000000


YOLLA=0
trisb.1 = 1


adr var BYTE
ADR=1
     
pause 2000
basla:
HSEROUT ["1ME",adr,13]
pause 1000
goto basla

alıcı programı
Kod:
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_RWREG PORTB 'LCD RW BACAGI HANGI PORTA BAGLI
DEFINE LCD_RWBIT 2 'LCD RW BACAGI HANGI BITE BAGLI
DEFINE LCD_RSREG PORTB 'LCD RS BACAGI HANGI PORTA BAGLI
DEFINE LCD_RSBIT 1 'LCD RS BACAGI HANGI BITE BAGLI
DEFINE LCD_BITS 4 'LCD 4 BIT BAGLI
DEFINE LCD_LINES 2 'LCD KAC SIRADAN OLUSUYOR


pause 500


symbol SEC=PORTC.5   


DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 25  ' 9600 Baud @ 0,16%
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


Pause 500
SEC=0
RCIE=1
PEIE=1
GIE=1
ON INTERRUPT GOTO KESME


trisb.0 = 1
trisc=%10000000
w1 var byte
g1 var byte
g2 var byte
g1=1
g2=2
al var byte
adr var byte


f var byte




basla:
lcdout $fe,1
lcdout "Mert"
for f = 0 to 250
pause 1
next f
goto basla
end


disable
kesme:
GIE=0
HSERIN 100,ATLA, [WAIT("1ME"),adr,al]
if adr=g1 then lcdout $fe,1:lcdout "gelen1":pause 1000
if adr=g2 then lcdout $fe,1:lcdout "gelen1":pause 1000
ATLA:
     
    GIE=1
    Resume
    enable                                                  
    END

alıcıdaki hatan kesme gerçekleştiğinde kesmeleri iptal etmediğin "DİSABLE" programın bende çalıştı ancak bağlantı şeklin bu pror-grama uygun değil
 
yardımların için çok teşekkürler arci sıkıntılarımı paylaşacağım tekrar teşekkür ederim
Ama birde projemde nasıl multitasking kullana bilirim bu konudada yardım edebilirmisiniz.
 
projeni açarmısın biraz ne yapacak ne soracak ne çalışacak pc olacak mı vs vs vs vs
 
projem de km göstergesi çalışırken tekerin attığı her turu aynı zamanda tur değişkeninde arttıracak ve bu rakam 58 e ulaştığında metre değişkeni 1 artacak yani 100 metre de bir artacak hocam sıkıntım şurada ortalama hızı 1 saniyede hesaplattıktak sonra sayıyor turu bu da gidilen yolu hesaplatamıyorum yani her tekerin tam donuşunu aynı anda farklı bir değişkene aktarmam gerekiyor bunun içinde multitasking sistemi kullanmam gerekiyor hocam istersen örnek kodları gönderebilirim teşekkürler
 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için onları kabul etmelisiniz. Daha fazla bilgi edin…