max232 sız vb10 ile Serı port haberlesme (RS_232)

Başlatan murkofiliz, 16 Aralık 2013, 19:18:57

ete

#15
Port Pinlerini yakıp söndürme işini farklı şekilde yapmanı öneririrm.bir pini HIGH yapmak için  HIGH PORTB.3 şeklinde komut kullanmak yerine  PORTB.3=1 şeklinde kullan bakalım ne olacak.Benzer şekilde bir pini LOW yapmak için    LOW PORTB.3 şeklinde değil  PORTB.3=0 şeklinde kullan.Bütün komutları dediğim şekilde değiştir ve yeniden dene bakalım sonuş değişecekmi.Ne farkı var dersen , HIGH PORTB.3 dediğin zaman Önce ilgili Pin Çıkış yapılır sonra o pine 1 bilgisi yazılır.PORTB.3=1 dediğin zaman ise yalnızca port pinine 1 bilgisi yazılır. Hem daha az komutla yapılır hemde tris registerine dokunmadan bu yapılır. Dene bakalım sonuç ne olacak.

Bu arada dikkatimi çekti, bir kere A veya B veya C yolladıktan sonra D ve sonraki harfleri yollasanda program hiç dikkate alamaz.
A - B - C gelmesini test ettiğin satırların sonuna ,
ALDI=0
GOTO MAIN
diye komut yazmışsın.Bu durumda program hiç bir zaman MAIN2 ye gidemeyecek demektir. Nasıl göndermeyi düşündün?

Bana kalırsa
GELDI=0
GOTO MAIN
satırlarını sil. SOnra DISABLE satırından evvel yer alan GOTO MAIN2 satırınıda sil onun yerine
GELDI=0
GOTO MAIN
yaz böylece program bir bilgi geldiği zaman A-B-C-D-E-F-G mi olduğunu tarayarak test edebilecektir. Hangisi gelmiş ise ona uygun işlem yapacaktır.

Ete

murkofiliz

hocam aynen dedıgınız gıbı ugladım lakın yıne farlı bı sonuc alamadım ben sıze ısıs sımulasyonuda gonderıyorum en azından  ordan tarıf etmem daha kolar olur cunku bu cıkıslar grub halınde bırbırınden bagımsız calısacak dedıgım gıbı "abc" bı grup "defg" ayrı bı grup ornegın abc grubundan b yanarken aynı zamanda defg grubundan f yanıyo olabılmesı lagzım

dedıgınız gıbı uyguladım fakat abc sıkıntısız fakat d geldıgınde abc yı de sonduruyo
not:vırtual termınalden kodu MURA,MURB seklıde gonderıyoruz


@ DEVICE pic16F877A
@ DEVICE pic16F877A,WDT_ON
@ DEVICE pic16F877A,PWRT_ON
@ DEVICE pic16F877A,PROTECT_OFF
@ DEVICE pic16F877A,XT_OSC

Define OSC 4
CMCON=7
ADCON1=7

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

INCLUDE "modedefs.bas"
TRISB=$00
TRISC=$80
TRISD=$00
TRISA=%111100

TX VAR PORTC.6
RX VAR PORTC.7
SERIAL_DATA VAR BYTE
I VAR BYTE
TEMP VAR BYTE
GELDI VAR BIT

PORTB=0
PORTC=0
PORTD=0
PORTA=0

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 300

RCIE=1
PEIE=1
GIE=1
ON INTERRUPT GOTO INT

MAIN:

WHILE GELDI=0:WEND

IF SERIAL_DATA="A" THEN
PORTB.0=1
ELSE
PORTB.0=0
ENDIF


IF SERIAL_DATA="B" THEN
PORTB.1=1
ELSE
PORTB.1=0
ENDIF

IF SERIAL_DATA="C" THEN
PORTB.2=1
ELSE
PORTB.2=0
ENDIF
GELDI=0
GOTO MAIN

MAIN2:
IF SERIAL_DATA="D" THEN
PORTB.3=1
ELSE
PORTB.3=0
ENDIF

IF SERIAL_DATA="E" THEN
PORTB.4=1
ELSE
PORTB.4=0
ENDIF

IF SERIAL_DATA="F" THEN
PORTB.5=1
ELSE
PORTB.5=0
ENDIF

IF SERIAL_DATA="G" THEN
PORTB.6=1
ELSE
PORTB.6=0
ENDIF
GELDI=0
GOTO MAIN

DISABLE
INT:
    GIE=0
    HSERIN ,[WAIT("MUR"),SERIAL_DATA]
     GELDI=1
    TEMP=RCREG
    GIE=1
    Resume
    enable
eND
 

ete

#17
Birincisi hala dediğimi yapmamışsın.
MAIN2 etiketinden evvel yer alan,
GELDI=0
GOTO MAIN
satırlarını sil demiştim hala orada duruyor.İkincisi ne istediğini hala anlamış değilim. Nedeni açık. Kullandığın komutlara bakalım.
IF SERIAL_DATA="A" THEN   'gelen bilgi A ise
PORTB.0=1                           'PORTB.0 pinini HIGH yap yani ledi yak
ELSE                                     'gelen bilgi A değil ise
PORTB.0=0                           'yanan ledi söndür
ENDIF
Şimdi burada Önce A gönderdiğin zaman  PortB.0 da bağlı olan led yanıyor.Sonrasında B yollarsan bu sefer PORTB.1 deki led yanıyor ama hemen PortB.0 daki led sönüyor. Çünki gelen A değil ise PortB.0=0 olsun demişsin. Bu komut şekli D bilgisi E bilgisi.. yollanıncada aynı mantıkla bir öncekini söndürüyor.Anlayacağın program yazılış şekline uygun çalışmaktadır. Şimdi sen ne istdeğini daha açık anlatman lazım.Çok emin olmamakla birlikte sanki A-B-C yollanınca yanan ledler bir birlerini söndürsün ama D-E-F-G yollanınca yanan ledler A-B-C yollayınca yanan ledleri söndürmesin istiyorsun herhalde.Daha açık anlat ne istediğini.
Şayet düşündüğüm doğru ise ilişikteki programı dene.

Ete

murkofiliz

Aynen dediginiz gibi hocam devrede abc den birtanesi kesin yanmak zorunda defg den birtanesi yanarken abc den atiyorum b de aktif olmak zorunda iste tam olarak istedigim bu yani bu guruplarin birbirinden bagimsiz calismasini istiyorum onun icin main main2diye ayirdim onlari

ete

#19
Bir şeyi iyi anlaman gerekiyor.
Program senin veridiğin emirleri takip eder.
Şayet sen GOTO MAIN demiş isen onun altındaki satırlara ulaşması mümkün olmaz. Bunu anlaman gerek. O şekilde ayırmak bir hata. BU nedenle  GOTO MAIN ksımını sildim oradan. Böylece program en alta kadar tarayabilecek.
Senin basit algoritman şöyle olmalı. Açıklamadan evvel A harfinin ASCII kodu 65 dir. B=66, C=67 dir.
O halde gurup sınırı 67 olmaktadır. Bu durumda gelen bilgi 68 den küçük ise ilgili ledi yakacak ve aynı şekilde gelen bilgi değişince değişen 68 den küçük ise bir öncekini söndürecek. Ama gelen bilgi 67 den büyük ise D-E-F gurubuna ait demek oluyor. O halde bunlardan birisi gelince yine ilgili ledini yakacak ama ABCD tarafından bir şey söndürmeyecek demek tir.
Benzer şekilde D-E-F gurubundan A-B-C gurubuna geçilmiş ise bu seferde D gurubundan bir şey söndürülmeyecektir.
Yazdığım kod böyle çalışıyor.

Ete



murkofiliz

hocam buyuksun yıne yetıstın derdıme sayende bu pıcı yalayıp yutucam allah bın kere razı olsun bu ıs bukadar yanlız baya bu basklıgı takıp eden var galıba hocam ben daha ındırmeden 2 kısı ındırmıs yukledıgınız dosyayı bu ısın dogayenısınız ıkı varsınız bende ıyık pıc basıc pro ogrenıyorum tesekkurler hocam saol var ol

murkofiliz

#21
Hocam programın derlemesı bıtmek uzere aynen verdıgınız formulu uyguladım komutları sırayla gonderdıgımızde ıstedıgımız gıbı calısıyo buyuk kucuk ıfadelerı kullandıgımız ıcın bu algorıtmanın dısına cıkamıyo kısaca soyle anlatayım yapmak ıstedıgımı tekrardan programı gonderdıgım ısıs e attıgınızda nedemek ıstedıgımı daha net anlıcaksınız ama ben bıde burdan kısaca anlatayım

Toplamda 6 farklı gurubumuz var bunlar (A.B.C), (D.E.F.G),(H.I.J.K.L),(M.N.O),(P.Q.R.S),(T.U.V.W.X)
bu kombınasyonda sızın bana ogrettıgınız sekılde yaptım sıstem sırayla gıdınce sıkıntısız calısıyo.
fakat ılk once (MNO) dan bır gruba sınyal gıttıgınde daha sonra (D.E.F.G) yada (A.B.C) ye gonderdıgımde programın yapısı geregı kendılerınden kucuk deger geldıgı ıcın  (M.N.O) pınlerı pasıf hale gelıo aslında soru su bu grupları bırbırınden bagmsız olarak calıstırmak mumkunmu yazdıgımız  koduda hemen gonderıyorum vaktınız olunca bı ıncelersenız cok sevınırım
NOT:aslında ılk gonderdıgınız ornek tam ıstedım gıbı calısyo fakat bunu digerlerıne uygulayınca pıc sasırıyo yıne bıyerde yanlıs yapıyorum ama neresı bulamadım bıturlu sızın dedınız mantıkla calısmaya calısıyorum ama olmuyo
saygılarımla
@ DEVICE pic16F877A
@ DEVICE pic16F877A,WDT_ON
@ DEVICE pic16F877A,PWRT_ON
@ DEVICE pic16F877A,PROTECT_OFF
@ DEVICE pic16F877A,XT_OSC

Define OSC 4
CMCON=7
ADCON1=7

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

INCLUDE "modedefs.bas"
TRISB=0
TRISC=$80
TRISD=0
TRISA=%00111100

TX VAR PORTC.6
RX VAR PORTC.7
SERIAL_DATA VAR BYTE
I VAR BYTE
TEMP VAR BYTE
GELDI VAR BIT

PORTB=0
PORTC=0
PORTD=0
PORTA=0

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 300

RCIE=1
PEIE=1
GIE=1
ON INTERRUPT GOTO INT

MAIN:

WHILE GELDI=0:WEND

IF SERIAL_DATA="A" THEN
PORTB.0=1
ELSE
IF SERIAL_DATA<68 THEN PORTB.0=0
ENDIF


IF SERIAL_DATA="B" THEN
PORTB.1=1
ELSE
IF SERIAL_DATA<68 THEN PORTB.1=0
ENDIF

IF SERIAL_DATA="C" THEN
PORTB.2=1
ELSE
IF SERIAL_DATA<68 THEN PORTB.2=0
ENDIF

MAIN2:
IF SERIAL_DATA="D" THEN
PORTB.3=1
ELSE
IF SERIAL_DATA<72 THEN PORTB.3=0 
ENDIF

IF SERIAL_DATA="E" THEN
PORTB.4=1
ELSE
IF SERIAL_DATA<72 THEN PORTB.4=0   
ENDIF

IF SERIAL_DATA="F" THEN
PORTB.5=1
ELSE
IF SERIAL_DATA<72 THEN PORTB.5=0   
ENDIF

IF SERIAL_DATA="G" THEN
PORTB.6=1
ELSE
IF SERIAL_DATA<72 THEN PORTB.6=0     
ENDIF


MAIN3:
                                       
IF SERIAL_DATA="H" THEN
PORTB.7=1
ELSE
IF SERIAL_DATA<77 THEN PORTB.7=0     
ENDIF

IF SERIAL_DATA="I"THEN
PORTC.0=1
ELSE
IF SERIAL_DATA<77 THEN PORTC.0=0       
ENDIF

IF SERIAL_DATA="J" THEN
PORTC.1=1
ELSE
IF SERIAL_DATA<77 THEN PORTC.1=0       
ENDIF

IF SERIAL_DATA="K" THEN
PORTC.2=1
ELSE                                   
IF SERIAL_DATA<77 THEN PORTC.2=0
ENDIF

IF SERIAL_DATA="L" THEN
PORTC.3=1
ELSE
IF SERIAL_DATA<77 THEN PORTC.3=0         
ENDIF


MAIN4:

IF SERIAL_DATA="M" THEN
PORTC.4=1
ELSE
IF SERIAL_DATA<80 THEN PORTC.4=0         
ENDIF

IF SERIAL_DATA="N" THEN
PORTC.5=1
ELSE
IF SERIAL_DATA<80 THEN PORTC.5=0         
ENDIF

IF SERIAL_DATA="O" THEN
PORTD.0=1
ELSE
IF SERIAL_DATA<80 THEN PORTD.0=0         
ENDIF
GOTO MAIN5

MAIN5:
IF SERIAL_DATA="P" THEN
PORTD.1=1
ELSE
IF SERIAL_DATA<84 THEN PORTD.1=0
ENDIF

IF SERIAL_DATA="Q"THEN
PORTD.2=1
ELSE
IF SERIAL_DATA<84 THEN PORTD.2=0
ENDIF

IF SERIAL_DATA="R" THEN
PORTD.3=1
ELSE
IF SERIAL_DATA<84 THEN PORTD.3=0
ENDIF

IF SERIAL_DATA="S" THEN
PORTD.4=1
ELSE
IF SERIAL_DATA<84 THEN PORTD.4=0
ENDIF


MAIN6:
IF SERIAL_DATA="T" THEN
PORTD.5=1
ELSE
IF SERIAL_DATA>83 THEN PORTD.5=0
ENDIF

IF SERIAL_DATA="U"THEN
PORTD.6=1
ELSE
IF SERIAL_DATA>83 THEN PORTD.6=0
ENDIF

IF SERIAL_DATA="V" THEN
PORTD.7=1
ELSE
IF SERIAL_DATA>83 THEN PORTD.7=0
ENDIF

IF SERIAL_DATA="W" THEN
PORTA.0=1
ELSE
IF SERIAL_DATA>83 THEN PORTA.0=0
ENDIF

IF SERIAL_DATA="X" THEN
PORTA.1=1
ELSE
IF SERIAL_DATA>83 THEN PORTA.1=0
ENDIF
GELDI=0
GOTO MAIN

DISABLE
INT:
    GIE=0
    HSERIN ,[WAIT("MUR"),SERIAL_DATA]
     GELDI=1
    TEMP=RCREG
    GIE=1
    Resume
    enable
eND

ete

Adım adım bana programı yaptırma niyetindesin galiba.
İşin mantığını hem anlattım hemde işin o kısmında yapıp verdim. Biraz mantığını çalıştırsan bulacaksın ama hazır almaya alıştın sanırım düşünmüyorsun gibime geliyor. Benim desteğim bu kadar bundan sonrasını kendin halledeceksin.
Kafayı biraz çalıştırırsan yalnızca iki gurubun olunca bir gurup diğerinden harf olarak büyük olur. Ama birden fazla gurubun olunca artık büyüktür küçüktür ile halledemezsin. Aralık vermen gerekir. 64 den büyük ve 73 den küçükse dediğin zaman bu sana 65-72 arasını verir. Diğerlerinide bu şekilde çzömen gerekir. Ancak başlangıç ve bitiş guruplarını belirli bir sayıdan büyükse veya küçükse diye sınıflandırabilirsin aradakileri ise aralık vererek tanımlayabilirsin. Bunu düşünmen gerekmezmiydi acaba ?

Ete

murkofiliz

hocam nedesınız haklısınız ama benım daha bu programa baslamamın 2 cı haftası mesela dun ogrettıgınız buyuktur cucuktur ıfadelerını butun derslerınız baktım ama yorumlayamadım ıster ınanın ıster ınanmayın dungeceden berı bununla ugrastım o dedıgınız guruplandırma aklıma gelmedı deıl ama dedıgım gıbı su buyuk tur kucuktur komunutunu bıle dun sızden ogrendım bazen mantıktan fazlası yanı bılgı gerekıyo oda bende fazlası ıle eksık daha zaten su ıs bı bıtsın ılk yapıcagım sey butun derslerınızdekı orneklerı tek tek uygulyıp bu ısı tamamen ogrenıcem.

o guruplamayı yaparken nasıl bı komut kullanmalıyım en azından onu bıle soylesenız kafı olur
gercekten sımdıye kadarkı yardımlarınız ıcın cok tesekkur ederım hakkınız odenmez ınanın hocam cevaplamasınızda onemlı deıl burdakı derslerınız bınaeyen ben bu ıse gırdım bılgıler cok acıklayıcı ve nettı ve sızden bukadar yardım alacagım bıle aklıma gelmezdı butun yardımlarınız ıcın cok tessekkur ederım allan bın kere razı olsun
saygılarımla


ete

Buyur , "D" yollandığı zaman olması gereken kod'u aşağıda yazdım. Bunu yazarken A-B-C- D-E-F-G- H-I sıralamasında DEFG harflerinin C ile H arasında kaldığını görerek uygun şekilde yazdım. Diğerlerinide sen benzer şekilde yazarsın artık

IF SERIAL_DATA="D" THEN
PORTB.3=1
ELSE
IF SERIAL_DATA>"C" and SERIAL_DATA<"H"  THEN PORTB.3=0 
ENDIF

Ete

murkofiliz

Sayenizde su bi haftada cok sey ogrendim hocam soyle bi dusunuyorumda bana ogrettiginiz bunca bilgi sayesinde bile bunlarin turevinde bi cok sey yapabilrim diger konularida bi halledersem bu is gercekten sayenizde cok zevkli bi hal alicak gibi gozukuyo allah me muradiniz varsa versin.
Bilgi amacli bisey sormak istiyorum hocam ben bu devrede 27 adet pin kullandim bana sadece 7 adet pin kaldi bunlari kulanarak bu devrede lcd kullanma imkanim varmi eger var ise sadece olur yazmaniz yeterli sonucta bu saatten sonrasi benim icin zevkli olucak suan 3 dersinizi okuyorum lcd konusunu bana olur gibi geldi ama sizdende bi fikir almak istedim tekrar cok tessekur ederim allah sikinti yuzu gostermesin ve basimizdan eksik etmesin sizi
Saygilarimla

ete

Lcd çalıştırmak için 4+2 pin gerekir. Ancak ne yazıkki 4 pin mutlaka ve mutlaka ya sıfır bitden başlamalı (PORTB.0 gibi) yada Bit4 den başlamalı (PORTB.4 gibi) bu özelliği sağlayabiliyorsa boştaki pinlerin LCD tabiiki kullanabilirsin.
Neden bu özellik var onuda açıklayayım. Normalde LCD 8 bitlik data hattı kullanır. Ancak adamlar bakmışlar 8+2=10 pin gerekecek o halde demişler 8 bitlik data hattını 4+4 bit olarak kullanalım. Bu durumda 8 bitlik bilginin ilk 4 biti (0-3 nolu bitler) önce data portuna yazılsın sonrada gerikalan diğer 4 biti yazalım böylece 8 biti iki kademede aktaralım demişler. Böylece 8 pin yerine 4 pin kullanılır hale gelmiş. Şimdi 4 bitlik bilgiyi değişik pinlerden toplamak çok zor. Ama sıralı 4 pinden almak son derece kolay. Bu nedenle data pinlerini sıralı pinlerden seçilmesi zorunluluğu getirilmiş.

Ete

murkofiliz

Hocam hemen denemeye basliyorum 877a da a portunu komle bosalttim oradan 5 pin kazandim e portundanda 1 pin var toplam bosta 6 pinim oldu kullanabilicegim ders 3 birinci ornek bana fazlasi ile yetiyo gibi hemen denicem neticeyi size bildiricem
Saygilarimla

elektri

abiler kusura bakmayın bi sorum olacak 16f877 ile bi bitirme projem var rf haberleştiriyorum hem bilgi alıp o bilgiyi göndermesini istiyorum ama yapmıyor . bilgi almasında sıkıntı yok. programa aldıgı bilgiden sonra gönder diye komut veriyorum tıkanıyor.alıp verme işlerinden sadece birini yapıyor bunu nasıl çözerim yardımcı olurmusunuz kod aşagıda:
SABIT:

LCDOUT $FE,$40,$04,$0E,$1B,$0E,$04,$00,$FF'MOTOR KARAKTERİ
LCDOUT $FE,$48,$11,$04,$04,$11,$0E,$00,$FF 'GÜLEN KARAKTERİ 
                       
LCDOUT $FE,1                  
LCDOUT $FE,2,0,"MOTOR=",#RPM,"rpm"
LCDOUT $FE,$C0,1,"HUMAN=",#HUMAN

PAUSE 50
IF MENU=0 THEN
WHILE MENU=0
WEND
goto FF
ENDIF

GOSUB DEGERRF

IF S1=0 THEN
HUMAN=HUMAN-1
ELSE
HUMAN=HUMAN+1
ENDIF

IF HUMAN>6000 THEN
HUMAN=0
ENDIF



rpm=human*5
motor=rpm
GOSUB MOTORRF
PAUSE 50

LCDOUT $FE,$40,$04,$0E,$1B,$0E,$04,$00,$FF'MOTOR KARAKTERİ
LCDOUT $FE,$48,$11,$04,$04,$11,$0E,$00,$FF 'GÜLEN KARAKTERİ
                       
LCDOUT $FE,1                  
LCDOUT $FE,2,0,"MOTOR=",#RPM,"rpm"
LCDOUT $FE,$C0,1,"HUMAN=",#HUMAN
PAUSE 100


IF MENU=0 THEN
GOTO FF
ELSE
GOTO SABIT
ENDIF

DEGERRF:
IF MENU=0 THEN
GOTO FF
ENDIF

serin2 portc.7,1646,[wait("X111"),S1]
PAUSE 100

RETURN



MOTORRF:
IF MENU=0 THEN
GOTO FF
ENDIF
serout2 portc.6,396,[REP$AA\5,REP$00\5,REP$FF\5] 'uyandırma işareti yolla
serout2 portc.6,396,[("M"),("1"),MOTOR] ' 600 baud ile "ES" yolla
serout2 portc.6,396,[("M"),("1"),MOTOR] '
serout2 portc.6,396,[("M"),("1"),MOTOR] '
RETURN

murkofiliz

Valla kardesim sana yardim etmeyi cok isterdim lakin bende daha yeniyim hocanin 7 dersini iyice oku derim haddime dusmez ama soyle bi baktim anladigim kadariyle kesme namina bisey yok senin programda eger isin icinde haberlesme varsa kesme olmak zorunda  cunku programda sekron yakalamak istiyosan kesme kullanman lagzim nacizane fikrim bu

Powered by EzPortal