PC SERİ PORTTAN BİLGİ ALMA

Başlatan ferit0158, 06 Şubat 2020, 20:33:44

ferit0158

Merhaba üstadlar.. aşağıda ki kodları kullanarak pc den veri okumaya çalışıyorum. pc de text alanına 2 veya 3 basamaklı bir rakam yazıp, o rakamı pic ile alıp lcd ekranda göstermek istiyorum. sıkıntımız şu, gelen veri text kutucuğuna yazılan rakamın ilk hanesi ascii kodunda geliyor. bizim yapmaya çalııştığımız text kutusuna yazdığımız rakamın tamamını görmek. pc tarafında ki yazılımın kodlarına ulaşmak ve değişiklik yapmak mümkün değil. tek bilgi veri gelmeden önce a ve b karakterlerin geliyor olması. burada ki sorun pic tarafında çözülebilir mi?

Device 16F877a
Declare XTAL 4

CONFIG WDT_Off, HS_OSC , PWRTE_ON,BODEN_OFF,LVP_OFF, CP_OFF
include "modedefs.bas"
ALL_DIGITAL = TRUE
ADCON1 = 7
TRISA=%00000000
TRISB=%00000000
TRISC=%10000000
TRISd=%00000000
TRISe=%00000000
LCD_DTPIN PORTB.4   
LCD_RSPIN = PORTB.2
LCD_ENPIN = PORTB.3
LCD_INTERFACE = 4   ' 4-bit Interface
LCD_LINES = 2
LCD_TYPE = 0
  ASM
  BSF STATUS,RP0
  MOVLW B'10001111
  MOVWF OPTION_REG
  BCF STATUS,RP0
  ENDASM
 
 SLOW_BUS 1
SERIAL_BAUD = 9600
RSOUT_PIN = PORTA.4
RSOUT_MODE = TRUE
RSOUT_PACE = 1
RSIN_PIN = PORTc.7
RSIN_MODE = TRUE
RSIN_TIMEOUT = 3

CLEAR


ZAMAN3 VAR BYTE
ZAMAN3=0

BASLA:


RSIN  { TIMEOUT },WAIT("AB"),ZAMAN3

lcdout $fe,2,@ZAMAN3


GOTO BASLA



TIMEOUT:
goto basLA
POE:
TOE:



Hattuşa

#1
bence alma değişkenin hatalı
alma değişkenini array dizisi olarak tanımlayıp, gelen data miktarını biliyorsan o kadar eklemelisin, pc yazılımı windows mu ben geçen sene pc için bir arayüz hazırlamıştım ama bluetooth içindi silmediysem ekleyeyim.usb içinse yazmak zor bişey değil

PBP da nasıl olur bilmem ama protonda şu şekilde kullanılabilir.

dim gelen[5] as byte
RSIN  { TIMEOUT },WAIT("AB"),gelen[0],gelen[1],gelen[2],gelen[3],gelen[4]

veya

RSIN  { TIMEOUT },WAIT("AB"),gelen\5


tabi yukarıda 5 adet byte geldiğini düşünürsek, sen kaç tane geliyorsa o kadar eklersin



ferit0158

Alıntı yapılan: pro-TR - 06 Şubat 2020, 22:07:29bence alma değişkenin hatalı
alma değişkenini array dizisi olarak tanımlayıp, gelen data miktarını biliyorsan o kadar eklemelisin, pc yazılımı windows mu ben geçen sene pc için bir arayüz hazırlamıştım ama bluetooth içindi silmediysem ekleyeyim.usb içinse yazmak zor bişey değil

PBP da nasıl olur bilmem ama protonda şu şekilde kullanılabilir.

dim gelen[5] as byte
RSIN  { TIMEOUT },WAIT("AB"),gelen[0],gelen[1],gelen[2],gelen[3],gelen[4]

veya

RSIN  { TIMEOUT },WAIT("AB"),gelen\5


tabi yukarıda 5 adet byte geldiğini düşünürsek, sen kaç tane geliyorsa o kadar eklersin





konuya ilginden dolayı teşekkür ederim. RSIN  { TIMEOUT },WAIT("AB"),gelen[0],gelen[1],gelen[2] bu yöntemi kullandım. örneğin diyelim ki 3 adet byte alacağım. arayüz programında ki text kutucuğuna 123 yazdığımda problem yok. ancak bu sayıyı 12 şeklinde iki basamaklı gönderdiğimde veriyi alamıyorum.

Hattuşa

şimdi sen 123 gönderdiğinde tek byte yollamış oluyorsun, 3 byte değil ki
peki siz yukarıda tanımladığınız 5 adet byte dizisini ekrana print ettiniz mi? yani pc den 2 veya 3 data gönderdiğinizi varsayarsak gelen[3],gelen[4] boş yani 255 değerini alacaktır. kısaca sizin sorununuz gönderdiğiniz datayı eksiksiz alıp almadığınızdan emin olun. 2 tane gönderdiyseniz kalanlar 255 olmalı, eksiksiz aldıktan sonra byte değerini stringe çevirebilirsiniz

ferit0158

Alıntı yapılan: pro-TR - 06 Şubat 2020, 22:48:16şimdi sen 123 gönderdiğinde tek byte yollamış oluyorsun, 3 byte değil ki
peki siz yukarıda tanımladığınız 5 adet byte dizisini ekrana print ettiniz mi? yani pc den 2 veya 3 data gönderdiğinizi varsayarsak gelen[3],gelen[4] boş yani 255 değerini alacaktır. kısaca sizin sorununuz gönderdiğiniz datayı eksiksiz alıp almadığınızdan emin olun. 2 tane gönderdiyseniz kalanlar 255 olmalı, eksiksiz aldıktan sonra byte değerini stringe çevirebilirsiniz

"şimdi sen 123 gönderdiğinde tek byte yollamış oluyorsun, 3 byte değil ki" özür dilerim yanlış yazmışım. 3 haneli bir sayı diyecektim.

"yani pc den 2 veya 3 data gönderdiğinizi varsayarsak gelen[3],gelen[4] boş yani 255 değerini alacaktır." evet normalde boş byteları 255 olarak görmem lazım ama hiç bir şekilde bir veri gelmiyor.

Hattuşa

Alıntı yapılan: ferit0158 - 06 Şubat 2020, 23:08:01"şimdi sen 123 gönderdiğinde tek byte yollamış oluyorsun, 3 byte değil ki" özür dilerim yanlış yazmışım. 3 haneli bir sayı diyecektim.

"yani pc den 2 veya 3 data gönderdiğinizi varsayarsak gelen[3],gelen[4] boş yani 255 değerini alacaktır." evet normalde boş byteları 255 olarak görmem lazım ama hiç bir şekilde bir veri gelmiyor.


peki lcd de gelen[3],gelen[4] datalarında ne yazıyor? usta özel değilse ne yapmak istiyorsunuz? sisteminiz nedir. sebebi şu basic yazılımınızı beğenmedim. usart neden kullanmıyorsunuz?

ete

Seri bilgi alıp verme bir protokol işidir ve bir mantık çerçevesinde yapılır.
Mantık öncelikle yollanan byte adedinde başlar. Kaç byte yollanmış ise alan tarafta o kadar byte beklemelidir. Yollayan taraf bu konuda değişken davranıyor ise bir sonlandırma işareti yollanmalıdır. Örnek veriyorum 123 yollanacak peşine birde & yollarsın yada başka bir karekter hiç olmadı 255 i ASCII olarak tek byte halinde yolların karekter olarak. Böylece alan taraf 3 byte ve peşinden gelen sonlandırma işaretini alır ve sonlandırmayı görerek alma işlemini sonlandırır.

PC tarafındaki programa müdahale edemediğinize göre mutlaka PC tarafından gelen byte ların sonunda ne geldiğine bakmanız gerekir. Genelde ASCII 13 gönderilir. Bu bir RETURN yani bitiş sembolüdür.
Bu durumda Pic tarafına sürekli byte al ve 13 rakamını aldığın aman almayı durdur demeniz gerekir.

PC tarafında neler yollandığını anlamak için geleni ekrana basan bir program yazın. Gelenleri bu şekilde görün. Hiç bir şekilde yollanan sayıların haricinde bir şey gelmiyor ise işimniz zor olacak. Bu durumda timeout dan yararlanmak gerekir. Sen 3 veya 4 tane beklersin 3 taneyi alırsın ve 4üncü gelmiyor ise sistem orada çakılır kalır taaki timeout işi bitirinceeye kadar. Timeout meydana gelincede işi bitirirsiniz. Başkada yolu yok bu işin. Sistemin güzel çalışması için mutlaka USART kesmesi kullanmanız gerekir.

Dikkatimi çeken bir şey oldu sayı dizisinin başına PC tarafından AB ekleniyor olsa gerek ki dizi başını bulmak için bu işaretçiyi kullanmışsınız. Bunun doğru olduğunu nereden keşfettiniz? Yani bir işaretçi olduğunu nasıl anladınız merak ettim doğrusu.

Ete

ferit0158

#7
öncelikle tekrar teşekkür ederim hepinize konuya ilginizden dolayı. öncelikle yapmak istediğim projeyi paylaşayım. bir eğlence merkezinde pc kontrollü jeton makinası var. pc de girilen para miktarı (5 tl, 10 tl, 15 tl......100 tl) pic kontrollü karta aktarılıyor. bu noktadan sonra pic'in yapacağı gelen veri kadar bir pinden pals göndererek  jeton vermek. örneğin gelen veri 10 ise 10 puls. öncelikle şunu söyleyim bu işi ticari olarak yapmıyorum. sistemde başka bir arızaya müdahale ederken nasıl oldu anlamadım ama pic kontrol kartı bir şekilde bozuldu iş üzerime kaldı. bende yarım yamalak bilgimle ve sizlerin de yardımı ile bu işi çözmeyi umut ediyorum. kartın yenisi çin'den geliyor ve oldukça  pahalı. ETE hocam pc de A ve B karakterlerinin geldiğini şöyle anladım. aynı makinadan bir tane daha var. pic kontrol kartı üzerinde lcd ekran var. pc den veri geldiğinde önce a sonra b harfı görünüyor. sonra çince yazılar geliyor. acaba mı diyerek denedim ve doğru yolda olduğumu gördüm. ama gel gör ki işin çözebildiğim tek noktası burası oldu. çok fazla algoritmalar oldu. mesela pc de girilen değer sadece iki veya sadece  üç basamaklı olsa sorun olmuyor gelen veriyi lcd ekranda okuyabiliyorum. ama verinin hane sayısı değişince işler karışıyor. diyelim ki pc de girilen rakam 100 bu rakamı pice aldım ama eğer 99 girilecek olursa hiçbir şekilde lcd ekranda bir veri okuyamıyoum. ETE hocam uart kesmesi de denedim ama çözüm bulamadım. elektronik konusunda iyiyim ama pic konusunda iyi kötü bir şeyler yapabiliyorum sizler gibi usart değilim. sizlerin seviyesine ulaşmam için çok fırından çok ekmek yemem lazım. benim acemi olduğumu düşünerek bu konuda yol gösterirseniz çok sevinirim.

Hattuşa

feri usta;
lcd ekran tarafı senin tarafın değilmi müdahale edebiliyosun yani?
şimdi pc tarafından gelen data miktarı belli değil mi? hane sayısı pc den max kaç tane girilebiliyor?
proton basic biliyormusunuz?

ferit0158

#9
Alıntı yapılan: pro-TR - 07 Şubat 2020, 12:47:58feri usta;
lcd ekran tarafı senin tarafın değilmi müdahale edebiliyosun yani?
şimdi pc tarafından gelen data miktarı belli değil mi? hane sayısı pc den max kaç tane girilebiliyor?
proton basic biliyormusunuz?

evet ekran pic tarafında müdehale edebiliyorum. pc tarafından gelen data miktarı belli değil. mesela "RSIN  { TIMEOUT },WAIT("AB"),sayi[0],sayi[1],sayi[2],sayi[3],sayi[4],sayi[5],sayi[6],sayi[7]" ben veri alma satırını bu şekilde uzatıyorum ama herhangi bir şekilde gelen data miktarını çözemedim. bu şekilde eğer pc tarafında 123456789 rakamlarını girersem pic tarafında verileri görebiliyorum eğer rakamların hane sayısı  1 fazla veya 1 eksik olursa yine veri okuyamıyorum. yani pic tarafında belirttiğim byte sayısı kadar data gelmeyince veriyi okuyamıyorum. sanki bir tımer gibi bir şey olsa yani belli zamanda gelen dataları alsa gelmeyenleri yok sayıp geçse olacak gibi geliyor bana. proton bilmiyorum. 

Hattuşa

byte word tipi değişkenlerin dönüşümlerini biliyormusunuz?
0-255 arası byte
0-65535 arası word gibi
şimdi sen pc den 1000 yazıp yolladığında pic tarafında 4 byte data gelmiyor. 2 byte data geliyor. buda
1000 değerinin lowbyte ve 1000 değerinin highbyte değerlerini alırsın, zaten bu tip haberleşmelerin tamamı byte byte yapılmaktadır. benim size ısrarla sorduğum soru şuydu, diyelim ki 1000 yazdın pc den, pic tarafında ise
gelen[0],gelen[1].....gelen[4] datalarını ekranda görebiliyormusun sorusuydu, gelen data farklı bir değer alacak elbette ki sen onu word tipine değiştireceksin.

öncelikle gelen datanın içeriğine bakma, gelen data miktarına bak. adam stringe mi çevirip basamak basamak mı yollamış, integer(word) bir değer kabul edip byte byte mi yollamış, ASCII karakteri olarak mı yollamış, UTF-8 tipinde mi yollamış öncelikle onu çözmeye çalış.

başka da nasıl yardımcı olabiliriz bilmiyorum.

zira verdiğin bilgiler yetersiz senin aklından geçen ile pc programında yapılan belirsiz

ete

Pro_Tr,
Bir yanlışlık yapmayalım. Daha önce PC ile data alışverişi yaptım. Özel tedbir almazsanız PC rakamları ASCII formatında yollar. Rakam olarak yollamaz. Yani 1000 rakamını 49-48-48-48 şeklinde 4 byte olarak yollar. Ferit0158 de bu şekilde söylüyor sanırım.
Burada yapılacak iş,
- önce basit bir alma rutini yazılacak ve gelen ne varsa rakam formatında değilde ASCII formatında LCD de gösterilecek.
Malum LCD de DEC, HEX , BIN veya # gibi format belirleyici kullanmadan direk LCDOUT $fe,$80, GELEN
şeklinde yazdırırsanız gelen bilgi ASCII formatında yazılır ekrana. Bu durumda 13 geliyormu yada başka bir sonlandırma karekteri varmı görülebilir.
Epeyce bir deneme yapmak gerekiyor.
Ben olsam şöyle yapardım,
Önce lcdout $fe,1 yazıp altına,
ALMA:
RSIN  { TIMEOUT },WAIT("AB"),gelen
LCDOUT GELEN,
TEKRAR:
RSIN ,GELEN
LCDOUT GELEN,
goto tekrar

Şeklinde ne var ne yok geleni alıp LCD de gösterirdim. Böylece varsa bir son karekter görürdüm.
Diyelimki PC den 123 yollandı
Ekranda 49505113 gibi bir şey görebilirsen sonuç harika olurdu. En sondaki RETURN (13) oluyor bu şekilde.
Program orada takılabilir bu sorun değil. Nasıl olsa deneme programı ama önemli olan gelenleri bir arada görebilmek.

Ete

Hattuşa

ete hocam;
bende 1 yıldır pc ve android seriport haberleşme programları ile uğraşıyorum.
gönderilen datanın formatı değişebilir. aslında benimde 2-3 mesajdır anlatmaya çalıştığım konuda bu şekilde tabi anlatma özürlü olduğum için anlatamıyorum. öyle sanıyorum ki arkadaş pc den gönderdiğini direk lcd de görmeye çalışıyor, saçma sapan değerler görünce de hata yaptığını sanıyor. anlatmak istediğim gönderilen datalar byte byte gelir, gelen byteları değerler saçma da olsa ekranda görelim. formatını düzeltiriz diye düşünmüştüm.

ferit0158

Alıntı yapılan: ete - 07 Şubat 2020, 17:30:26Pro_Tr,
Bir yanlışlık yapmayalım. Daha önce PC ile data alışverişi yaptım. Özel tedbir almazsanız PC rakamları ASCII formatında yollar. Rakam olarak yollamaz. Yani 1000 rakamını 49-48-48-48 şeklinde 4 byte olarak yollar. Ferit0158 de bu şekilde söylüyor sanırım.
Burada yapılacak iş,
- önce basit bir alma rutini yazılacak ve gelen ne varsa rakam formatında değilde ASCII formatında LCD de gösterilecek.
Malum LCD de DEC, HEX , BIN veya # gibi format belirleyici kullanmadan direk LCDOUT $fe,$80, GELEN
şeklinde yazdırırsanız gelen bilgi ASCII formatında yazılır ekrana. Bu durumda 13 geliyormu yada başka bir sonlandırma karekteri varmı görülebilir.
Epeyce bir deneme yapmak gerekiyor.
Ben olsam şöyle yapardım,
Önce lcdout $fe,1 yazıp altına,
ALMA:
RSIN  { TIMEOUT },WAIT("AB"),gelen
LCDOUT GELEN,
TEKRAR:
RSIN ,GELEN
LCDOUT GELEN,
goto tekrar

Şeklinde ne var ne yok geleni alıp LCD de gösterirdim. Böylece varsa bir son karekter görürdüm.
Diyelimki PC den 123 yollandı
Ekranda 49505113 gibi bir şey görebilirsen sonuç harika olurdu. En sondaki RETURN (13) oluyor bu şekilde.
Program orada takılabilir bu sorun değil. Nasıl olsa deneme programı ama önemli olan gelenleri bir arada görebilmek.

Ete


ETE hocam öncelikle sizlerden özür diliyorum yarım yamalak bilgim ile sizlerden yardım almaya çalışırken bir yandan da vaktinizi aldığım için. hakkınızı helal edin. hocam kodları aşağıda ki gibi yazınca dediğiniz şekilde pc den 123 rakamını gönderdiğimde  ekranda "495051"rakamlarını görüyorum.
BASLA:

lcdout $fe,2,@RAKAM1," ",@RAKAM2," ",@RAKAM3


RSIN  { TIMEOUT },WAIT("AB"),sayi[0],sayi[1],sayi[2]
rakam1=sayi[0]
rakam2=sayi[1]
rakam3=sayi[2]


bunlardan başka veri gelmiyor. aslında bu şekilde de benim işimi görecek gibi ama şöyle bir sıkıntı var. mesela pc tarafında 123 yazdığımda veri geliyorken sadece 12 yazdığımda veri alamıyorum. işte bu kısmı aşabilsem sıkıntı olmayacak. aşağıda ki şekilde convert edip toplama işlemi yaparak kaç pals göndermem gerektiğini hesaplamış olacağım.

CEVIR:
IF RAKAM1=48 THEN SAYI1=0
IF RAKAM1=49 THEN  SAYI1=1
IF RAKAM1=50 THEN  SAYI1=2
IF RAKAM1=51 THEN  SAYI1=3
IF RAKAM1=52 THEN  SAYI1=4
IF RAKAM1=53 THEN  SAYI1=5
IF RAKAM1=54 THEN  SAYI1=6
IF RAKAM1=55 THEN  SAYI1=7
IF RAKAM1=56 THEN  SAYI1=8
IF RAKAM1=57 THEN  SAYI1=9

IF RAKAM2=48 THEN SAYI2=0
IF RAKAM2=49 THEN  SAYI2=1
IF RAKAM2=50 THEN  SAYI2=2
IF RAKAM2=51 THEN  SAYI2=3
IF RAKAM2=52 THEN  SAYI2=4
IF RAKAM2=53 THEN  SAYI2=5
IF RAKAM2=54 THEN  SAYI2=6
IF RAKAM2=55 THEN  SAYI2=7
IF RAKAM2=56 THEN  SAYI2=8
IF RAKAM2=57 THEN  SAYI2=9

IF RAKAM3=48 THEN SAYI3=0
IF RAKAM3=49 THEN  SAYI3=1
IF RAKAM3=50 THEN  SAYI3=2
IF RAKAM3=51 THEN  SAYI3=3
IF RAKAM3=52 THEN  SAYI3=4
IF RAKAM3=53 THEN  SAYI3=5
IF RAKAM3=54 THEN  SAYI3=6
IF RAKAM3=55 THEN  SAYI3=7
IF RAKAM3=56 THEN  SAYI3=8
IF RAKAM3=57 THEN  SAYI3=9

SAYI1=SAYI1*10
SAYI2=SAYI2*1
SAYI3=SAYI3
SON=SAYI1+SAYI2.+sayı3

RETURN

ete

Neden başka bir şey görmüyorsun hiç düşündünmü?
Ben açıklayayım. Ama önce şunu belirteyim. Muhtemelen başka karekter yada karekterler de geliyordur ama sen yalnızca 3 byte alacak şekilde programını düzenlediğin için yalnızca 3 bayte görüyorsun.
RSIN  { TIMEOUT },WAIT("AB"),sayi[0],sayi[1],sayi[2]
Bu satırı şöyle yazmayı dene
RSIN  { TIMEOUT },WAIT("AB"),sayi[0],sayi[1],sayi[2], SAYI[3]
ve ekrana verirkende ,
lcdout $fe,2,@RAKAM1," ",@RAKAM2," ",@RAKAM3, @RAKAM4
Şeklinde yaz bakalım ne çıkacak?

Ete

Powered by EzPortal