Dökümanlar - Makaleler ve Projeler => PIC Basic Dersleri => Konuyu başlatan: redmen - 01 Kasım 2023, 09:40:20
Başlık: PİC16f628a serial haberlesme sorunu
Gönderen: redmen - 01 Kasım 2023, 09:40:20
Selamunaleykum hayırlı günler bir proje üzerinde çalışıyorum.Normal şartlar da çalışan işimi gören bir yazılımım mevcut kendi yazdığım,ancak bu yazılıma serial port üzerinden çalışan C# ile yapılmış bir arayüz yapıp kolay yoldan proğramlamak istedim ancak veri aktarımda sorun yaşıyorum bilgi verirseniz sevinirim.
'****************************************************************
'* Name : PC STEEP MOTOR *
'* Author : [DESIGN BY FATİH AYDOĞDU] *
'* Notice : Copyright (c) 2011 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 10.10.2011 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
@ DEVICE pic16f628A 'DENETLEYİCİ 16f628A
@ DEVICE pic16f628A, WDT_ON 'BEKÇİ KÖPEĞİ AÇIK
@ DEVICE pic16f628A, PWRT_ON 'GERİLİMDENGELENİNCE 1 KEZ RESET AT
@ DEVICE pic16f628A, PROTECT_OFF 'KOD KORUMA KAPALI
@ DEVICE pic16f628A, MCLR_OFF 'MCLR PİNİ KULLANILMAYACAK
@ DEVICE pic16f628A, INTRC_OSC_NOCLKOUT 'DAHİLİ OSİLATÖRÜ KULLAN
@ DEVICE Pic16f628A, BOD_OFF 'GERİLİM DALGALANMASI RESET KAPALI
INCLUDE "MODEDEFS.BAS"
'*****************************************************************
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 25 ' 9600 Baud @ 4MHz, 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
DEFINE HSER_BAUD 9600 ' BaudRate 9600
DEFINE OSC 4
'******************************************************************
TRISA=%00000000 'A PORTU ÇIKIŞ
TRISB=%00000010 'B PORTUNUN 2.BİTİ GİRİŞ
PORTB=0:PORTA=0 'A VE B PORTLARI SIFIRLANDI
CMCON=7 'COMPARATÖR İPTAL
'******************************************************************
VERI VAR WORD[7]
VER1 VAR WORD[7]
FREKANS VAR WORD[7]
RCA VAR BYTE 'RCA ADINDA 8 BİTLİK DEĞİŞKEN TANIMLANDI
SYMBOL GIE =INTCON.7 'BUTÜN İNTERRUPTLAR AÇILDI
SYMBOL PEIE =INTCON.6 'USARTR INTERRUPT AÇILDI
SYMBOL RCIE =PIE1.5 'USART ALMA AÇILIYOR
SYMBOL RCIF =PIR1.5 'USART INTERRUPT OLUŞTU BBAYRAĞI
'*******************************************************************
RCIE=1
PEIE=1
GIE=1
RCIF=0
INTCON=%11000000
ON INTERRUPT GOTO INT
NERE:
pause 250
FREKANS1:
pause 2000
serout PORTA.1,T9600,["*"]
PAUSE 2000
serout PORTA.1,T9600,[FREKANS,13,10]
PAUSE 2000
goto nere
DISABLE
INT:
GIE=0
HSERIN [VER1]
FREKANS=VER1
HSEROUT [FREKANS]
RCA=RCREG
RCIF=0
GIE=1
Resume
enable
'END
Bu üzerinde uğraştığım..
@ DEVICE pic16F628A
@ DEVICE pic16F628A, WDT_OFF
@ DEVICE pic16F628A, PWRT_ON
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT
@ DEVICE pic16F628A, PROTECT_ON
@ DEVICE pic16F628A, MCLR_off 'MCLR pini kullanılıyor.
include "modedefs.bas"
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 24h
DEFINE HSER_SPBRG 25
DEFINE HSER_CLROERR 1
VERI var WORD
TRISB=%11011111
TRISA=%11000000
CMCON=7
OPTION_REG=7
PORTB=0
PORTA=0
PAUSE 100
IF PORTA.7=1 THEN GOTO FREKANS2
pause 250
FREKANS1:
pause 2000
serout PORTA.1,T9600,["*"]
PAUSE 2000
serout PORTA.1,T9600,["AT+DMOSETGROUP=0,173.9750,173.9750,0012,0,0000",13,10]
PAUSE 2000
SEROUT PORTA.1,T9600, ["AT+DMOSETVOLUME=5",13,10]
PAUSE 1000
GOTO DEVAM
FREKANS2:
pause 2000
serout PORTA.1,T9600,["*"]
PAUSE 2000
serout PORTA.1,T9600,["AT+DMOSETGROUP=0,136.1000,136.1000,0012,0,0000",13,10]
PAUSE 2000
SEROUT PORTA.1,T9600, ["AT+DMOSETVOLUME=4",13,10]
PAUSE 1000
GOTO DEVAM
DEVAM:
SAYI VAR BYTE
STD var PORTB.0 '1 STD 8870
E1 var PORTB.4 'Q1 du 8870
E2 var PORTB.3 'Q2 du 8870
E3 var PORTB.2 'Q3 du 8870
E4 var PORTB.1 'Q4 du 8870
SIFRE_1 var PORTB.5 '
PORTA.0=1
b1 VAR BYTE
b2 VAR BYTE
b3 VAR BYTE
b1=0
b2=0
b3=0
c1 var BYTE '1° code DTMF
c2 var BYTE '2° code DTMF
c3 var BYTE '3° code DTMF
c4 var BYTE '4° code DTMF
Q1 var BIT
Q2 var BIT
Q3 var BIT
Q4 var BIT
BASLA:
DTMF1:
BUTTON STD,1,255,0,b1,1,DECODER1
PAUSE 20
BUTTON STD,0,255,0,b2,1,RAZ
GOTO DTMF1
DECODER1:
Q1=E1
Q2=E2
Q3=E3
Q4=E4
c1 = Q1 + 2*Q2 + 4*Q3 + 8*Q4
GOTO DTMF2
DTMF2:
b3=0
WHILE b3<75
BUTTON STD,1,255,0,b1,1,DECODER2
PAUSE 20
b3=b3+1
WEND
GOTO DTMF1
DECODER2:
Q1=E1
Q2=E2
Q3=E3
Q4=E4
c2 = Q1 + 2*Q2 + 4*Q3 + 8*Q4
GOTO DTMF3
DTMF3:
b3=0
WHILE b3<75
BUTTON STD,1,255,0,b1,1,DECODER3
PAUSE 20
b3=b3+1
WEND
GOTO DTMF1
DECODER3:
Q1=E1
Q2=E2
Q3=E3
Q4=E4
c3 = Q1 + 2*Q2 + 4*Q3 + 8*Q4
GOTO SIFRE
RAZ:
Q1=0
Q2=0
Q3=0
Q4=0
GOTO DTMF1
END
SIFRE:
PAUSE 10
IF c1=3 AND c2=9 AND c3=8 THEN
SIFRE_1=1
PORTA.0=0
ENDIF
IF c1=7 AND c2=8 AND c3=5 THEN
SIFRE_1=1
PORTA.0=0
ENDIF
IF c1=1 AND c2=4 AND c3=9 THEN
SIFRE_1=1
PORTA.0=0
ENDIF
IF c1=5 AND c2=6 AND c3=4 THEN
SIFRE_1=1
PORTA.0=0
ENDIF
IF c1=7 AND c2=10 AND c3=5 THEN
SIFRE_1=1
PORTA.0=0
ENDIF
IF c1=2 AND c2=5 AND c3=7 THEN
SIFRE_1=1
PORTA.0=0
ENDIF
IF c1=8 AND c2=2 AND c3=6 THEN
SIFRE_1=1
PORTA.0=0
ENDIF
IF c1=12 AND c2=10 THEN
SIFRE_1=0
PORTA.0=1
ENDIF
c1=0
c2=0
c3=0
c4=0
GOTO DTMF1
Bu da normal olarka kullandığım.
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: aRci - 01 Kasım 2023, 10:05:31
Merhaba; simulasyondaki portu uygulamaya bağlamak için sanırım sanalport programı kullanmak gerekiyordu bende ihtiyaç duymuştum ve o şekilde çözdüğümü hatırlıyorum tabi en kolayı küçük bir devre yapıp doğrudan test etmek
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: redmen - 01 Kasım 2023, 11:06:45
Merhaba evet sanal port kullanılıyor lakin sorun yaşadım bende bir max232 li bir de uart modülü kullanarak iki modülü fiziksel olarak birleştirip gerçek deneme olanığı sağladım.sorunsuz çalışıyor.
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: ete - 01 Kasım 2023, 14:37:38
Ortada bir sorun varmıdır yokmudur anlayamadım. Birinci mesaj sorun var diyor son mesaj sorunsuz çalışıyor diyor. Farklı şeyler için kullanılmış sözler olabilir. Kodları incelediğimde gördüğüm kusurlu yerleri aşağıda veriyorum. Birinci kod'da, NERE ile GOTO NERE satırları arasında yer alan PAUSE'ler haberleşme senkronunu bozacak niteliktedirler.
Basic de bir kural vardır. İşlenmekte olan BASIC komutu bitirilmeden kesme oluşsa bile kesme alt programına program gitmez. Komutun bitirilmesini bekler. PAUSE 2000 yaklaşık 2000 ms yada 2 sn lik bir gecikme yaratan komuttur. Bu şu demektir bu komutun bitirilme süresi 2000 ms dir. Bu komut işlenirken USART portuna bilgi geldiği algılanır ise program Kesme etiketine gidemeyeceği için o gelen bilgi kaçırılacak demektir. Bu durumda yeni kuralı söyleyeyim. Bir programda Kesme kullanıyorsunuz kesinlikle pause komutunu kullanmayınız. Yada gecikmeyi çok küçük (us) dilimlere bölerek uygulayın. İlla gecikme yaratacaksanız aşağıdaki gibi yapın. Süre yetmez ise daha fazla PAUSEUS 5 ekleyebilirsiniz. FOR W=0 TO 10000 PAUSEUS 5 PAUSEUS 5 PAUSEUS 5 NEXT Bu komutlarda size epeyce bir gecikme yaratacaktır. Ancak USART'a bilgi gelir ise en fazla 5us gecikme ile program Kesme etiketine gidecektir.
İkinci programda basic sayı limitlerini aşan değerler yer alıyor. Bu değerler komut formatına bakılırsa String şeklinde yollanıyor (çift tırnak arasında yer aldığı için) ise sorun olmaz. Mesela 136.1000 bir rakammıdır yoksa karektermidir Rakam ise Basic bunu yollayamaz. Çünki WORD tipi değişken değeri aşılmış oluyor. Bu ikincide de bol keseden Pause kullanılmış ama gönderen tarafta Pause kullanımı sorun yaratmaz. Alıcı taraf için ise büyük sorun.
Ete
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: redmen - 01 Kasım 2023, 14:58:58
Ete hocam öncelikle cevabınız için teşekkür ederim,sorun var birinci yazılım için sorun yok ise ikinci program içindi,birinci program arayüzle kullanmak için programın sadece bir bölümü,burada serial haberleşme yaparak arayüz üzerinden değer değişikliği yapmaya çalışıyorum gömülü sistemler de olduğu gibi,ikinci program ise mevcut kart üzerinde kullandığım arayüz programı olmaksızın kullandığım sorun yaşamadığım istediğimi yapan bir program,ben birinci bölümü ikinci program üzerine ekliyerek serial haberleşme yapmaya çalışıyorum,verdiğiniz bilgilere dikkat edip tekrardan üzerinde çalışacağım.arayüzden string bir ifade yada karekter grubu yolluyorum,pic ilk kareterden sonrasını almıyor onu çözmeye çalışıyorum.yoksa bu değişkenlerin eproma kaydı sonra geri çağrılması sonra komut satırına eklenmesi onlar ile sorun yaşıyacağımı sanmıyorum.
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: enes - 02 Kasım 2023, 01:56:29
VER1 VAR WORD[7]
VER1 WORD tıpı tanımlama yapmıssın
DISABLE INT: GIE=0 HSERIN [VER1] FREKANS=VER1
usart haberlesme kesme rutınınde bu sekılde word tıpı degısken alımı yapamazsın. alınacak verı byte tıpınde olmalı
once bi isaretcı data ayarla sonrasınde bir dongu kurarak dıger verılerı pespese almaya calıs.
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: redmen - 02 Kasım 2023, 08:12:02
Teşekkür ederim kardeşim,ben elektronik konusun da çok iyiyim ama proğram işimi geliştirme gereksinimi pek duymamıştım universiteden sonra,genel de karşılaştırma,sinyal takip gibi,pic programları üzerinde çalıştım,lakin şimdi artık iş tamamen plc yada pic üzerinden dönüyor. Uuart ve serial habesleşme üzerinde pek çalışmadım,o yüzden biraz deneme yanılma yolu ile ilerliyorum,örnek programlar atarsanız sevinirim,
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: ete - 02 Kasım 2023, 08:40:30
Birinci programdaki Pause ler o program için hiç bir sorun yaratmaz. Program çalışır. Asıl sorun karşıdaki Alıcıda oluşur. Bu sorun biz senkron uyuşmazlığı diyoruz. Örnekle açıklayayım. - Oda da oturuyorsun - Kapı çaldı ve sen o anda ne yapıyorsan bırakıp gidip kapıyı açıyorsun . Ne geldi ise alıyorsun. Burada sen kapı ile senkron çalıştın. Bir yerde kapının çalmasını bekliyordun.
Şimdi aynı örneği farklı şekilde işleyelim.
- Oda da oturuyorsun birden tuvalet ihtiyacı duydun ve oraya girdin. (Pause 2000 başladı) - O anda kapı çaldı ama sen kapıya gidemiyorsun çünki meşgulsün. (Pause sürüyor) - Kapıdaki adam kapının açılmadığını görüp geri gitti. - Sen Tuvaletten çıktın (pause bitti) kapıya koştun açtın ama kimseyi göremedin. Ne oldu gelen kimse onu kaçırdın. Olay tamamen buna benzer şekilde gelişir. Alıcı ile verici senkron içinde olmaz ise veri alışverişi olmaz. Verici ne zaman isterse bilgi yollayabilir. Ama Alıcı o veriyi sürekli beklemelidir. İşte Pause ler bu sürekli bekleme işini bozan unsurlardır. Her ne kadar Kesme kullansanız da Pause var ise Pause süresi sona ermeden program kesme etiketine gidemez. BU açıklamaya göre yeniden düşün istersen.
İkinci programdaki yollama verisinin her bir karekterini bir diziye atarsan ve dizi yollama formatını kullanırsan bu sorunu aşarsın gibi geliyor bana. Her bir karekter tek bir byte gibi düşünülmelidir. Ancak bu şekilde yapılabilir sanırım.
hserout [STR ArrayVar{\n}]' Send string of n characters Alırken de benzer şekilde hserin [STR ArrayVar{\n}]' Send string of n characters
Ete
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: redmen - 02 Kasım 2023, 09:40:07
Hocam pauseler kısmını düzelttim,orda sorun yok,zaten o aslında başka bir programı takip etmesi içindi,onun için biraz karıştı,mesala dtmf sinyali ile cihaz açıldığında, dışardan gelecek bir pulse ile sayma işlemi de yaptırıp kapatma sinyali gelmez ise 7 dk için de sistemin resetlemesi içindi,ama şu işi çözünce ona bir düzenleme getireceğim,c# arayüzünde aslında iki şey denedim,ikisin de de istediğimi gönderebiliyorum mesala birisin de FREKANS ="AT+DMOSETGROUP=0,173.9750,"+sayi2+"0,0012,0,0000"; bu şekilde yaparak serial port üzerinden string bir ifade olarak gönderebiliyorum ancak bu pic için zor durum olduğu için onun yerine bu satırı pic içerisine yazıp arada ki c# üzerinden sayı2 değişkenlerini gönderip eproma kayıt edip,sonra epromdan çağırıp pic içerisinde komut satırında birleştirip serilport üzerinden SA818 Modülüne göndermek istiyorum işin aslı bu,tabi bu veri akışını istediğim gibi sağlarsam dtmf şifrelerini de değişkenler vasıtası ile eproma yazmayı düşünüyorum,aynı anda bir çok işlemi pic,e yaptırmaya çalışıyorum belki de ama olursa güzel olacak kanatindeyim.
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: redmen - 02 Kasım 2023, 09:52:13
C# üzerinden bu şekilde bir veri gönderimi yapıyorum ve 16f628a veriler sıra ile ver1 ver2 ver3 şeklinde bilgi işareti ile gönderiliyor
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: enes - 03 Kasım 2023, 01:18:54
zaman bılgısı gondermek ve almak ıcın su sekılde yapıyorum
ama senın gonderdıgın verıler 255 uzerı oldugu ıcın pc tarafında verıyı bytlarına ayırıp tek tek gondermeyı dene. PıC tarafında da ayrılmıs parcaları bırlestır ve kullan...
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: redmen - 03 Kasım 2023, 08:04:43
Teşekkür ederim kardeşim,bu yöntemi de deneyeceğim inşallah.
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: redmen - 03 Kasım 2023, 12:05:16
Öncelikle herkese ilgisinden ve verdikleri bilgilerden dolayı teşekkür ederim.belki birilerinin fikri olur yada takıldığı bir nokta olursa güzel bir örnek oldu,tabi ki proğram üzerinde henüz işim bitmedi ama serial haberleşme eproma kaydetme,epromdan okuma,okunan bilgiyi serout komutu ile dışarı aktarma bölümünü buraya yazıyorum.
@ DEVICE pic16f628A 'DENETLEYİCİ 16f628A
@ DEVICE pic16f628A, WDT_ON 'BEKÇİ KÖPEĞİ AÇIK
@ DEVICE pic16f628A, PWRT_ON 'GERİLİMDENGELENİNCE 1 KEZ RESET AT
@ DEVICE pic16f628A, PROTECT_OFF 'KOD KORUMA KAPALI
@ DEVICE pic16f628A, MCLR_OFF 'MCLR PİNİ KULLANILMAYACAK
@ DEVICE pic16f628A, INTRC_OSC_NOCLKOUT 'DAHİLİ OSİLATÖRÜ KULLAN
@ DEVICE Pic16f628A, BOD_OFF 'GERİLİM DALGALANMASI RESET KAPALI
INCLUDE "MODEDEFS.BAS"
'*****************************************************************
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 25 ' 9600 Baud @ 4MHz, 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
DEFINE HSER_BAUD 9600 ' BaudRate 9600
DEFINE OSC 4
'******************************************************************
TRISA=%00000000 'A PORTU ÇIKIŞ
TRISB=%00000010 'B PORTUNUN 2.BİTİ GİRİŞ
PORTB=0:PORTA=0 'A VE B PORTLARI SIFIRLANDI
CMCON=7 'COMPARATÖR İPTAL
'******************************************************************
VER1 VAR BYTE
VERI VAR byte[7]
FRE VAR WORD
TOPLAM VAR BYTE[7]
RCA VAR byte 'RCA ADINDA 8 BİTLİK DEĞİŞKEN TANIMLANDI
SYMBOL GIE =INTCON.7 'BUTÜN İNTERRUPTLAR AÇILDI
SYMBOL PEIE =INTCON.6 'USARTR INTERRUPT AÇILDI
SYMBOL RCIE =PIE1.5 'USART ALMA AÇILIYOR
SYMBOL RCIF =PIR1.5 'USART INTERRUPT OLUŞTU BBAYRAĞI
'*******************************************************************
RCIE=1
PEIE=1
GIE=1
RCIF=0
INTCON=%11000000
ON INTERRUPT GOTO INT
NERE:
pause 2
FREKANS1:
pause 2
serout PORTA.1,T9600,["*"]
PAUSE 2
READ 0,VERI[0],VERI[1]
READ 2,VERI[2],VERI[3]
READ 4,VERI[4],VERI[5]
READ 6,VERI[6],VERI[7]
serout PORTA.1,T9600,["AT+DMOSETGROUP=0,173.9750,",VERI[0],VERI[1],VERI[2],VERI[3],VERI[4],VERI[5],VERI[6],VERI[7],"0,0012,0,0013",13,10]
PAUSE 2
DISABLE
INT:
GIE=0
HSERIN 100,NERE,[WAIT("VER1"),VERI[0],VERI[1],VERI[2],VERI[3],VERI[4],VERI[5],VERI[6],VERI[7]]
VER1=VERI
WRITE 0,VERI[0],VERI[1]
WRITE 2,VERI[2],VERI[3]
WRITE 4,VERI[4],VERI[5]
WRITE 6,VERI[6],VERI[7]
HSEROUT [VERI[0],VERI[1],VERI[2],VERI[3],VERI[4],VERI[5],VERI[6],VERI[7]]
RCA=RCREG
RCIF=0
GIE=1
Resume
enable
goto nere
END
ve konu ile ilgili iki adet resim yolluyorum,ilk resim ısıs çalıştığında epromda ki verinin serout üzerinden aktarılması,ikinci resim ise arayüzden gelen verinin eproma alınıp serout üzerinden aktarılmasıdır. (https://i.ibb.co/NLvnB95/1.jpg) (https://ibb.co/NLvnB95)
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: aRci - 04 Kasım 2023, 01:44:46
paylaşım için teşekkürler ben size pc programını soracağım bunun ile ilgili detay verebilirmisiniz eğer ticari değilse ve hatta bir konu açıp yeni başlayanlar için kısam örnekler verebilirmisiniz.
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: redmen - 04 Kasım 2023, 10:58:25
Aslın da ticari lakin çokta önemli değil,Visual studio ile hazırlanmış bir arayüz,kullanımı kolay ve kodlar anlaşılır,işimiz tamamlanınca paylaşım da bulunuruz inşallah.saklayacak bir şey değil yani.
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: ete - 04 Kasım 2023, 11:06:15
VER1=VERI satırı dizi index parametresi vermezseniz anlamı şu şekildedir. VER1[0]=VERI[0] burada bütün diziyi diğer değişkene aktarmak ise amacınız döngü kullanmanız gerekir.
Bu işi aşağıdaki döngüde iki işi birden yaptırabilirsiniz.
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: ete - 04 Kasım 2023, 16:43:47
Enes'in tespiti doğru. Kesme içinden kasme dışı bir etikete Goto ile gidilmez gidilemez. Gidilirse stack hatası ortaya çıkar.
Kesme işlemi otomatik adreslemeli çalışır. Programın herhangi bir anında kesme oluştuğu zaman ki işlemci bunu kesme bayraklarının set edilmesinden anlayabiliyor işlemci önce işlediği komutu bitirir. Sonra bulunduğu adresi (programın ASM karşılığında) STACK içine yazar ve doğruca kesme etiketine gelir. Oradaki işlemleri bitirdikten sonra RESUME (ENABLE) ile hemen STACK içinden yazılmış en son adresi alıp o adrese otomatik olarak döner. Bu nedenle kesme içinden GOTO ile başka bir yere giderseniz geliş adresi stack da kalır ve bir sonrakinde yeniden stack dan adres alınacağı için bir kaç işlem sonra stack dolar ve taşma oluşur. Program kontrolünü kaybeder. Bir noktada kilitlenir kalır.
Ete
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: redmen - 05 Kasım 2023, 22:11:36
Öncelikle verdiğiniz altın değerinde ki bilgiler için teşekkür ederim kesme için de ki goto nere komutu sumilatör yaparken bir kaç değişikliği görebilmem içindi,çünkü yazılım içinde ki ufak değişikliğin simulatör de ki değişimini görmemi sağlıyordu,zira zaten programın bir bölümü bu çünkü program.ilk çalıştığında module iki tane komut gönderecek,sonra dtmf şifrelerini değişkenlere atayacak.sonra,sistem dtmf bölümünde kalacak.dtmf aktif olduğunda portun birinden sayacın çalışması için pulse alacak.bu arada bu kısaltmaları uygulayıp deneyeceğim ancak programın şu hali bile umut verici benim için.
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: redmen - 11 Kasım 2023, 11:14:29
'****************************************************************
'* Name : *
'* Author : *
'* Notice : *
'* : *
'* Date : *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
@ DEVICE pic16f628A 'DENETLEYİCİ 16f628A
@ DEVICE pic16f628A, WDT_ON 'BEKÇİ KÖPEĞİ AÇIK
@ DEVICE pic16f628A, PWRT_ON 'GERİLİMDENGELENİNCE 1 KEZ RESET AT
@ DEVICE pic16f628A, PROTECT_OFF 'KOD KORUMA KAPALI
@ DEVICE pic16f628A, MCLR_OFF 'MCLR PİNİ KULLANILMAYACAK
@ DEVICE pic16f628A, INTRC_OSC_NOCLKOUT 'DAHİLİ OSİLATÖRÜ KULLAN
@ DEVICE Pic16f628A, BOD_OFF 'GERİLİM DALGALANMASI RESET KAPALI
INCLUDE "MODEDEFS.BAS"
'*****************************************************************
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 25 ' 9600 Baud @ 4MHz, 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
DEFINE HSER_BAUD 9600 ' BaudRate 9600
DEFINE OSC 4
'******************************************************************
TRISA=%00111100 'A PORTU ÇIKIŞ
TRISB=%00000011 'B PORTUNUN 2.BİTİ GİRİŞ
PORTB=0:PORTA=0 'A VE B PORTLARI SIFIRLANDI
CMCON=7 'COMPARATÖR İPTAL
VERI VAR byte[7]
SIF1 VAR BYTE[3]
SIF2 VAR BYTE[3]
SIF3 VAR BYTE[3]
SIF4 VAR BYTE[3]
SIF5 VAR BYTE[3]
SIF6 VAR BYTE[3]
SIF7 VAR BYTE[2]
SES VAR BYTE
RCA VAR byte 'RCA ADINDA 8 BİTLİK DEĞİŞKEN TANIMLANDI
SYMBOL GIE =INTCON.7 'BUTÜN İNTERRUPTLAR AÇILDI
SYMBOL PEIE =INTCON.6 'USARTR INTERRUPT AÇILDI
SYMBOL RCIE =PIE1.5 'USART ALMA AÇILIYOR
SYMBOL RCIF =PIR1.5 'USART INTERRUPT OLUŞTU BBAYRAĞI
NERE:
FREKANS1:
pause 2000
serout PORTA.1,T9600,["*"]
pause 2000
READ 0,VERI[0],VERI[1]
READ 2,VERI[2],VERI[3]
READ 4,VERI[4],VERI[5]
READ 6,VERI[6],VERI[7]
serout PORTA.1,T9600,["AT+DMOSETGROUP=0,173.9750,",VERI[0],VERI[1],VERI[2],VERI[3],VERI[4],VERI[5],VERI[6],"0,0012,0,0013",13,10]
pause 2000
READ 8,VERI[8]
SEROUT PORTA.1,T9600,["AT+DMOSETVOLUME=",VERI[8],13,10]
READ 10,SIF1[0],SIF1[1]
READ 12,SIF1[2],SIF2[0]
READ 14,SIF2[1],SIF2[2]
READ 16,SIF3[0],SIF3[1]
READ 18,SIF3[2],SIF4[0]
READ 20,SIF4[1],SIF4[2]
READ 22,SIF5[0],SIF5[1]
READ 24,SIF5[2],SIF6[0]
READ 26,SIF6[1],SIF6[2]
READ 28,SIF7[0],SIF7[1]
DEVAM:
STD var PORTA.2 '1 STD 8870
E1 var PORTB.0 'Q1 du 8870
E2 var PORTA.5 'Q2 du 8870
E3 var PORTA.4 'Q3 du 8870
E4 var PORTA.3 'Q4 du 8870
SIFRE_1 var PORTB.5 '
PORTA.0=1
b1 VAR BYTE
b2 VAR BYTE
b3 VAR BYTE
b1=0
b2=0
b3=0
c1 var BYTE '1° code DTMF
c2 var BYTE '2° code DTMF
c3 var BYTE '3° code DTMF
c4 var BYTE '4° code DTMF
Q1 var BIT
Q2 var BIT
Q3 var BIT
Q4 var BIT
BASLA:
DTMF1:
RCIE=1
PEIE=1
GIE=1
RCIF=0
INTCON=%11000000
ON INTERRUPT GOTO INT
BUTTON STD,1,255,0,b1,1,DECODER1
PAUSE 20
BUTTON STD,0,255,0,b2,1,RAZ
GOTO DTMF1
DECODER1:
Q1=E1
Q2=E2
Q3=E3
Q4=E4
c1 = Q1 + 2*Q2 + 4*Q3 + 8*Q4
GOTO DTMF2
DTMF2:
b3=0
WHILE b3<75
BUTTON STD,1,255,0,b1,1,DECODER2
PAUSE 20
b3=b3+1
WEND
GOTO DTMF1
DECODER2:
Q1=E1
Q2=E2
Q3=E3
Q4=E4
c2 = Q1 + 2*Q2 + 4*Q3 + 8*Q4
GOTO DTMF3
DTMF3:
b3=0
WHILE b3<75
BUTTON STD,1,255,0,b1,1,DECODER3
PAUSE 20
b3=b3+1
WEND
GOTO DTMF1
DECODER3:
Q1=E1
Q2=E2
Q3=E3
Q4=E4
c3 = Q1 + 2*Q2 + 4*Q3 + 8*Q4
GOTO SIFRE
RAZ:
Q1=0
Q2=0
Q3=0
Q4=0
GOTO DTMF1
END
SIFRE:
PORTA.0=0
PAUSE 10
serout PORTA.1,T9600,[SIF1[0],SIF1[1],SIF1[2]]
IF c1=4 AND c2=9 AND c3=3 THEN
SIFRE_1=1
PORTA.0=1
ENDIF
IF c1=SIF2[0] AND c2=SIF2[1] AND c3=SIF2[2] THEN
SIFRE_1=1
PORTA.0=1
ENDIF
IF c1=SIF3[0] AND c2=SIF3[1] AND c3=SIF3[2] THEN
SIFRE_1=1
PORTA.0=1
ENDIF
IF c1=SIF4[0] AND c2=SIF4[1] AND c3=SIF4[2] THEN
SIFRE_1=1
PORTA.0=0
ENDIF
IF c1=SIF5[0] AND c2=SIF5[1] AND c3=SIF5[2] THEN
SIFRE_1=1
PORTA.0=0
ENDIF
IF c1=SIF6[0] AND c2=SIF6[1] AND c3=SIF6[2] THEN
SIFRE_1=1
PORTA.0=0
ENDIF
IF c1=SIF7[0] AND c2=SIF7[1] THEN
SIFRE_1=0
PORTA.0=1
ENDIF
c1=0
c2=0
c3=0
c4=0
GOTO DTMF1
DISABLE
INT:
GIE=0
HSERIN 100,INT,[WAIT("VER1"),STR VERI\7]
HSERIN 100,INT,[WAIT("VER2"),SES[0]]
HSERIN 100,INT,[WAIT("VER3"),STR SIF1\3]
HSERIN 100,INT,[WAIT("VER4"),STR SIF2\3]
HSERIN 100,INT,[WAIT("VER5"),STR SIF3\3]
HSERIN 100,INT,[WAIT("VER6"),STR SIF4\3]
HSERIN 100,INT,[WAIT("VER7"),STR SIF5\3]
HSERIN 100,INT,[WAIT("VER8"),STR SIF6\3]
HSERIN 100,INT,[WAIT("VER9"),STR SIF7\2]
WRITE 0,VERI[0],VERI[1]
WRITE 2,VERI[2],VERI[3]
WRITE 4,VERI[4],VERI[5]
WRITE 6,VERI[6],VERI[7]
WRITE 8,SES
WRITE 10,SIF1[0],SIF1[1]
WRITE 12,SIF1[2],SIF2[0]
WRITE 14,SIF2[1],SIF2[2]
WRITE 16,SIF3[0],SIF3[1]
WRITE 18,SIF3[2],SIF4[0]
WRITE 20,SIF4[1],SIF4[2]
WRITE 22,SIF5[0],SIF5[1]
WRITE 24,SIF5[2],SIF6[0]
WRITE 26,SIF6[1],SIF6[2]
WRITE 28,SIF7[0],SIF7[1]
RCA=RCREG
RCIF=0
GIE=1
Resume
enable
goto NERE
Öncelikle kodun sondan bir önceki hali bu,şuan iletişim kurabiliyor değişkenleri değişterebiliyor serout komutunu kullanıp modulü istediğim gibi programlıyabiliyorum,şöyle bir sorun var,dtmf şifresini epromdan aldığım da dtmf açma yapmıyor,lakin epromdan çağırmadan rakamları direkt giresem sorunsuz açıyor,epromdan aldığım bilgiyi serout yaptığımda verinin girdiğim rakamsal ifade ile aynı olduğunu görüyorum.
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: ete - 12 Kasım 2023, 22:32:41
Programda görebildiğim tek kusur;
RCIE=1
PEIE=1
GIE=1
RCIF=0
INTCON=%11000000
ON INTERRUPT GOTO INT
kod satırlarının program içine yerleştirilmesi nedeni ile sürekli olarak tekrarlanması. Bu kodlar ilk açılışta yalnızca bir kereliğine çalışması gerekir. Bu nedenle bu satırların BASLA etiketinden önceki bölüme alınması gerekir.
Hala kesme son satırında GOTO NERE satırı yer alıyor bunuda kaldırsan iyi olacak.
Şifrenin epromdan okunması ile direk girilmesi arasında oluşabilecek tek fark tuş takımından girilen şifrenin rakamsal değerler taşıması diğerinde ise ASCII yani rakamların karekter karşılıklarının yer alması olabilir. Bunu bir şekilde test etmek gerekir. İşlemciyi yerinden sökerek programlayıcıya takıp READ komutu ile içini okumak ve Eprom adreslerine bakarak şifre olarak hangi rakamlar kayıt edilmiş görmek gerekir. Bilgi amaçlı şunları söyleyebilirim. 1 rakamını rakam olarak kayıt ederseniz epromda kayıtlı olan değer 1 dir. Aynı sayıyı karekter olarak kayıt ederseniz epromda 49 rakamını görürsünüz.
Ete
Ete
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: redmen - 12 Kasım 2023, 22:44:34
Hocam kesmye gidebilmek için proğramın başına koyunca program şifre bölümünde kalıyor bu aralıkta 16f628 içerisine herhangi bir veri yükliyemiyorum,ama programın içine yazarsam istediğim an veri atabiliyorum,goto nere zaten kalıcı değil orda end lieceğimi biliyorum lakin değişim yaptığımda simülatör de anlık değişimi görmemi sağlıyor,rakamsal ve karek meselesini iyice bir inceleyeceğim,şu an devreyi fiziksel olarak kurdum önerinizi uygulayacağım inşallah teşekkür ederim ilginiz için.
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: ete - 13 Kasım 2023, 09:56:14
Yazdığın program tamamen Basic kurallarına aykırı bölümler içeriyor ve bu şekilde sağlıklı çalışmasını beklemek bence hata olur.
Programın SIFRE bölümünde takılmasınada bir anlam veremiyorum. Takılma yalnızca stack taşması olursa olabilecek bir durum. Ama senin programında her hangi bir GOSUB komutu bile yok. Pause lerin büyük sorun olduğunu daha öncede belirtmiştim. Bir şekilde onlardan kurtulman gerekiyor. Ayrıca STD pinini kontrol etmek için Buton komutu kullanmanda gerekmiyor. Biliyorsun bu pin "1" olduğunda ilgili bit çıkışlarında bilgi hazır demektir ve o bilgiyi bir defada okuyup sonrasında STD pinin tekrar LOW olmasını bekleyip arada başka iş yapmaman gerekir. Sen ise bu işi genelede while wend döngüsü içinde yapmaya çalışıyorsun. Bana kalırsa STD 1 oluncaya kadar bekle ve olduğu zamanda Q1-Q2-Q3-Q4 bitlerini okuyup sayıyı al ama bir kerede al ve ardından STD pinin LOW olmasını bekle sonra ne yapacaksan yap.
Basic satır takip eden bir programlama dilidir. Aksine bir komut olmadıkça bir satırdaki komut işlemi bittikten sonra Basic bir sonraki satıra otomatik geçer. Bir satırda GOTO DTMF3 var ise ve ondan sonraki satırda ise DTMF3 etiketi yer alıyor ise oradaki GOTO DTMF3 komutu lüzumsuz ve gereksiz bir komut olur. Onu koymasan da program zaten DTMF3 etiketine geçecektir. Bu gibi olumsuz şeyleri gördükçe ikaz ediyorum. Değerlendirmen programın için hayırı olacaktır.
Dediğim satırların kesinlikle BASLA satırından öncesine alınması gerekir. Bu sorun oluşturyor ise yada oluşmuş soruna çözüm oluyor ise o soruna odaklanıp onu düzeltecek başka şeyler bulmalısın. Bu şekilde olmaz.
Ete
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: redmen - 14 Kasım 2023, 09:23:20
Hocam teşekkür ederim,kurallar açık,tabiki uymak gerek,ancak ben değişiklikler yapıp simülatör de ve fiziksel devre de sonuçları gözlemleyip yapacaklarımı planlıyorum,onlar şimdilik pek sorun çıkarmıyor,onları pek dert etmiyorum,asıl sorunu çözdükten sonra onları da hallederiz insallah,şifre kodları ASCII şeklinde eproma kaydetmiş görünüyor,bu gün sayıları eproma direkt klavyeden girip kaydedip deneyeceğim çıkan sonuca bakacağım inşallah.
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: ete - 14 Kasım 2023, 09:56:10
Sayılar ASCII olarak kayıt ediliyor ise kayıt ederken başlarına DEC ifadesini eklersen rakam olarak kayıt edilirler.
Ete
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: redmen - 14 Kasım 2023, 10:19:52
Teşekkür ederim hocam, telsizim şarj olunca sistem üzerinden deneyeceğim inşallah.
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: redmen - 14 Kasım 2023, 12:17:34
(https://i.ibb.co/7N8JM1X/ERT.jpg) (https://ibb.co/7N8JM1X) Hocam durumu şöyle anlatayım, pic programı içerisine eprom adreslerinin 3 ne kendim klavyeden diret sayı atadım,sistem çalıştı,epromu tekrar söküp pic programer de okuduğum da gördüm ki,atadığım sayılar ascıı kodunda nokta olarak gösterirken,serial port üzerinden gönderdiğim veriler ise değer şeklinde gözüküyor,ve sorun yine devam ediyor.pic programerden aldığım resimde ki 3 nokta normal de benim eproma vermiş olduğum diret değerler.
Sanırım serial port üzerinden gelenler ascı kodları,klavyeden girlen değerler rakamsal değerler birisinde 08-09 şeklinde diğerinde ise 38-39.
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: istinaf duvarı - 19 Kasım 2023, 10:19:21
Serial haberleşmede ASCII kodları kullanılır. Mesela 1 verisini iletmek istiyorsan porttan 0x01 değil, bunun ASCII karşılığı olan 0x31'i iletmen gerekir. Buraya dikkat edin.
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: redmen - 21 Kasım 2023, 09:46:19
Teşekkür ederim kardeşim,eproma kayıt hex olarak yapılıyor,ancak dtmf şifresi çağrıldığın da bu geri mesala sayı 2 ise epromda kayıtlı olan hex sayısı 32 olduğu için sistem anlaşamıyor,bende eproma kayıt esnasın da gelen veriden hex 30 sayısını çıkardım,böylelikle bu sorunu aştım,ancak bu kez de A,B,C,D,F lerde sorun yaşıyorum, doğru sayısal olarak eşitleniyorlar lakin bu kez de sistem A isterken epromdan gelen bilgi 10 yine anlaşamıyorlar,bana pic içerisinde 16 lık sayı sistemine çeviren bir pic kodu lazım mesala 32-02,10-A şeklinde çevrim yapabilecek.
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: Pepe - 21 Kasım 2023, 18:07:25
Si es > 9 reste 55
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: ete - 22 Kasım 2023, 07:57:58
Serial komutları gönderilen karekterlerde modifier denilen ve sayının sayımı veya ASCII mi olduğunu gösteren parametreler kullanabilir.
MicroCode STudio da program yazarken Seri komutu (HESERIN,HSEROUT , SERIN vs) üzerine kursorü getirip F1 tuşuna basarsanız komutun açıklaması ekrana gelir. Orada da göreceğiniz gibi , Modifier......Operation
BIN{1..16} ..Receive binary digits
DEC{1..5}....Receive decimal digits
HEX{1..4}.... Receive hexadecimal digits
şeklinde açıklamaları görebilirsiniz. Başına bir şey koymaz iseniz bilgi ASCII olarak yollanır. Yada alınır. Bunları HSERIN açıklamasından aldım. SERIN ile ilgili açıklamada şunları yazıyor; "Once the qualifiers are satisfied, SERIN begins storing data in the variables associated with each Item. If the variable name is used alone, the value of the received ASCII character is stored in the variable. If variable is preceded by a pound sign ( # ), SERIN converts a decimal value in ASCII and stores the result in that variable" Değişken adınınbaşında bir şey olmaz ise o bilgi ASCII karekter olarak depolanır ama başına # işaretini koyarsanız gelen karekter bir ASCII ile ilişkili bir sayıya dönüştürülüp depolanır.
Bu açıklamaya uygun olarak kodları değiştirirseniz sorununuz düzelecektir.
Ete
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: redmen - 22 Kasım 2023, 08:09:21
Teşekkür ederim ete hocam,uyarılarınızı dikkate alıp,değişikleri yapıp deneyeceğim inşallah.
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: redmen - 25 Kasım 2023, 11:13:48
Merhaba ete hocam dediğiniz gibi verdiğiniz komut bilgisi ile data yı alıyorum, güzel istediğim gibi oluyor lakin durum şu, misal HSERIN 100,INT,[WAIT("VER9"), HEX VERI14[0],VERI14[1]] komutu girdiğim de gelen veri CA ise epromun sadece 8 bitlik bölümüne CA verisini yazıyor,aslında olmasını istediğimiz şey ise 0C-0A olması yani 16 bitlik verinin ikişer 8 bitlik bölümü,misal hex komutunu girmeden ise gelen veri 8 bitlik ayrı ayrı CA için 43-41 sorun nerde anlamadım hocam.
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: ete - 25 Kasım 2023, 19:30:47
Redmen,
Çok garip ve önceden görmediğim bir veri aktarma sistemin mevcut. CA bilgisi yollanıyor ise bunu 0C-0A olarak alamazsın. Bu işi ancak o veriyi aldıktan sonra yapabilirsin. Ama dikkat et gelen bütün veriler bu şekilde geliyor ise bir genelleme yapabilirsin. Bundan eminmisin? EMin isen
Gelen veriyi $CA olarak al sonra, TEMP=$CA DUSUK=TEMP DIG 0 Bu komut sayının yalnızca $A kısmını ayırır. Bu aslında DUSUK=$0A şeklindedir. YUKSEK=TEMP DIG 1 bu komut da sayının $C kısmını alır YUSEK=$0C olur. SOnra bunları nasıl istersen kullanırsın.
Ete
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: redmen - 25 Kasım 2023, 23:05:43
Hocam inşallah pazartesi günü önerinizi dikkate alarak değişiklik yapacağım,lakin çok garip şeyler ortaya çıkıyor,sayeniz de bir çok şey öğrendim Allah razı olsun hayırlı geceler.
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: ete - 26 Kasım 2023, 09:17:10
Aslında bir deneme yapayım dedim ve baktım ki DIG komutları Decimal çalışıyormuş. Bu nedenle taktik değiştirmek gerekecek. Gelen veriyi $CA olarak al sonra, TEMP=$CA DUSUK=TEMP/16 Bu komut sayının yalnızca $A kısmını ayırır. Bunu 2 hane yazdırırsan yada yollarsan (Hex2 DUSUK) aslında DUSUK=$0A şeklindedir.
YUKSEK=TEMP-(DUSUK*16) bu komut da sayının $C kısmını alır YUSEK=$0C olur. SOnra bunları nasıl istersen kullanırsın.
Bu şekilde garanti olacaktır.
Ete
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: redmen - 26 Kasım 2023, 17:49:18
Gelen veriler ascıı kodunda geliyor 41_42_43 şeklinde veriyi direkt olarak eproma kayıt ediyoruz,kullanabiliyoruz misal kullandığım modül asc kodlarını diret alıyor ve haberleşiyor,ancak iş dtmf kod çözücüye geldiğinde ascıı kodundan $30 sayısını çıkarıp 1_9 arası sorunsuz çalışıyor,ancak 9 dan sonra A_F arası 10_15 arası karekter istiyor sayıyı kabul etmiyor,karşılaştırma yaparak 10 ise A gibi mesala aşıyorum,ama şifre bölümü 7 ve kendi içinde 3 karekter olunca yazdığım satır sayısı çok artıyor ve picin komut satır limitini aşıyor.c#üzerinden karekter olarak göndersek bu sorunu acaba aşabilirmiyiz diye düşünüyorum hocam.
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: ete - 26 Kasım 2023, 18:15:22
Hiç bir yerde gelen giden verielre bu kadar müdahale edildiğini görmemiştim. Bilmediğim bir şeyler var ama ne olduğunu da kestiremedim. Bu sorunu hacımsal boyu olarak kafama yerleştiremediğim için ancak yüzeysel düşünebiliyorum.
Şimdi yeniden düşünelim. Gelen veriler ACSII kodu olarak geliyor. Sıfır rakamı 48 olarak sırası ile 1=49 , 2=50 şeklinde gidiyor. 9 dan sonra gelen sayılar mutlaka 65-66-67-68-69-70 şekline dönüyor olması gerekir. O halde gelen verilerin alındığı yere ; IF GELEN>54 and GELEN<71 then VERI=GELEN-55 komutu otomatikman gelen verileri 64 den büyük ise 10-11-12-13-14-15 rakamlarına çevirecektir. Ancak böyle olur sanırım.
Ete
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: redmen - 26 Kasım 2023, 20:31:50
Hocam inanın söylediğiniz gibi gelmiyor gelen verileri pickit 3 üzerinden okuduğum da hex bölümünde sayılar 30_39 arası A_F arası harfler için ise 41_45arası veriler okuyorum,ASCİİ konumunda ise bildiğimiz üzere 1_9 arası A_F verileri görünüyorC# üzerinde bu verileri string olarak tanımladım hiç bir şekilde convert yapmadım.Ama baya ilginç şeyler görüyorum.aslında verinin alımında ve gönderilmesinde hiç sıkıntı yaşamayorum,A-F arası veri kullanmadığım sürece dtmf epromdan arayüzden aldığım veriler ile açma kapama yapıyor.
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: redmen - 26 Kasım 2023, 20:41:23
Kapsamlı bir çalışma olduğu için,bir çok işi bir ara da yapmak zorunda kalıyorum elimde AT komutu ile çalışan kendi içinde yazılımı olan bir modül var,bu modül aslında bir kere programlayınca artık o frekans ve ayar da çalışabiliyor,lakin modülün bir sorunu var bazen elektriksel yada başka nedenden dolayı kendi işlemcisine yüklü verileri silebiliyor,o yüzden bu işi ancak bu pic üzerinden arayüzle bir kere programlayabiliyor ve pic sıfırdan her başladığında modüle hatırlatma verisi gönderiyor,daha sonra epromdaki şifre bilgilerini dtmf bölümüne yükliyerek artık sürekli sadece o bölümde çalışıyor.sistem üzerinden sinyal geldiği zaman şifrelere göre açma yada kapama yapıyor.
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: redmen - 27 Kasım 2023, 17:01:09
@ DEVICE pic16f628A 'DENETLEYİCİ 16f628A
@ DEVICE pic16f628A, WDT_ON 'BEKÇİ KÖPEĞİ AÇIK
@ DEVICE pic16f628A, PWRT_ON 'GERİLİMDENGELENİNCE 1 KEZ RESET AT
@ DEVICE pic16f628A, PROTECT_OFF 'KOD KORUMA KAPALI
@ DEVICE pic16f628A, MCLR_OFF 'MCLR PİNİ KULLANILMAYACAK
@ DEVICE pic16f628A, INTRC_OSC_NOCLKOUT 'DAHİLİ OSİLATÖRÜ KULLAN
@ DEVICE Pic16f628A, BOD_OFF 'GERİLİM DALGALANMASI RESET KAPALI
INCLUDE "MODEDEFS.BAS"
'*****************************************************************
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 25 ' 9600 Baud @ 4MHz, 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
DEFINE HSER_BAUD 9600 ' BaudRate 9600
DEFINE OSC 4
'******************************************************************
TRISA=%00111100 'A PORTU ÇIKIŞ
TRISB=%00000011 'B PORTUNUN 2.BİTİ GİRİŞ
PORTB=0:PORTA=0 'A VE B PORTLARI SIFIRLANDI
CMCON=7 'COMPARATÖR İPTAL
VERI0 VAR byte[7]
VERI1 VAR BYTE[3]
VERI2 VAR BYTE[3]
VERI3 VAR BYTE[3]
VERI4 VAR BYTE[3]
VERI5 VAR BYTE[3]
VERI6 VAR BYTE[3]
VERI7 VAR BYTE[2]
VERI8 VAR BYTE[3]
VERI9 VAR BYTE[3]
VERI10 VAR BYTE[3]
VERI11 VAR BYTE[3]
VERI12 VAR BYTE[3]
VERI13 VAR BYTE[3]
VERI14 VAR BYTE[2]
A1 VAR BYTE[3]
A2 VAR BYTE[3]
A3 VAR BYTE[3]
A4 VAR BYTE[3]
A5 VAR BYTE[3]
A6 VAR BYTE[3]
A7 VAR BYTE[2]
A VAR BYTE
SES VAR BYTE
A=$30
RCA VAR byte 'RCA ADINDA 8 BİTLİK DEĞİŞKEN TANIMLANDI
SYMBOL GIE =INTCON.7 'BUTÜN İNTERRUPTLAR AÇILDI
SYMBOL PEIE =INTCON.6 'USARTR INTERRUPT AÇILDI
SYMBOL RCIE =PIE1.5 'USART ALMA AÇILIYOR
SYMBOL RCIF =PIR1.5 'USART INTERRUPT OLUŞTU BBAYRAĞI
NERE:
FREKANS1:
pause 2000
serout PORTA.1,T9600,["*"]
pause 2000
READ 0,VERI0[0],VERI0[1]
READ 2,VERI0[2],VERI0[3]
READ 4,VERI0[4],VERI0[5]
READ 6,VERI0[6]
serout PORTA.1,T9600,["AT+DMOSETGROUP=0,173.9750,",VERI0[0],VERI0[1],VERI0[2],VERI0[3],VERI0[4],VERI0[5],VERI0[6],"0,0012,0,0013",13,10]
pause 2000
READ 8,SES
SEROUT PORTA.1,T9600,["AT+DMOSETVOLUME=",SES,13,10]
READ 10,VERI1[0],VERI1[1]
READ 12,VERI1[2]
READ 14,VERI2[0],VERI2[1]
READ 16,VERI2[2]
READ 18,VERI3[0],VERI3[1]
READ 20,VERI3[2]
READ 22,VERI4[0],VERI4[1]
READ 24,VERI4[2]
READ 26,VERI5[0],VERI5[1]
READ 28,VERI5[2]
READ 30,VERI6[0],VERI6[1]
READ 32,VERI6[2]
READ 34,VERI7[0],VERI7[1]
STD var PORTA.2 '1 STD 8870
E1 var PORTB.0 'Q1 du 8870
E2 var PORTA.5 'Q2 du 8870
E3 var PORTA.4 'Q3 du 8870
E4 var PORTA.3 'Q4 du 8870
SIFRE_1 var PORTB.5 '
PORTA.0=1
b1 VAR BYTE
b2 VAR BYTE
b3 VAR BYTE
b1=0
b2=0
b3=0
c1 var BYTE '1° code DTMF
c2 var BYTE '2° code DTMF
c3 var BYTE '3° code DTMF
c4 var BYTE '4° code DTMF
Q1 var BIT
Q2 var BIT
Q3 var BIT
Q4 var BIT
BASLA:
DTMF1:
RCIE=1
PEIE=1
GIE=1
RCIF=0
INTCON=%11000000
ON INTERRUPT GOTO INT
BUTTON STD,1,255,0,b1,1,DECODER1
PAUSE 20
BUTTON STD,0,255,0,b2,1,RAZ
GOTO DTMF1
DECODER1:
Q1=E1
Q2=E2
Q3=E3
Q4=E4
c1 = Q1 + 2*Q2 + 4*Q3 + 8*Q4
DTMF2:
b3=0
WHILE b3<75
BUTTON STD,1,255,0,b1,1,DECODER2
PAUSE 20
b3=b3+1
WEND
GOTO DTMF1
DECODER2:
Q1=E1
Q2=E2
Q3=E3
Q4=E4
c2 = Q1 + 2*Q2 + 4*Q3 + 8*Q4
DTMF3:
b3=0
WHILE b3<75
BUTTON STD,1,255,0,b1,1,DECODER3
PAUSE 20
b3=b3+1
WEND
GOTO DTMF1
DECODER3:
Q1=E1
Q2=E2
Q3=E3
Q4=E4
c3 = Q1 + 2*Q2 + 4*Q3 + 8*Q4
GOTO SIFRE
RAZ:
Q1=0
Q2=0
Q3=0
Q4=0
GOTO DTMF1
END
SIFRE:
IF c1=VERI1[0] AND c2=VERI1[1] AND c3=VERI1[2] THEN
SIFRE_1=1
PORTA.0=0
ENDIF
SIFRE1:
IF c1=VERI2[0] AND c2=VERI2[1] AND c3=VERI2[2] THEN
SIFRE_1=1
PORTA.0=0
ENDIF
SIFRE2:
IF c1=VERI3[0] AND c2=VERI3[1] AND c3=VERI3[2] THEN
SIFRE_1=1
PORTA.0=0
ENDIF
SIFRE3:
IF c1=VERI4[0] AND c2=VERI4[1] AND c3=VERI4[2] THEN
SIFRE_1=1
PORTA.0=0
ENDIF
SIFRE4:
IF c1=VERI5[0] AND c2=VERI5[1] AND c3=VERI5[2] THEN
SIFRE_1=1
PORTA.0=0
ENDIF
SIFRE5:
IF c1=VERI6[0] AND c2=VERI6[1] AND c3=VERI6[2] THEN
SIFRE_1=1
PORTA.0=0
ENDIF
SIFRE6:
IF c1=VERI7[0] AND c2=VERI7[1] THEN
SIFRE_1=0
PORTA.0=1
ENDIF
c1=0
c2=0
c3=0
c4=0
GOTO DTMF1
DISABLE
INT:
GIE=0
HSERIN 100,INT,[WAIT("VER1"),STR VERI0\7]
HSERIN 100,INT,[WAIT("VER2"),SES[0]]
HSERIN 100,INT,[WAIT("VER3"),STR VERI8\3]
HSERIN 100,INT,[WAIT("VER4"),STR VERI9\3]
HSERIN 100,INT,[WAIT("VER5"),STR VERI10\3]
HSERIN 100,INT,[WAIT("VER6"),STR VERI11\3]
HSERIN 100,INT,[WAIT("VER7"),STR VERI12\3]
HSERIN 100,INT,[WAIT("VER8"),STR VERI13\3]
HSERIN 100,INT,[WAIT("VER9"),STR VERI14\2]
WRITE 0,VERI0[0],VERI0[1]
WRITE 2,VERI0[2],VERI0[3]
WRITE 4,VERI0[4],VERI0[5]
WRITE 6,VERI0[6]
WRITE 8,SES
A1[0] = VERI8[0]
A1[1] = VERI8[1]
A1[2] = VERI8[2]
VERI1[0] = A1[0]-A
VERI1[1] = A1[1]-A
VERI1[2] = A1[2]-A
WRITE 10,VERI1[0],VERI1[1]
WRITE 12,VERI1[2]
A2[0] = VERI9[0]
A2[1] = VERI9[1]
A2[2] = VERI9[2]
VERI2[0] = A2[0]-A
VERI2[1] = A2[1]-A
VERI2[2] = A2[2]-A
WRITE 14,VERI2[0],VERI2[1]
WRITE 16,VERI2[2]
A3[0] = VERI10[0]
A3[1] = VERI10[1]
A3[2] = VERI10[2]
VERI3[0] = A3[0]-A
VERI3[1] = A3[1]-A
VERI3[2] = A3[2]-A
WRITE 18,VERI3[0],VERI3[1]
WRITE 20,VERI3[2]
A4[0] = VERI11[0]
A4[1] = VERI11[1]
A4[2] = VERI11[2]
VERI4[0] = A4[0]-A
VERI4[1] = A4[1]-A
VERI4[2] = A4[2]-A
WRITE 22,VERI4[0],VERI4[1]
WRITE 24,VERI4[2]
A5[0] = VERI12[0]
A5[1] = VERI12[1]
A5[2] = VERI12[2]
VERI5[0] = A5[0]-A
VERI5[1] = A5[1]-A
VERI5[2] = A5[2]-A
WRITE 26,VERI5[0],VERI5[1]
WRITE 28,VERI5[2]
A6[0] = VERI13[0]
A6[1] = VERI13[1]
A6[2] = VERI13[2]
VERI6[0] = A6[0]-A
VERI6[1] = A6[1]-A
VERI6[2] = A6[2]-A
WRITE 30,VERI6[0],VERI6[1]
WRITE 32,VERI6[2]
A7[0] = VERI14[0]
A7[1] = VERI14[1]
VERI7[0] = A7[0]-A
VERI7[1] = A7[1]-A
WRITE 34,VERI7[0],VERI7[1]
RCA=RCREG
RCIF=0
GIE=1
Resume
enable
end
Hocam öncelikle sizleri yorduğum için özür diler ilginiz için de ayrıyaca teşekkür ederim,yine serial iletişim kodlarınının yerine takılmayın,orası problem değil,yazdığım proğram ile geldiğim sonuç zaten bu şekilde.benim sorunum şu misal 10-11-12-13-14-15 sayılarının yerinde A-B-C-D-E-F görmem gerekiyor.onu da ilave yazdığım proğramla aşabiliyorum ama 7 şifre ve herbiri 3 kareterden oluşunca satır yoğunluğu oluyor ve epromun kapasitesi yetmiyor.
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: ete - 27 Kasım 2023, 18:09:42
Mikro işlemciler binary yani ikili sayı sistemi ile çalışır. Basic gibi ara derleyicilerin bir çok komutu 10 tabanına göre yani desimal sayı sistemi üzerinden çalışır. Ancak iş gösterime gelince başına koyduğunuz işaret yada paramtre diyelim sayesinde o sayıları ister binary ister desimal istersenizde hexadesimal sistemde görebilirsiniz. Yada sayıların kullanıldığı işlemlerin pek çoğunda da yine ön işaret kullanılarak o sayıyı ya binary ya desimal yada hexadesimal olarak kullanabiiyorsun.
Adım adım sorunları aştıkça başka sorunların ortaya çıkıyor. EN son sorunun yazdıklarına bakılırsa eprom hafıza yetersizliği gibi gözüküyor. Bunu aşmanın tek çaresi harici eprom kullanmaktır. Balkada çaren yok gibi.
Ete
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: redmen - 27 Kasım 2023, 18:49:33
Allah razı olsun hocam o kadar yol kat ettim artık bir çözüm bulacağım inşallah.ya c# üzerinde yada pic üzerinde.
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: DigMan - 30 Kasım 2023, 17:16:19
Herkese merhaba. Konu usart olduğu için konu açmadan buraya yazayım dedim.
Aşağıda, Ete hocamın da ders notlarından örnek alıp sadeleştirdiğim bir yazılım var. Amacım, MODBUS protokolü ile PLC haberleşmesi yapmak. PLC den gönderdiğim veri ile, yapmış olduğum kartın PORTB çıkışlarını aktif/pasif etmek istiyorum.
Fakat ne yaptıysam bir türlü haberleştiremedim. Bu programda eksik, yanlış, unuttuğum bir şey var mı? Elimde PLC yok. Testi; Modbus Poll programı, USB to RS485 ve TTL to RS485 kartları ile yapıyorum. Aşağıda fotolarını da ekledim. Hocam, hata nerden kaynaklı bir türlü çözemiyorum. Aldığım hata kodları; Checksum Error veya insufficient bytes received.
Ete hocam bir de ders notunuzda, 2 adet hsrout komutu kullanmışsınız, bunun bir amacı var mı? Bir başka sorum, RS485 gelen komut diziliminde, sırasıyla, 1. cihaz kodu - 8 bit 2. Komut kodu - 8 bit 3. adres(Reg) kodu - 2x 8 bit (bu 40000 li kod nedir bir türlü anlamış değilim) 4. data kodu - n x 8 bit 5. CRC kodu - 2x 8 bit
şeklinde. Biz bu kodları alırken/yollarken Hserin veya Hserout komutları içinde kullandığımız byte tanımlı değişkenlere otomatik atamış mı oluyoruz? Yani bu 5 kod için, (data kodunu tek bir byte sayarsak) 7 adet byte tanımlı değişken yazmamız yeterli oluyor mu? Eğer data kodumuz birden fazla ise bu komut data mı CRC mi olduğunu nasıl anlayacak anlayamadım.
Proton kullanan arkadaşlara da bir sorum olacak. Define ile declare aynı şeyler mi? Protonda define kullanılıyor mu?
Device 18F2620
XTAL = 20
ALL_DIGITAL = On
Include "modedefs.bas"
'#DEFINE HSERIAL_CLROERR = 1
Declare HSERIAL_BAUD = 9600
Declare HSERIAL_RCSTA = 90 '%10010000 '90
Declare HSERIAL_TXSTA = 24 '%00100100 '24
Declare HSERIAL_SPBRG = 129
Declare HSERIAL_CLEAR = 1
Symbol RedLed = PORTA.0
Symbol GreenLed = PORTA.1
Symbol TxKesmE = PIE1.4
Symbol TxByraK = PIR1.4
Symbol RxKesmE = PIE1.5
Symbol RxByraK = PIR1.5
Symbol GenelKesme = INTCON.7 'GIE
Symbol CevreKesme = INTCON.6 'PEIE
Symbol CIKIS = PORTB
TRISA = 0
TRISB = 0
TRISC = 0
TRISC.7 = 1
Low PORTA
Low PORTB
Low PORTC
Input PORTC.7
Dim GelenID As Byte
Dim GelenEmiR As Byte
Dim GelenBoS As Byte
Dim GelenFonks As Byte
Dim GelenRegL As Byte
Dim GelenRegH As Byte
Dim GelenDataL As Byte
Dim GelenDataH As Byte
Dim GelenCrcL As Byte
Dim GelenCrcH As Byte
Dim TempCleaR As Byte
Dim IDKayit As Byte
Dim EmirKayit As Byte
Dim BosKayit As Byte
Dim FonkKayit As Byte
Dim RegKayitL As Byte
Dim RegKayitH As Byte
Dim DataKayitL As Byte
Dim DataKayitH As Byte
Dim CRCKayitL As Byte
Dim CRCKayitH As Byte
Dim ALDI As Byte
Dim SAYAC As Word
Dim CihazKodu As Byte
Dim A As Byte
Clear
DelayMS 700
CihazKodu = %00000001 'Cihaz-1
DelayMS 250
'-------------------------------------------
TempCleaR = RCREG
GenelKesme = 1
CevreKesme = 1
RxKesmE = 1
On Interrupt GoTo KesmeRutiN ' hem SW hem de donanım kesmeyi denedim
'-------------------------------------------
START:
If IDKayit = CihazKodu And ALDI = 1 Then
CIKIS = DataKayitL
IDKayit = GelenID
FonkKayit = GelenFonks
RegKayitH = GelenRegH
RegKayitL = GelenRegL
DataKayitH = GelenDataH
DataKayitL = GelenDataL
CRCKayitH = GelenCrcH
CRCKayitL = GelenCrcL
Toggle GreenLed
GoSub DataYolla
ALDI = 0
EndIf
GoTo StarT
;------------------------ALT PROGRAMLAR------------------------------
''-------------------------------------------------------------------
DataYolla:
HSerOut[Rep $AA\5, Rep $00\5, Rep $FF\5]
HSerOut["A","B","C", IDKayit, FonkKayit, RegKayitH, RegKayitL, DataKayitH, DataKayitL, CRCKayitH, CRCKayitL]
'HSerOut["A","B","C", IDKayit, FonkKayit, RegKayitH, RegKayitL, DataKayitH, DataKayitL, CRCKayitH, CRCKayitL]
Return
;------------------------------KESME---------------------------------
Disable
KesmeRutiN:
If RxByraK = 1 Then
GenelKesme = 0
Toggle RedLed
HSerIn 100, TimeOut, [Wait("ABC"), GelenID, GelenFonks, GelenRegH, GelenRegL, GelenDataH, GelenDataL, GelenCrcH, GelenCrcH]
ALDI = 1
EndIf
TimeOut:
TempCleaR = RCREG
RxByraK = 0
GenelKesme = 1
Resume
Enable
''-------------------------------------------------------------------
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: ete - 01 Aralık 2023, 08:44:11
Programına baktım ve herhangi bir hata göremedim. Usulüne uygun yazılmış. Fazlalık var hatta. Global kesmeler kesme içine girildiğinde otomatik olarak iptal edilir. Yeniden kesme içinde kesme oluşmasın diye. Sen bunu kendinde yapıyorsun. Hata değil ama gereksiz iş.
Bu sistemde bana kalırsa asıl sorun modbus5 protokolünü çok iyi bilmemen. Bu protokolü bende bilmiyorum araştırmadım. Bana kalırsa bunu araştır. USART kullanılarak yaoılan karşılıklı alışverişte alınan ve verilen byte sayıları belirli olması gerekir. Hiç bir zaman bir taraf 5 byte yollar diğeri 6 byte bekler yada bir taraf 6 yollar diğeri 5byte alacak şekilde bir uyarlama olamaz. Alınan ve verilen byte sayıları her iki taraf için aynı olmalıdır. Senin sorunun burada. "Unsufficient byte received" demek beklenenden daha az byte alındı anlamına geliiyor ve zaten alınan az olduğu içinde checksum tutmuyor. Bence protokolü araştır ve alınan verilen byte sayılarını eşitlemeye çalış. Checksum mutlaka alınan en son byte veya bytlar olmalıdır ve byte sayısına dahil edilmelidir. Senin sisteminde kaç tane data byte'ı olduğu önemli bunu sen ihtiyacına göre belirleyeceksin sanırım. Bu durumda sen; - Cihaz kodu için 1 Byte - Komut kodu için 1 byte - Adres Kodu için 2 byte - Data kodu için 1 byte (1 byte olduğunu kabul ederek) - CRC kodu için 2 byte olmak üzere toplam 7 byte olacak şekilde heserim komutu içinde 7 ayrı değişken kullanmak zorundasın. Gelen bilgi alındığında yukarıdaki sıralamaya uygun olarak bilgiler bu byte lar içine otomatik yerleşmiş olacaktır. Burada kritik konu CRC nin oluşturulmasıdır.Doğruluğunu kim değerlendiriyor onu pek anlamadım ama aldığın hataya bakılırsa kullandığın arayüz bunu değerlendiriyor. Dolayısıyla CRC nin nasıl oluşturulduğunada dikkat etmen gerekiyor.
USART gönderme komutlarını tek bir defa kullanmak daima yeterli oluyor. Ben 2 defa kullanmış isem o zamanlar emin olamadığımdandır. Ama aradan geçen zamanda gördümki tek komut daima yeterli oluyor. Yerine göre 2 defa yollamak sorun yaratmıyor ama senin sisteminde yaratabilir çünki byte sayısı önemli.
Define ve declare aynı şeyler. Bildiğim kadarı ile proton Declare kullanıyor PBP ise define kullanıyor ama Proton ikisinide kabul ediyor olabilir. Ancak eski Proton user manualine baktığımde direk Define komutu göremedim. Hep Declare kullanılmış. Positron isimli yeni Protonda durum nasıldır bilemiyorum. Bana kalırsa sen daima Declare kullan.
Ete
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: DigMan - 01 Aralık 2023, 15:48:17
Hocam, yazılım sizin DERS-14 notlarından. Orada RS485 ile ilgili örnek programlar vermişsiniz. Siz hiç RS485 haberleşme uygulaması yapmadınız mı? Sizin yazılımınızla siz yapabildiyseniz ben de yapabilirim diye düşünüyorum.
Zaten orada da söylemişsiniz. Seri haberleşmeden tek farkı; yazılıma bir kontrol biti ekleniyor ve bir de MAX485 entegresi. Benim kullandığım kart otomatik yön belirleyicili olduğu için kontrol bitine gerek kalmadı. Acaba donanımsal olarak mı farklılıklarımız var anlayamadım.
Bir de ek olarak belirteyim. Bir RB0 HW kesmesi ile yaptığım sayıcı uygulamasında, kesme bölümünde, (genelkesme = 0 )yapmadığımda buton arkı gibi sayaçta atlamalar yapıyordu. Bu komutu ekleyince anında kesildi. O yüzden garanti olsun diye bu komutu kullanıyorum.
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: ete - 01 Aralık 2023, 19:27:07
RS485 uygulaması yapmadım demedim. Modbus uygulaması yapmadım. RS485 de kendi protokolünü oluşturmak zorundasın ve derslerde verdiklerimde genelde bu tema üzerine idi. RS485 sisteminin iki avantajı var. Birincisi uzun mesafelere kablolu bilgi yollayabiliyorsun. İkincisi ise aynı hat üzerinden birden fazla ünite ile haberleşme imkanın oluyor. Özellikle bu ikincisini dikkate aldığımızda ve haberleşmeyi aynı hat üzerinden yapmamız nedeni ile istenilen bir diğer ünite (Slave) ile haberleşmek istediğimizde onlara birer kimlik numarası verilmesi zorunluluğu ortaya çıkmaktadır. haberleşmeyi karşılıklı yapınca da Master'in her bir üniteye emir (yada komut) vermesi gerekliliği ortaya çıkar. İşte benim örneklerim genelde bu konu üzerinden yürümektedir. Orada anlaşılmayan bir husus olduğunu sanmıyorum.
Bu arada yer gelmişken hemen belirteyim. Belkide yüzlerce RS485 uygulamasını fiziki olarak yaptım. Bunlar arasında yaklaşık 600 m mesafeden bilgi aktarımı, sensör gurubunun uyum içerisinde çalıştırılması gibi örnekler verebilirim.
Site de de güzel bir çalışma mevcut. https://etepic.com/index.php/topic,57.msg32096.html#msg32096 Bunları iyice incele belki kendi sorununu kendin bulursun. Sorunun donanım sorunuda olabilir. Özellikle RE+DE pinlerinin yapılacak işe göre lojik değer almasına dikkat edilmesi gerekir. Aksi halde haberleşme yapamazsınız. Şemanı da göremediğimiz için daha fazla yorum yapmak mümkün olamıyor maalesef.
Ete
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: redmen - 12 Aralık 2023, 13:47:36
Konuyu ,istediğim noktaya getirdim,uğraşınca demek ki hakikaten oluyormuş,fazlasını da bu aşama da öğrenmiş oldum,artık dtmf iki hane de açabiliyor yada iki hane de kapatabiliyor,yada üç hane de açıp iki hane de kapatabiliyor yada tam tersi,çalışması rutin güzel ve kararlı,iletişim iyi ve serial haberleşme sonrası ekran da uyarı alabiliyor.Ama üzerinde biraz daha çalışmak istiyorum.çünkü ne kadar uğraştıkça o kadar ilerleme sağlıyorum.herkese ilgi ve alakasından dolayı teşekkür ediyorum.
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: enginkanat - 27 Mart 2025, 14:26:40
@ __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _BODEN_OFF & _MCLRE_OFF & _LVP_OFF & _CP_OFF
DEFINE OSC 4
DEFINE HSER_TXSTA 24 ' TXSTA değeri (BRGH=1 için)
DEFINE HSER_SPBRG 25 ' SPBRG değeri (4MHz, BRGH=1, 9600 baud)
DEFINE HSER_BAUD 9600 ' Baud rate ayarı
DEFINE HSER_CLROERR 1 ' RX hatalarını temizle
FREQ VAR WORD
BUTON_STATE VAR BIT
FREQ_HIGH VAR BYTE
FREQ_LOW VAR BYTE
'OSCCON = %01100000 ' Dahili osilatör 4MHz
TRISA = %00000000 ' RA2 (TX) çıkış
TRISB = %00000001 ' RB0 giriş (buton), RB3 çıkış (LED)
CMCON = 7 ' Comparator'lar kapalı
OPTION_REG.7 = 0 ' PORTB pull-up dirençleri aktif
T1CON = %00000111 ' Timer1: 1:256 prescaler (~1 saniye ölçüm)
BUTON_PIN VAR PORTB.0
FREQ_PIN VAR PORTA.0
TX_PIN VAR PORTA.2
LED_PIN VAR PORTB.3
LED_PIN = 1
PAUSE 200
LED_PIN = 0
PAUSE 100
LED_PIN = 1
PAUSE 200
LED_PIN = 0
MAIN:
IF BUTON_PIN = 0 THEN
PAUSE 50
IF BUTON_PIN = 0 THEN ' Debounce kontrolü
WHILE BUTON_PIN = 0 : WEND ' Buton bırakılana kadar bekle
LED_PIN = 1 ' LED'i yak
COUNT FREQ_PIN, 1000, FREQ ' Frekans ölç
FREQ_HIGH = FREQ >> 8 ' HIGH byte
FREQ_LOW = FREQ
LED_PIN = 0 ' LOW byte
HSEROUT [DEC FREQ_HIGH, DEC FREQ_LOW] ' Seri porta gönder
LED_PIN = 1
PAUSE 500
LED_PIN = 0 ' LED'i söndür
ENDIF
ENDIF
PAUSE 100
GOTO MAIN
1 - 100 KHz arasında ölçtülecek frekans değerini seri olarak HC-05 bluetooth modülüne göndermek istiyorum. Program HSEROUT komutuna geldiğinde kilitleniyor. Neden olduğu hakkında bir fikrim yok. Yardımcı olursanız sevinirim.
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: enes - 28 Mart 2025, 05:33:56
TX_PIN VAR PORTA.2 ıptal etmelı ve devrede module tx baglantısını
PORTB.2 pınınden yapmalısınız.
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: enginkanat - 28 Mart 2025, 14:10:50
16F628a Data sheet'i inceledim ama HSEROUT için yapılacak konfigürasyon ayarlarından hiç bir şey anlamadım. 20 MHz kiristal ve 9600 baud rate hız için ayarlamaları nasıl yapabilirim.
hocam, yazdıklarınız doğru. fakat en azından ilk byte'ı göndermesi gerekmiyormu? hiç bir veri akışı olmayışı aklıma takıldı. Birde word tipi FREQ değişkenini string olarak nasıl gönderebilirim? sanki bu işime yarayabilir
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: ete - 28 Mart 2025, 20:38:17
Doğru parametre verdin ise ve doğru pin kullandın ise haberleşme olması gerek. Anlamamız için şema ve programı buraya koyman gerekiyor. Hiç bir şey göndermeyebilir. Kesin emin olmak zor çünki böyle bir şey başıma gelmedi. USART komutlarını kullanınca o portu (TX ve RX pinlerini) başka amaçla kullanamazsın. RX pini giriş olarak ayarlanmalı.
Yollama komutunda kullandığın DEC parametrelerini kaldırırsan sayının ASCI değerini yollarsın. DEC koyarsan rakam değerini yollarsın. Örnek vereyim. X= 5 olsun DEC X şeklinde yollarsan 5 rakamını yollarsın. X olarak yollarsan 53 yani 5 rakamının ASCI karşılığını yollamış olursun. Sonuçta ne olarak yolladığın çok önemli değil karşıdan onu ne şekilde aldığın önemli. X olarak yollayıp DEC X olarak alamazsın. Birde bunları nereye yolluyorsun alıcı olan nedir. Bir LCD displaye bilgi yazar gibi yolluyorsun sanki. İşaretçi olarak "FREKANS:"kullanmak da bir kusur gibi duruyor. İşaretçiler baa göre en fazla 3-4 karekter olmalı fazlası sıkıntı çıkartır.
Ete
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: enginkanat - 29 Mart 2025, 12:53:13
Şimdiden güzel bir bayram geçirmenizi temeni, ederim. Erol hocam devre şeması çizmedim. breadboard üzerinden kurdum. butonu pull_up olacak şekilde bağladım. FTD232 usb/TTL ile putty üzerinden okumak için "Frekans" diye göndermeye çalıştım. eğer PC'den bu iletiyi alabilirsem Bluetooth HC-06 ile göndermeye çalışacağım. aslında bu işlemi 12F675 kullanarak yapmak isterdim ama bu işlemciyi bir türlü çalıştıramadım.
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: enginkanat - 29 Mart 2025, 14:47:11
@ __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _BODEN_OFF & _MCLRE_OFF & _LVP_OFF & _CP_OFF
DEFINE OSC 20
INCLUDE "modedefs.bas"
FREQ VAR WORD
BUTON_STATE VAR BIT
I VAR BYTE
TRISA = %00000010
TRISB = %00000010
CMCON = 7
OPTION_REG.7 = 0
BUTON_PIN VAR PORTA.1
FREQ_PIN VAR PORTA.0
RX_PIN VAR PORTB.1
TX_PIN VAR PORTB.2
LED_PIN VAR PORTA.3
LED_PIN = 0
FOR I = 0 TO 3
LED_PIN = 1
PAUSE 300
LED_PIN = 0
PAUSE 300
NEXT I
MAIN:
IF BUTON_PIN = 0 THEN
PAUSE 50
WHILE BUTON_PIN = 0
WEND
LED_PIN = 1
COUNT FREQ_PIN, 1000, FREQ
SEROUT2 TX_PIN, 84, [DEC FREQ, 13, 10]
SEROUT2 TX_PIN, 84, [DEC FREQ, 13, 10]
PAUSE 500
LED_PIN = 0
ENDIF
PAUSE 100
GOTO MAIN
END
Sorunu bu programla çözdüm. istediğim frekans aralığında çalışıyor. Sadece öğrenmek için bir şey sormak istiyorum; WORD tipi değişken ile maximum 65532 Hz okuyabiliyoruz. eğer daha yüksek bir değer okumak istersek bir yolu var mı?
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: ete - 29 Mart 2025, 18:35:41
Count komutu kullanarak daha yüksek frekansları ölçemezsin. Mutlaka Timer-1 sayacını kullanman gerekir. En güzeli de Timer-1 sayacını harici girişten saydırma özelliğini kullanarak saydırma yapmaktır. Sayılan frekansı artırmanın yolu bölücü kullanmaktan geçiyor. Gelen siyali 2 ye bölersen saydığın miktar azalır 65535 yerine bunun yarısını sayarsın ama 2 ile çarpınca gerçek değeri bulursun. Timer-1 sayacında bölme oranı 1/1-1/8 arasında değiştirilebildiği için teorik olarak 65535x8=524.288Hz yi ölçebilirsin. Çünki saycın 65535 sayacak ama aslında 524288 saydırmış olacaksın. Ekrana verme meselesine gelince büyük değerleri KHz ve daha büyük değerleri ise Mhz cinsinden hesaplayıp vermek en akıllıca yöntem olacaktır.
Ete projelerinde bu mantık ile çalışan bir Frekansmetre yazılımım var aslında. İncelemende yarar var henüz yapmadın ise.
https://etepic.com/index.php/topic,60.0.html
Bu projede çok daha büyük frekansları ölçebiliyoruz. Uygun harici bölücü entegresi kullanarak 1,2 Ghz E kadar ölçebiliyor program.
harici bölücü olmadan ise yaklaşık 30Mhz e kadar ölçebiliyor idi hatırladığım.
Ete
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: enginkanat - 29 Mart 2025, 23:28:02
Cevabınız için teşekkür ederim. İyi bayramlar dilerim.
Başlık: Ynt: PİC16f628a serial haberlesme sorunu
Gönderen: enes - 30 Mart 2025, 02:57:21
@ engınkanat
FREQ degıskenı word tıpınde tanımlı oldugu halde
SEROUT2 TX_PIN, 84, [DEC FREQ, 13, 10]
komutuyla pc tarafında putty de 255 uzerı bı sayı okuyabılıyormusun?