PİC16f628a serial haberlesme sorunu

Başlatan redmen, 01 Kasım 2023, 09:40:20

DigMan

#45
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.   

ete

#46
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


redmen



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.

enginkanat

@ __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.

enes

donanımsal ıletısım kurmak uzere tasarlanmıs programınız.

dolayısıyla usart tx pınını kullanmanız lazım.

TX_PIN VAR PORTA.2 ıptal etmelı ve devrede module tx baglantısını

PORTB.2 pınınden yapmalısınız.

enginkanat

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.

INCLUDE "modedefs.bas"
DEFINE OSC 20
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 24h
DEFINE HSER_BAUD 9600
DEFINE HSER_SPBRG 129
doğru ayarlarmı?
HSEROUT ["FREKANS: ",DEC FREQ, 13, 10]
FREQ değeri 16 bit olduğuna göre bu kod doğru mu?

aRci

20mhz için
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 129 ' 9600 Baud @ 20MHz, 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

ete

Alıntı YapHSEROUT ["FREKANS: ",DEC FREQ, 13, 10]
Bu yazılış şekli Frekans değişkeninin 16 bit olması nedeni ile doğru değil.
Doğrusu;
HSEROUT ["FREKANS: ",DEC FREQ.byte1,DEC FREQ.Byte0, 13, 10]
şeklinde olmalıdır.

Ete

enginkanat

#53
Alıntı yapılan: ete - 28 Mart 2025, 14:52:19Bu yazılış şekli Frekans değişkeninin 16 bit olması nedeni ile doğru değil.
Doğrusu;
HSEROUT ["FREKANS: ",DEC FREQ.byte1,DEC FREQ.Byte0, 13, 10]
şeklinde olmalıdır.

Ete


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


ete

#54
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

enginkanat

Ş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.

enginkanat

@ __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ı?

ete

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

enginkanat

Cevabınız için teşekkür ederim. İyi bayramlar dilerim.

enes

@ 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?

Powered by EzPortal