Ana Tema => Basic Programlama Komut Kullanımı => Konuyu başlatan: blueboard - 28 Eylül 2022, 14:58:55
Başlık: Rotary Pot'ta sadece yön bilgisini okuma
Gönderen: blueboard - 28 Eylül 2022, 14:58:55
Ete Hocam, uzunca bir süredir Rotary pottan sadece yön bilgisini okumaya çalışıyorum. Ancak bugüne kadar maalesef sonucunu getirip programda başarılı olamadım. Sizin konu ile ilgili açıklamalarınızı bıkıp usanmadan defalarca tekrar tekrar okudum. Değişik kaynakları da araştırdım. Ortaya bir şeyler çıkarmaya çalıştım. Ancak eksiklik ve hatalarımın olduğunu düşünüyorum. Ekteki dosyada Rotary potun fotolarını ekledim. Potta aynı zamanda bas çek anahtar var. Bu kısım önemli değil. Benim için zorluk potun ne tarafa döndüğünü tespit edebilmek ve dönüş yönüne göre mikrodenetleyiciye işlem yaptırabilmek. Açıklamalarınız doğrultusunda XOR işlemini uygulamaya, kesme oluşturmaya çalıştım ama dosyayı derleyemedim. Bu konuda yardımınızı rica ediyorum. Yazdığım kodları kontrol ederek hatalarımı gidermeme yardımcı olur musunuz.
'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : *
'* Version : *
'* Notes : *
'* : *
'****************************************************************
define osc 4
PORTA=%00000000
portb=%00000011
TRISB=%00000011 '
TRISA=%00000000 '
'-----------------------------------------------------------------
@ DEVICE pic16F628A 'işlemci 16F628
@ DEVICE pic16F628A, WDT_OFF 'Watch Dog timer kapalı
@ DEVICE pic16F628A, PWRT_ON 'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF 'Kod Koruma kapalı
@ DEVICE pic16F628A, MCLR_off 'MCLR pini kullanılmıyor.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT 'Dahili osilatör kullanılacak
'-----------------------------------------------------------------
CMCON=7
ESKI= var byte
YENI= var byte
YON=var bIT
TEMP VAR BYTE
bayrak=0
OPTION_REG=%01000000 'Yükselen kenarda INT oluştur
INTCON=%10010000
ON INTERRUPT GOTO KES
PAUSE 200
BASLA:
disable
ESKI=PORTB & %00000011
IF YENI=ESKI THEN BASLA
Gosub tekrar
TEKRAR:
YON=ESKI.1 XOR YENI.0 ' birinin 1.biti ile diğerinin 0.biti XOR yapılır.
IF YON=1 THEN GOSUB LED1
IF YON=0 THEN GOSUB LED2
endif
INTCON.1=0 'komutu ile kesme bayrağı sıfırlanır.
RESUME
ENABLE
goto basla
END
LED1:
PORTA.2=1
PAUSE 1000
PORTA.2=0
RETURN
LED2:
PORTA.3=1
PAUSE 1000
PORTA.3=0
RETURN
Başlık: Ynt: Rotary Pot'ta sadece yön bilgisini okuma
Gönderen: ete - 28 Eylül 2022, 17:28:53
Rotary POT dedğin şey aslında Rotary ENCODER. Bu elemanın bir bağlantı şekli var öncelikle onu halletmen gerekiyor. Pot benzeri 3 bacak görülüyor resimde. Kullanacağın bacaklar bunlar. Ortadaki bacak direk GND ye bağlanacak. He riki uçta yer alan bacaklar ise 10K direnç ile +5V ta bağlanıp Pullup yapılmış olacak. Bu iki bacak aynı zamanda işlemciye girecek ve Kesme ile okumak istersen PORTB değişiklik kesmesi kullanman gerekecek.
POT'u çevirdiğin zaman iki tık aralığında bu encoder aşağıdaki çıkışları verir. Sağ ve soldaki çıkışlara A ve B dersek, Şayet saat yönünde çevriliyor ise A ve B çıkışları sırası ile %11 - %10 - %00 - %01 - %11 Saat yönünün tersinde çevriliyor ise %11 - %01 - %00 - %10 - %11 şeklinde çıkış verecektir.
Bu encoderin dönüş yönünü bulmak için öncelikle bir başlangıç okuması yapılır. Buna ilk diyelim. Okunan değer ILK=%00 olsun Hemen ardından ikinci bir okuma daha yapılır bunda SON diyelim . Şayet okun SON değeri %01 şeklinde okunmuş ise encoder saat yönünde, %10 şeklinde okunmuş ise Saatin tersi yönde dönüyor şeklinde yön bilgisi oluşturulacaktır. Genelde bu işi yapmanın yolu ILK=%XY ve SON=%WZ şeklinde ise YON=X XOR Z şeklinde belirlenir. Çıkan YON bilgisi 0 ise tersi yönde 1 ise saat yönünde anlamına gelecektir. Zira, YON= %0 XOR %1=1 veya YON=%0 XOR %0=0 (iki bit bir birinin aynısı ise sonuç sıfır farklı ise sonuç 1 dir.) Bir şey daha ekleyeyim. İlk okunan değer ile son okunan bir birinin aynısı ise encoder dönmüyordur ve belkide bunuda ayrıca değerlendirmek gerekebilecektir.
Umarım anlaşılmıştır. Ayrıca aşağıdaki linke de baksan fena olmaz.
https://etepic.com/index.php/topic,1967.0.html
Bu arada simulasyonda bu elemana en yakın malzeme MOTOR-ENCODER isimli malzemedir. Bir motora bağlı encoder gibi düşünülebilir. Çevirmek için motora röleler yardımı ile düz ve ters yönde voltaj verilerek motorun dolayısıyla encoderin dönmesi sağlanır.
Ete
Başlık: Ynt: Rotary Pot'ta sadece yön bilgisini okuma
Gönderen: blueboard - 28 Eylül 2022, 18:33:56
Ete hocam, öncelikle açıklamalarınız için teşekkür ederim. Simulasyon dosyasında encoder bağlantısında ortadaki bacağı direkt şaseye, yandaki bacakları da 10 k direnç ile pull up olacak şekilde bağlamıştım. Sizin verdiğiniz kodlardan esinlenerek programda rb0 kesmesi kullanmaya çalışmıştım. Rb0 kesme kodlarımda sorun var mı? Yön bulma konusundaki açıklamalarınıza göre kodda yön bulma konusunu tekrar ele alacağım. Saygılarımla.
Başlık: Ynt: Rotary Pot'ta sadece yön bilgisini okuma
Gönderen: ete - 28 Eylül 2022, 19:02:15
RB0 kesmesi tek bir pine bakar. Halbuki yön tayini için iki pine birden bakmalısın bu nedenle kesme olarak PORTB değişiklik kesmesi uygundur. RB0 kesmesi değil.
Ete
Başlık: Ynt: Rotary Pot'ta sadece yön bilgisini okuma
Gönderen: blueboard - 28 Eylül 2022, 19:58:27
Ete Hocam, kodları kesmeye göre tekrar düzenledim. Hatalarım var mı? Uyarılarınızı bekliyorum.
'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : *
'* Version : *
'* Notes : *
'* : *
'****************************************************************
define osc 4
PORTA=%00000000
portb=%00110000
TRISB=%00110000 'DEĞİŞİKLİK KESMESİ UYGULANACAĞI İÇİN ENCODER UÇLARI BB4 VE B5'E BAĞLANACAK.
TRISA=%00000000 '
'-----------------------------------------------------------------
@ DEVICE pic16F628A 'işlemci 16F628
@ DEVICE pic16F628A, WDT_OFF 'Watch Dog timer kapalı
@ DEVICE pic16F628A, PWRT_ON 'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF 'Kod Koruma kapalı
@ DEVICE pic16F628A, MCLR_off 'MCLR pini kullanılmıyor.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT 'Dahili osilatör kullanılacak
'-----------------------------------------------------------------
CMCON=7
ESKI= var byte
YENI= var byte
YON=var bIT
TEMP VAR BYTE
bayrak=0
INTCON=%10001000
ON INTERRUPT GOTO TEKRAR'KESME OLUŞUNCA TEKRAR ADLI ETİKETE GİDİLECEK
PAUSE 200
BASLA:
ESKI=PORTB & %00110000
YENI=PORTB & %00110000
IF YENI=ESKI THEN BASLA
Gosub tekrar
DISABLE ' DEĞİŞİKLİK KESMESİ İÇİN GEREKLİ
TEKRAR:
TEMP=PORTB
YON=ESKI.4 XOR YENI.5 ' birinin 4.biti ile diğerinin 5.biti XOR yapılır.
IF YON=1 THEN GOSUB LED1
IF YON=0 THEN GOSUB LED2
endif
INTCON.0=0 'KESME BAYRAĞINI SIFIRLADIK
RESUME
ENABLE
goto basla
END
LED1:
PORTA.2=1
PAUSE 1000
PORTA.2=0
RETURN
LED2:
PORTA.3=1
PAUSE 1000
PORTA.3=0
RETURN
Başlık: Ynt: Rotary Pot'ta sadece yön bilgisini okuma
Gönderen: ete - 28 Eylül 2022, 20:16:07
Bu programda doğru bir şey yok. Neler oluyor. ???? Hiçmi dersleri okumadın? Bu konuda yani değişiklik kesmesi konusunda ders notları var. Okuman gerek. Ayrıca Basic de değişken nasıl tanımlanır bilmiyorsun öğrenmen gerek. Kesme özel bir alt programdır. İşlemci bu alt programa kesme şartı yerine geldiği zaman gider. Program içinde kesme alt programına GOSUB yada GOTO ile gidilmez!!!!!.
Ufak bir düzeltme gerekse yapardım ama neredeyse tüm program değişmesi gerekiyor.
Ete
Başlık: Ynt: Rotary Pot'ta sadece yön bilgisini okuma
Gönderen: blueboard - 28 Eylül 2022, 20:22:17
Ete hocam, inanın hatalarım bilerek yaptığım bir şey değil. Sizin bir önceki mesajınızda değişiklik kesmesi gerektiğini yazmıştınız. Hemen kesmeler adlı dersinizi açtım ve değişiklik kesmesi yapmaya çalıştım. Şu an benim asıl sorunum rotary encoder'in dönüş yönünü belirlemede hatamın nerede olduğunu bilmememden kaynaklanıyor. Burada konuyu bilen sizin gibi bir ustadan yardım istiyorum. Siz eski konum ile yeni konumu önce okumamı, ardından bu iki değişkeni xor ile karşılaştırmam gerektiğini belirtmişyiniz.Ben de bunu yapmaya çalıştım ama acemilik işte. Elimden bu kadar geldi. Kasıtlı yapılmış bir şey yok.
Başlık: Ynt: Rotary Pot'ta sadece yön bilgisini okuma
Gönderen: blueboard - 28 Eylül 2022, 20:40:44
Ete Hocam, aşama aşama bana yardımcı olabilir misiniz. Şu an mantığıma göre kesme olmadan yön tayin etmek için kodları düzenledim.Affınıza sığınarak belirtiyorum, https://etepic.com/index.php/topic,1967.0.html linkindeki Rotary Encoder okuma dersinizde ilk mesajınızda ilişikteki dosyadan söz ediyorsunuz. Ancak ilişikte dosya yok. Dosya olsaydı dosyayı da inceler belki sizi bu kadar yormazdım.
'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : *
'* Version : *
'* Notes : *
'* : *
'****************************************************************
define osc 4
PORTA=%00000000
portb=%00110000
TRISB=%00110000 'ENCODER UÇLARI B4 VE B5'E BAĞLANACAK.
TRISA=%00000000 '
'-----------------------------------------------------------------
@ DEVICE pic16F628A 'işlemci 16F628
@ DEVICE pic16F628A, WDT_OFF 'Watch Dog timer kapalı
@ DEVICE pic16F628A, PWRT_ON 'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF 'Kod Koruma kapalı
@ DEVICE pic16F628A, MCLR_off 'MCLR pini kullanılmıyor.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT 'Dahili osilatör kullanılacak
'-----------------------------------------------------------------
CMCON=7 'dahili pull up iptal
ESKI= var byte
YENI= var byte
YON=var byte
PAUSE 300
BASLA:
ESKI=PORTB & %00110000
YENI=PORTB & %00110000
IF YENI=ESKI THEN BASLA
else Gosub tekrar
TEKRAR:
YON=ESKI.4 ^ YENI.5 ' birinin 4.biti ile diğerinin 5.biti XOR yapılır.
IF YON=1 THEN GOSUB LED1
IF YON=0 THEN GOSUB LED2
endif
return
goto basla
END
LED1:
PORTA.2=1
PAUSE 1000
PORTA.2=0
RETURN
LED2:
PORTA.3=1
PAUSE 1000
PORTA.3=0
RETURN
Başlık: Ynt: Rotary Pot'ta sadece yön bilgisini okuma
Gönderen: ete - 29 Eylül 2022, 16:41:49
Encoder okumanın en hızlı ve doğru yolu aşağıdaki şekilde oluyor.
YENI=PORTB & %00110000
IF YENI=ESKI THEN CIK 'Pot dönmemiş yada dönmüyor ise bir şey yapmadan geri dön
YON=ESKI.5 ^ YENI.4 ' YÖNÜ BELİRLE
ESKI=YENI 'Bu eşitlik bize bir sonraki okuma için Eski okuma değerini vermiş olacak.
CIK:
'Burada encoder okuma alt programından çıkıyoruz ve çıkarken elimizde YON isimli bilgi net şekilde 1 vya 0 olarak bulunmuş oluyor.
Ete
Başlık: Ynt: Rotary Pot'ta sadece yön bilgisini okuma
Gönderen: blueboard - 29 Eylül 2022, 18:19:58
Ete hocam, çok teşekkür ederim. Siz olmasanız başarabileceğime inanmıyordum. Sağlığınıza duacıyım.
Başlık: Ynt: Rotary Pot'ta sadece yön bilgisini okuma
Gönderen: ete - 30 Eylül 2022, 08:03:46
Dosyaların tamamını vereyim de hiç olmazsa bakarak öğren. Simulasyon şemasına özellikle dikkat et. Versiyon uyuşmazlığı olursa pdf olarak da verdim şemayı aynısını kurmaya çalış ve dene bence.
Ete
Başlık: Ynt: Rotary Pot'ta sadece yön bilgisini okuma
Gönderen: elektro77 - 30 Eylül 2022, 11:20:38
Bu konu ile bende daha önce ilgilenmiştim. Hocam ekteki encoder okuma devresinde ekranda sadece 4 değişik değer görebiliyorum. Bunun sebebi nedir? aşağıdaki açıklamanıza göre 5 değişik değer görmeli değil miyim? "A ve B çıkışları sırası ile Saat yönünde çevriliyor ise = %11 - %10 - %00 - %01 - %11 Saat yönünün tersinde çevriliyor ise= %11 - %01 - %00 - %10 - %11 şeklinde çıkış verecektir." Bir de benim devremdeki encoder, opto tipi encoder yani gnd ucu yok. 2 adet çatal tipi optik okuyucu 90 derece okuma açısı oluşturacak şekilde yanyana özenle yerleştirilip içinden 50 delikli bir disk geçişi sağlanmış. Bunu aşağıda yaptığım devredeki encoder açısından nasıl değerlendirmeliyim.
Başlık: Ynt: Rotary Pot'ta sadece yön bilgisini okuma
Gönderen: ete - 30 Eylül 2022, 11:53:55
%XY şeklinde iki bitlik bir sayının kaç adet farklı değer verebileceğine bakman lazım. 1- %00 2- %01 3- %10 4- %11 bunların dışında bir başka farklı sayı üretebilirmisin.? bence üretilemez. O ndenle 4 farklı değer görmen gerekiyor.
Senin devrene gelince. Şemana baktım ve bu şekilde bir encoderin çalışması bana göre imkansız. Encoderden iki adet gelip işlemciye giriyor ve bunlar pullup yani HIGH da bekliyor. O girişlerin bir farkı anlayabilmesi için o girşlerden birinin mekanik olarak arada bir LOW a çekilmesi gerekir ki bu bağlantı şeklinde bu imkansız. Bu bir encoder değil fiziksel 2 pinden giriş pullupda bekliyor ve o girişlerden birini yada ikisini LOW yapabiliyorsan girişten bir şey okunabilir. Değilse sistem çalışmaz. Diğer taraftan encoderin en önemli özelliklerinden birisi iki girişten gelen sinyallerin birisinin diğerine göre 90 derece faz farkına sahip olmasıdır. Buda olmaz ise zaten yukarıda bahsettiğimiz 4 farklı durum oluşmaz zaten. Ete
Başlık: Ynt: Rotary Pot'ta sadece yön bilgisini okuma
Gönderen: alisumer - 04 Ekim 2022, 08:46:48
asm kodu iyi çalışıyor pic basice monte edebilirsiniz
KESME:
asm
BCF INTCON ,7
BANKSEL PORTB
MOVLW 0XC0 ;portb 6-7 bitlerinden okuma yapılıyor
ANDWF PORTB ,W ;bu yüzden 11000000 ile and işlemi
MOVWF _YENI ;filtreleniyor
RRF _YENI ,W ;yeni okuma ile eski okuma yeni okuma bir sağa kaydırılarak
XORWF _ESKI ,W ;yön bilgisi için xor işlemi ile karşılaştırılıyor
MOVWF _YON
BTFSS _YON ,6 ; bit 6 test ediliyor 1 ise art 0 ise eks e dallanıyor
GOTO EKS
ART:
INCFSZ _KONUM ,F ; konum 1 arttırılır
GOTO $+2 ; alt byte de taşma oldupunda
INCF _KONUM+1 ,F ;üst byte 1 arttırılır
GOTO CIK
EKS:
MOVLW .1 ;
SUBWF _KONUM ,F ;decfsz 0 da kontrol edildiğinden kullanılmaz
BTFSC STATUS ,C ;çıkıarma işlemi ile konum bir azaltılır
GOTO $+2 ;status taşma kontrolu ile konum ff olduğunda üst byte 1 azaltılır
DECFSZ _KONUM+1 ,F
CIK:
MOVLW .3 ;konum 1024 ile sınırlandırılıyor.
ANDWF _KONUM+1 ,F ;00000011 ile üst byte filtrelenerek
CLRF _I ;programa özeldir şart değil 65535 sınır
MOVF _YENI ,W ;eski okumayı yenisi ile güncelle
MOVWF _ESKI ;
MOVF PORTB ,W
MOVWF _TEMP
BCF INTCON ,0
BANKSEL PORTA
RETFIE
ENDASM
Başlık: Ynt: Rotary Pot'ta sadece yön bilgisini okuma
Gönderen: blueboard - 28 Eylül 2024, 14:55:41
Alıntı yapılan: ete - 30 Eylül 2022, 08:03:46Dosyaların tamamını vereyim de hiç olmazsa bakarak öğren. Simulasyon şemasına özellikle dikkat et. Versiyon uyuşmazlığı olursa pdf olarak da verdim şemayı aynısını kurmaya çalış ve dene bence.
Ete Ete Hocam, iyi günler. Daha önce yardımlarınız sayesinde Rotary Encoder ile yön bilgisini tespit etmiş ve sorunumu çözmüştüm. Şimde aynı kodları 16f1827 'ye uyarlamaya çalışıyorum. Sigorta ayarlarını 16F1827 için yazdım. Fakat Encoder'den okuma yapamıyorum. Yeni devremde hem Rotary Encoder'in yön bilgisine göre, hem de devrede bulunan butonların durumuna göre ilgili pin ile led yakmak istiyorum. Intcon registerinde bir şey dikkatimi çekti: Sizin bana 16f628a için gönderdiğiniz kodda INTCON=%10001000 yazmıştınız. Ancak son olarak yayınladığınız KESMELER dersinde INTCON için INTCON registerinden hem global kesmeler hemde PORTB.0 kesmesi bitleri aktif edilir. 'Bit7=Global kesme biti , Bit4=PortB.0 Kesme bitidir. 'INTCON=%10010000 şeklinde örnek verdiniz. 16f1827 için kodları ekliyorum. Zamanınız uygun olursa kontrol edip hatamı bulabilir misiniz.
'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : *
'* Version : *
'* Notes : *
'* : *
'****************************************************************
'#CONFIG
' __config _BODEN_ON & _BOREN_ON & _CP_ON & _PWRTE_ON & _WDT_ON & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT
'#ENDCONFIG
DEFINE OSC 4
CMCON=7
PORTA=0:PORTB=0
TRISB=%00110000 'DEĞİŞİKLİK KESMESİ UYGULANACAĞI İÇİN ENCODER UÇLARI BB4 VE B5'E BAĞLANACAK.
TRISA=%00000000 '
''-------------------------------------------------------------------------
'@ DEVICE pic16F628A 'işlemci 16F628
'@ DEVICE pic16F628A, WDT_OFF 'Watch Dog timer kapalı
'@ DEVICE pic16F628A, PWRT_ON 'Power on timer açık
'@ DEVICE pic16F628A, PROTECT_OFF 'Kod Koruma kapalı
'@ DEVICE pic16F628A, MCLR_off 'MCLR pini kullanılmıyor.
'@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT 'Dahili osilatör kullanılacak
ASM
__config _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_ON & _CPD_ON & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_ON & _FCMEN_ON
__config _CONFIG2, _WRT_ALL & _PLLEN_OFF & _STVREN_ON & _LVP_OFF & _BORV_19 & _LVP_OFF
ENDASM
''--------------------------------------------------------------------------
ONAY VAR BYTE
TEMP VAR BYTE
ESKI var byte
YENI var byte
W VAR WORD
YON var BYTE
ONCEKI VAR BYTE
ALDI var bit
INTCON=%10001000 'KESME DERSİNİZDE INTCON registerinden hem global kesmeler hemde PORTB.0 kesmesi bitleri aktif edilir.
'Bit7=Global kesme biti , Bit4=PortB.0 Kesme bitidir.
'INTCON=%10010000 yazmıştınız ancak burada daha önce " INTCON=%10001000 " yazdınız.
ON INTERRUPT GOTO KESME'KESME OLUŞUNCA TEKRAR ADLI ETİKETE GİDİLECEK
PAUSE 200
YON=0:ALDI=0
BASLA:
if PORTb.4=0 then
portA.2=1
WHILE portb.4=0:WEND
portA.2=1
ENDIF
if portb.2=0 then
Porta.1= 1
WHILE portB.2=0:WEND
Porta.1 = 0
pause 200
ENDIF
if portb.3=0 then
Porta.0 = 1
WHILE portB.3=0:WEND
Porta.0 = 0
pause 200
ENDIF
IF YON=1 AND ALDI=1 THEN
PORTA.2=1
pause 1000
porta.2=0
GOSUB DELAY
ENDIF
IF YON=0 AND ALDI=1 THEN
PORTA.3=1
pause 1000
porta.3=0
GOSUB DELAY
ENDIF
PORTA=0:
goto basla
DELAY:
FOR W=0 TO 15000
PAUSEUS 5
NEXT
ONAY=0
ALDI=0
RETURN
DISABLE ' DEĞİŞİKLİK KESMESİ İÇİN GEREKLİ
KESME:
YENI=PORTB & %00110000
IF YENI=ESKI THEN CIK 'POT DÖNMÜYORSA ÇIKIŞA GİT BİR ŞEY YAPMA
YON=ESKI.5 ^ YENI.4 ' YÖNÜ BELİRLE
ALDI=1 'BU SADECE BİR TEDBİR BİTİ LEDLER POT DÖNMEDEN YANMASIN DİYE
ESKI=YENI 'BU ESKİ OKUMA OLACAK
CIK:
INTCON.0=0 'KESME BAYRAĞINI SIFIRLADIK
TEMP=PORTB 'PORTU OKUDUK DEĞİŞİKLİK OLURSA KESMEYE GELİNECEK.
RESUME
ENABLE
END
Başlık: Ynt: Rotary Pot'ta sadece yön bilgisini okuma
Gönderen: ete - 29 Eylül 2024, 08:40:22
Yeni işlemcin port tanımlamalarında farklı özelliklere sahip. Eskisi olan 16F628A da Porttan çıkış yapmak için örneğin PORTA.2 den HIGH çıkarmak için PORTA.2=1 yazman yeterli iken yenisi olan 16F1827 bu işi LATA registeri yapmaktadır. Bu durumda LATA.2=1 yazman gerekir.
Eskisinde Port değişiklik kesmesi INTCON.3 biti set edilerek açılır yenisinde de aynı şekilde açılır. Ancak yenisinde değişikliğin yükselen kenarda mı yoksa düşen kenardamı olduğunu da seçmek gerekiyor. Eskisinde bu özeellik yok idi. Yenisinde bu işi IOCBP (Interrup On Change PORTB Positive) yani yükselen kenarda kesme oluşturma registeri ayarlıyor. Benzer şekilde IOCBN buda düşen kenarda kesme oluşturma registeridir. Senin kesmeler,in yükselen kenarda olacak o halde IOCBP ye değer vermen gerekir.
Programın yanında şema vermemişsin. Programa bakınca giriş ayarlaması olarak TRISB=%00110000 görüyorum. Bu bana PORTB.4 ve PORTB.5 pinlerinin giriş diğerlerinin çıkış olacağını gösterir. Ancak programa bakınca ; -if portb.2=0 -if portb.3=0 komut satırlarını görüyorum bu satırlar PORTB.2 ve PORTB.3 pinlerinde giriş kontrolü yapıyor ama tanımlama kısmında bu pinleri giriş yapmamışsın. Şemanı görsem hiç sormaz bunları düzenlerdim. Ama bu durumda kendin karar vermen gerekecek. Şayet bu pinlerde birer giriş pini ise; TRISB=%00111100 şeklinde giriş ayarlaması yapman gerekir.
Kesme kullanılan programlarda pause kullanılması çok sakıncalıdır. Kullanılmaması gerekir. İlla bir gecikme yaratılacak ise döngüsel gecikme (senin programında DELAY alt programı gibi) yaratılmalıdır. Böylece gecikme dilimlere bölünmüş Pause yada Pauseus ler ile halledilerek programın kesme oluştuğunda anında kesme etiketine gitmesi sağlanır. AKsi halde oraya koyduğun PAUSE 1000 komutu işlenip bitinceye kadar program kesmeye gidemez. Buda sana algılamada 1 sn lik bir gecikme yaratırki sistemin doğru çalışmadığını hemen hissedersin.
Programı olması gereken şekle soktum aşağıdadır.
Ete
'device 16F1827
#CONFIG
__config _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_ON & _FCMEN_ON
__config _CONFIG2, _WRT_ALL & _PLLEN_OFF & _STVREN_ON & _LVP_OFF & _BORV_19
#ENDCONFIg
define OSC 4
OSCCON =%01101000 '%0xxxx000 ,1111=16mHZ, 1110=8mHZ, 1101=4mHZ. 16MHz internal osilatör frekansı seçildi
OSCSTAT =%00000000 'Timer1 Osilatör kullanıma hazır,4xPLL KAPALI
OSCTUNE =0
ANSELA=0:TRISA=%00100000:LATA=0:PORTA=0:WPUA=%00100000 'MCLR PİNİ DAİMA GİRİŞ OLARAK AYARLANMALI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ANSELB=0:TRISB=%00111100:LATB=0:PORTB=0:WPUB=%00110000
CM1CON0.7=0
CM2CON0.7=0
DACCON0=0
CPSCON0=0
FVRCON=0
SSP1CON1.5=0
CCP1CON = %00000000
CCP2CON = %00000000
CCP3CON = %00000000
CCP4CON = %00000000
CCPTMRS =0
APFCON0=0
APFCON1=0
OPTION_REG.7 = 0
OPTION_REG.6 = 1
'--------------------------------------------------------------------------
ONAY VAR BYTE
TEMP VAR BYTE
ESKI var byte
YENI var byte
W VAR WORD
YON var BYTE
ONCEKI VAR BYTE
ALDI var bit
INTCON=%10001000 'KESME DERSİNİZDE INTCON registerinden hem global kesmeler hemde PORTB.0 kesmesi bitleri aktif edilir.
'Bit7=Global kesme biti , Bit4=PortB.0 Kesme bitidir.
'INTCON=%10010000 yazmıştınız ancak burada daha önce " INTCON=%10001000 " yazdınız.
IOCBP=%00110000
ON INTERRUPT GOTO KESME'KESME OLUŞUNCA TEKRAR ADLI ETİKETE GİDİLECEK
PAUSE 200
YON=0:ALDI=0
ESKI=PORTB & %00110000
BASLA:
if PORTB.4=0 then
LATA.2=1
WHILE PORTB.4=0:WEND
GOSUB DELAY
ENDIF
if portb.2=0 then
LATA.1= 1
WHILE portB.2=0:WEND
LATA.1 = 0
GOSUB DELAY
ENDIF
if portb.3=0 then
LATA.0 = 1
WHILE portB.3=0:WEND
LATA.0 = 0
GOSUB DELAY
ENDIF
IF YON=1 AND ALDI=1 THEN
LATA.2=1
pause 1000
LATA.2=0
GOSUB DELAY
ENDIF
IF YON=0 AND ALDI=1 THEN
LATA.3=1
GOSUB DELAY
GOSUB DELAY
LATA.3=0
GOSUB DELAY
ENDIF
LATA=0
goto basla
DELAY:
FOR W=0 TO 15000
PAUSEUS 5
NEXT
ONAY=0
ALDI=0
RETURN
DISABLE ' DEĞİŞİKLİK KESMESİ İÇİN GEREKLİ
KESME:
YENI=PORTB & %00110000
IF YENI=ESKI THEN CIK 'POT DÖNMÜYORSA ÇIKIŞA GİT BİR ŞEY YAPMA
YON=ESKI.5 ^ YENI.4 ' YÖNÜ BELİRLE
ALDI=1 'BU SADECE BİR TEDBİR BİTİ LEDLER POT DÖNMEDEN YANMASIN DİYE
ESKI=YENI 'BU ESKİ OKUMA OLACAK
CIK:
INTCON.0=0 'KESME BAYRAĞINI SIFIRLADIK
IOCBF=0 'Kesme bayrağı sıfırlanıyor yeniden kesme oluşabilmesi için
RESUME
ENABLE
END
Başlık: Ynt: Rotary Pot'ta sadece yön bilgisini okuma
Gönderen: blueboard - 29 Eylül 2024, 14:09:24
Alıntı yapılan: ete - 29 Eylül 2024, 08:40:22Yeni işlemcin port tanımlamalarında farklı özelliklere sahip. Eskisi olan 16F628A da Porttan çıkış yapmak için örneğin PORTA.2 den HIGH çıkarmak için PORTA.2=1 yazman yeterli iken yenisi olan 16F1827 bu işi LATA registeri yapmaktadır. Bu durumda LATA.2=1 yazman gerekir.
Eskisinde Port değişiklik kesmesi INTCON.3 biti set edilerek açılır yenisinde de aynı şekilde açılır. Ancak yenisinde değişikliğin yükselen kenarda mı yoksa düşen kenardamı olduğunu da seçmek gerekiyor. Eskisinde bu özeellik yok idi. Yenisinde bu işi IOCBP (Interrup On Change PORTB Positive) yani yükselen kenarda kesme oluşturma registeri ayarlıyor. Benzer şekilde IOCBN buda düşen kenarda kesme oluşturma registeridir. Senin kesmeler,in yükselen kenarda olacak o halde IOCBP ye değer vermen gerekir.
Programın yanında şema vermemişsin. Programa bakınca giriş ayarlaması olarak TRISB=%00110000 görüyorum. Bu bana PORTB.4 ve PORTB.5 pinlerinin giriş diğerlerinin çıkış olacağını gösterir. Ancak programa bakınca ; -if portb.2=0 -if portb.3=0 komut satırlarını görüyorum bu satırlar PORTB.2 ve PORTB.3 pinlerinde giriş kontrolü yapıyor ama tanımlama kısmında bu pinleri giriş yapmamışsın. Şemanı görsem hiç sormaz bunları düzenlerdim. Ama bu durumda kendin karar vermen gerekecek. Şayet bu pinlerde birer giriş pini ise; TRISB=%00111100 şeklinde giriş ayarlaması yapman gerekir.
Kesme kullanılan programlarda pause kullanılması çok sakıncalıdır. Kullanılmaması gerekir. İlla bir gecikme yaratılacak ise döngüsel gecikme (senin programında DELAY alt programı gibi) yaratılmalıdır. Böylece gecikme dilimlere bölünmüş Pause yada Pauseus ler ile halledilerek programın kesme oluştuğunda anında kesme etiketine gitmesi sağlanır. AKsi halde oraya koyduğun PAUSE 1000 komutu işlenip bitinceye kadar program kesmeye gidemez. Buda sana algılamada 1 sn lik bir gecikme yaratırki sistemin doğru çalışmadığını hemen hissedersin.
Programı olması gereken şekle soktum aşağıdadır.
Ete
'device 16F1827
#CONFIG
__config _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_ON & _FCMEN_ON
__config _CONFIG2, _WRT_ALL & _PLLEN_OFF & _STVREN_ON & _LVP_OFF & _BORV_19
#ENDCONFIg
define OSC 4
OSCCON =%01101000 '%0xxxx000 ,1111=16mHZ, 1110=8mHZ, 1101=4mHZ. 16MHz internal osilatör frekansı seçildi
OSCSTAT =%00000000 'Timer1 Osilatör kullanıma hazır,4xPLL KAPALI
OSCTUNE =0
ANSELA=0:TRISA=%00100000:LATA=0:PORTA=0:WPUA=%00100000 'MCLR PİNİ DAİMA GİRİŞ OLARAK AYARLANMALI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ANSELB=0:TRISB=%00111100:LATB=0:PORTB=0:WPUB=%00110000
CM1CON0.7=0
CM2CON0.7=0
DACCON0=0
CPSCON0=0
FVRCON=0
SSP1CON1.5=0
CCP1CON = %00000000
CCP2CON = %00000000
CCP3CON = %00000000
CCP4CON = %00000000
CCPTMRS =0
APFCON0=0
APFCON1=0
OPTION_REG.7 = 0
OPTION_REG.6 = 1
'--------------------------------------------------------------------------
ONAY VAR BYTE
TEMP VAR BYTE
ESKI var byte
YENI var byte
W VAR WORD
YON var BYTE
ONCEKI VAR BYTE
ALDI var bit
INTCON=%10001000 'KESME DERSİNİZDE INTCON registerinden hem global kesmeler hemde PORTB.0 kesmesi bitleri aktif edilir.
'Bit7=Global kesme biti , Bit4=PortB.0 Kesme bitidir.
'INTCON=%10010000 yazmıştınız ancak burada daha önce " INTCON=%10001000 " yazdınız.
IOCBP=%00110000
ON INTERRUPT GOTO KESME'KESME OLUŞUNCA TEKRAR ADLI ETİKETE GİDİLECEK
PAUSE 200
YON=0:ALDI=0
ESKI=PORTB & %00110000
BASLA:
if PORTB.4=0 then
LATA.2=1
WHILE PORTB.4=0:WEND
GOSUB DELAY
ENDIF
if portb.2=0 then
LATA.1= 1
WHILE portB.2=0:WEND
LATA.1 = 0
GOSUB DELAY
ENDIF
if portb.3=0 then
LATA.0 = 1
WHILE portB.3=0:WEND
LATA.0 = 0
GOSUB DELAY
ENDIF
IF YON=1 AND ALDI=1 THEN
LATA.2=1
pause 1000
LATA.2=0
GOSUB DELAY
ENDIF
IF YON=0 AND ALDI=1 THEN
LATA.3=1
GOSUB DELAY
GOSUB DELAY
LATA.3=0
GOSUB DELAY
ENDIF
LATA=0
goto basla
DELAY:
FOR W=0 TO 15000
PAUSEUS 5
NEXT
ONAY=0
ALDI=0
RETURN
DISABLE ' DEĞİŞİKLİK KESMESİ İÇİN GEREKLİ
KESME:
YENI=PORTB & %00110000
IF YENI=ESKI THEN CIK 'POT DÖNMÜYORSA ÇIKIŞA GİT BİR ŞEY YAPMA
YON=ESKI.5 ^ YENI.4 ' YÖNÜ BELİRLE
ALDI=1 'BU SADECE BİR TEDBİR BİTİ LEDLER POT DÖNMEDEN YANMASIN DİYE
ESKI=YENI 'BU ESKİ OKUMA OLACAK
CIK:
INTCON.0=0 'KESME BAYRAĞINI SIFIRLADIK
IOCBF=0 'Kesme bayrağı sıfırlanıyor yeniden kesme oluşabilmesi için
RESUME
ENABLE
END