Picproje Elektronik Sitesi

DERLEYİCİLER => CCS C => Konuyu başlatan: bulut_01 - 16 Haziran 2019, 12:54:30

Başlık: enkoderdan yanlış okunan pulse için yardım
Gönderen: bulut_01 - 16 Haziran 2019, 12:54:30
iyi günler picproje ailesi motor kontrol için yaptıgım bir sistem var motor üzerinde hall sensorlü enkoder var ben burdan gelen sinyalleri okuyorum sistemimde rf 433 modül mevcut rda kesmesinide kullanıyorum enkoderu rb kesmesinde okuyorum rf modulden devamlı parazit geldiği için rda kesmesine sık sık dallandıgı için program enkoder gelen pulsları kaçırıyorum düzgün ölçemiyorum bu konuda nasıl bir yol izlemeliyim ? enkoder okuma için daha iyi kod varsa paylaşırsanız onuda kullanabilirim.mcu 18f24K22

uart ayarları şu şekilde.
#use rs232(baud=1200,parity=N,xmit=PIN_c6,rcv=PIN_c7,bits=8,uart1,stop=1,timeout=15)
enkoder için kullandıgım kod;
#int_RB
void rb_isr (void)
{
yenia=input(pin_b5);     
yenib=input(pin_b4);     
yon_1=eskia ^ yenib;         
konum = konum + (2 * yon_1) -1;
eskia = yenia;
eskib = yenib;
clear_interrupt(INT_RB);
}
Başlık: Ynt: enkoderdan yanlış okunan pulse için yardım
Gönderen: bulut_01 - 16 Haziran 2019, 22:12:49
bu konuda yok mu bir fikri olan?
Başlık: Ynt: enkoderdan yanlış okunan pulse için yardım
Gönderen: RaMu - 16 Haziran 2019, 23:15:21
Enkoder modülü olan mcu kullanmak en doğrusu.

Mcu dışında bir devre kurup sayma işini o devreye yaptırabilirsin,
gerektiğinde mcu bu değeri okuyup değerlendirir.

Sadece yön tayini ve aşağı sayıyor yukarı sayıyor
işini dışarıda bir devreye yaptırıp,
buradan gelen sinyal ile
mcu da iki tane timer a harici tetik ile sayma yaptırıp...
böyle bir şeyler yapılabilir belki.
Başlık: Ynt: enkoderdan yanlış okunan pulse için yardım
Gönderen: bulut_01 - 16 Haziran 2019, 23:26:51
ramu hocam pcb yapılı yani devre üzerinde donanımsal değişiklik yapamam rb kesmesi içinde yön bilgisi elde edip azaltacak yada artıracak kısmı karar verene kdr pulse lar kaçıyor rotary enkoder algoritması varsa elinizde rb kesmesinde kullanılan paylaşırsanız denemek isterim.
Başlık: Ynt: enkoderdan yanlış okunan pulse için yardım
Gönderen: mehmet - 16 Haziran 2019, 23:44:46
Zaman kesmesi ile sadece
enkoder pin değerlerini alın.
Yön hesaplama işini ana döngü
içerisinde veya gerekli
olduğunda yapın.

Yine de olmaz ise, mecburen
donanımsal değişiklik yapmanız
gerekecektir.
Başlık: Ynt: enkoderdan yanlış okunan pulse için yardım
Gönderen: RaMu - 17 Haziran 2019, 00:33:13
Rf modulü yoksay, uart kesmesini kapat, enkoder ölçümünde yine problem oluyor mu bir dene,
oluyorsa zaten yapabileceğin bir şey yok denebilir.
Uart kesmesi olmadan düzgün çalışabiliyorsa
rf modül rda uart kesmesi kısmına bir şeyler düşünürüz ona göre.

Birde rda kesmesi kısmınıda paylaş bakalım.
Rf modül mcu bağlantısı nasıl yapılmış şema paylaş.

Mcu ne hızda çalışıyor?
Başlık: Ynt: enkoderdan yanlış okunan pulse için yardım
Gönderen: bulut_01 - 17 Haziran 2019, 08:23:53
mcu 64 mhz çalışıyor uart kapattıgımda sorun olmuyor pulse kaçırmıyor modülün çıkısı pnp transistör ile invert edilip mcu rx pinine direk baglı 12 byte veri alıp işleyip ona göre motor kontrol yapıyorum gelen veri keeloq algoritması enkoder için t1gate ve t5gate kesmesi kullanıyodum uart açık oldugunda pulse kaçırıyodu 433 modül cıkısındaki gürültüden dolayı sık sık rda kesmesine girdiği için pulse kaçırmalar oluyor şimdi algoritmada değişiklik yaptım ve rb kesmesini kullanıyorum bundadaki sıkıntı yön bilgisi kararı verene kdr ki o süreçde pulse kaçırma oluyor ama yön bilgisini ben motor dönüş algoritmamdan direk verince pulse kaçırmıyor bu durumdada istemdışı motor farklı yöne döndüğünü anlıyamam bu durumdada böyle bir olumsuz durum var. kısacası yukardaki algoritmanın yön bilgisi tahinini main içinde denemedim yön bilgisine hızlı karar verirsem rb int pulse kaçırmıyacak gibi görünüyor kesme önceliği int_rb ayarlı.
Başlık: Ynt: enkoderdan yanlış okunan pulse için yardım
Gönderen: kimlenbu - 17 Haziran 2019, 11:07:01
Hangi mcu'yu kullanıyorsun bilmiyorum ama usart işini dma'ya pasla, kesme önceliğini de enkodere ver.
Başlık: Ynt: enkoderdan yanlış okunan pulse için yardım
Gönderen: bulut_01 - 17 Haziran 2019, 12:03:54
18f24k22 mcu maglesef dma yok.
Başlık: Ynt: enkoderdan yanlış okunan pulse için yardım
Gönderen: RaMu - 17 Haziran 2019, 13:23:29
Keşke Türkçe yazsaydın, üç defa okuyup ancak bir şeyler anlayabildim.

Şema yok, rda kesmesi yok halen.

Yazdıklarına dayanarak, sorunun esasen neyden kaynaklandığını
doğru tayin edebildiğini düşünmüyorum.
Eğer sorun rb kesmesinin kısa sürmesi ile çözülebilecekse
o kısmı asm yazarız hallolabilir.
Bu nedenle sorunu net olarak belirlemek, köşeye sıkıştırmak lazım.

Bu noktaya gelmeden önce şu rf modulün paraziti nereden geliyor,
bu parazit engellenebilir mi
o kısmıda çözelim.

Tekrar soruyorum;
rda kesmesini kapatınca, yukarıda verdiğin enkoder algoritması
pals kaçırmadan çalışabiliyor mu?
Ben çalışıyor diye anladım yazdıklarından ama
rda kesmesini açınca pals kaçırıyor diyorsun
rda kesmesini açınca pals kaçırmasının sebebide, nedense,
rb kesmesinde yön hesabı yapmak uzun sürüyor ondan diyorsun.
!

Bu arada kullandığın enkoder kaç pals, daha doğrusu
sisteminde en yüksek hızda saniyede kaç pals ölçmeni gerektiriyor?
Başlık: Ynt: enkoderdan yanlış okunan pulse için yardım
Gönderen: bulut_01 - 17 Haziran 2019, 13:52:09
100 hz enkoderim 3000 rpm dönüyor motor a ve b 2 fazlı enkoder rda kodlar pc de eve gecince koyabilirim
433 rf modül piyasadaki modüllerden ortamdaki sinyal kirliliğinden dolayı çıkışında durmadan dataları scop ile bakınca görülüyor.

rb isr{
if(yon==1){
konum++;}
else{
konum--;}}

seklinde kaçırmıyor. burda yön bilgisini motorun saga ve sola dönme kod kümesinden yön bilgisini verirsem kaçırmıyor.
asagıdaki kodu rb kesmesi içine ekleyince yön bilgisi bulmak için o zamn pulse kaçırıyor.

yenia=input(pin_b5);     
yenib=input(pin_b4);     
yon=eskia ^ yenib;         
eskia = yenia;
eskib = yenib;
Başlık: Ynt: enkoderdan yanlış okunan pulse için yardım
Gönderen: bulut_01 - 17 Haziran 2019, 18:22:42
@RaMu yukardaki yazımı pek anlamamışın t1gate ve t5gate kesmelerini kullandıgım vakit rda yani uart açtıgımda pulse kaçırıyor cünkü t1gate ve t5gate kesmelerine öncelik verilmiyor baktım t1g ve t5g kesmesi ile bu iş olmuyacak pulse kaçırma mevzusundan dolayı sonuçda t1g ve t5g kesmeleri ile rb kesmesi aynı portları kullanıyor donanımsal değişiklik yapmadan rb kesmesine geçtim ve kesme önceliği 1ci sırada rb ayarladım yön bilgisi tayin etmek için kullandıgım yukardada örnekde verdiğim kod ile yön belirleyene kdr pulse kaçırıyor bunu nerden anlıyosun diye sorar isen motoru limit ayarlarını yaptıkdan sonra her saga ve sola dönüşlerinde farklı yerlerde durması kısacası ayarlı konumda durmaması.
Başlık: Ynt: enkoderdan yanlış okunan pulse için yardım
Gönderen: RaMu - 17 Haziran 2019, 20:32:30
Yine söylüyorum
uart kısmını tamamen yoksayıp,
uart kesmesini tamamen kapatıp,
enkoder okumayı yaparsan bu iş çözülür.

Enkoder okumak için kullandığın kesmede
uart okumayıda yaptırabiliriz.
Uart baudrate bayağı yavaş,
program içinde bile gelen bilgiler okunabilir.
Bu bir çözüm buraya odaklanabilirsin.

Yani öncelikle yapılması gereken
Rda kesmesi kapalı iken rb veya t1gate ve veya t5gate kesmeleri ile enkoder konum ve yön okuma işini halletmek.
Başlık: Ynt: enkoderdan yanlış okunan pulse için yardım
Gönderen: bulut_01 - 17 Haziran 2019, 20:41:46
@RaMu  üstad uart iptal edince sorun yok pulse kaçırma olmuyor her iki kesmede de uart açınca modülün çıkışındaki parazitden dolayı asırı sekilde rda kesmesi oluşuyor bu esnada motor döndüğünde pulse kaçırıyor baund hızı düşük rb kesmesi kullanmak daha mantıklı geliyor bana yön tayini daha hızlı nasıl bir algoritmayla yapabilirim asagıdaki örnek daha fazla zaman alıyor rb içinde pulse kaçıyor baska ne önerin vardır bu konuda?
soft uart kullandım kumanda tepkisi baya düştü.

yenia=input(pin_b5);     
yenib=input(pin_b4);     
yon=eskia ^ yenib;         
eskia = yenia;
eskib = yenib;

bu kodun yerine daha hızlı nasıl yön bilgisi elde edebilirim rb içinde yada main içinde.
Başlık: Ynt: enkoderdan yanlış okunan pulse için yardım
Gönderen: bulut_01 - 17 Haziran 2019, 20:47:16
...
Başlık: Ynt: enkoderdan yanlış okunan pulse için yardım
Gönderen: RaMu - 17 Haziran 2019, 21:36:11
Rda kesmesi almış başını gitmiş,
bu kadar işi o kesmede yaparsan olmaz ki.
Özellikle o make 16 32 ler uçuruyor orayı,
asm çıktısına bakabilirsin.
Aynı işi yapacak kodu daha farklı yöntemlerle daha hızlı çalışacak şekilde yapabilirsin.

Kesme içindede kesme kapa aç yapmamalısın zaten.


O enkoder algoritması bayağı hızlı ve bilinen bir algoritma.
En fazla direk asm yazılabilir.

Rda kesmesi içinde sadece
oku = getc();
kalacak şekilde sadeleştirip
bu durumda pals kaçırma oluyor mu dener misin.
Başlık: Ynt: enkoderdan yanlış okunan pulse için yardım
Gönderen: bulut_01 - 17 Haziran 2019, 21:41:58
yön bilgisi için baska nasıl algoritma önerirsin rda içini düzenlerim.
Başlık: Ynt: enkoderdan yanlış okunan pulse için yardım
Gönderen: bulut_01 - 17 Haziran 2019, 21:43:04
kesme içinde kapa aç neden yapmamalıyım?
Başlık: Ynt: enkoderdan yanlış okunan pulse için yardım
Gönderen: RaMu - 18 Haziran 2019, 01:59:52
Rda işini çözmelisin, enkoder kısmı değil problem olan.

https://www.microchip.com/forums/m347116.aspx
7 ve 16 nolu mesajlar:

Burada senin koda göre
E1now = (PORTA & 0b00001100); //encoder A B = bit2 bit3 sende
E1now = (PORTB>>2 & 0b00001100);  //encoder A B = bit4 bit5 olduğundan iki defa sağa kaydırdıkşeklinde olacak.

Alıntı yapılan: tunelabguy link=https://www.microchip.com/forums/m347116.aspxE1now = (PORTA & 0b00001100);
   k = E1now | (E1old>>2);    //..using lower 4 bits now
   switch(k)
   {
     case 0b0000:
     case 0b0101:
     case 0b1010:
     case 0b1111:  break;   //..nothing changed
 
     case 0b0001:
     case 0b0111:
     case 0b1110:
     case 0b1000:  E1position++;
                         break;
 
     case 0b0100:
     case 0b0010:
     case 0b1011:
     case 0b1101:  E1position--;
                         break;
 
     default:    //..more than one bit changed
                break;
   }
   E1old = E1now;
 



Alıntı yapılan: bulut_01 - 17 Haziran 2019, 21:43:04kesme içinde kapa aç neden yapmamalıyım?
'Rda kesmesi içini işlemeye başladın,
daha bitirmeden yani sen rda kesmesi içindeyken
-bu esnada- uart 8 bit veri aldı ve
tekrar rda kesmesine girecek'
diye düşünerek mi rda kesmesini kapatıyorsun?

Rda kesmesi içinde tekrar rda kesmesi gelebilecek kadar süre harcayamazsın
böyle oluyorsa yazdığın program çok sıkıntılı demektir,
zaten düzgün çalışamaz.


Başlık: Ynt: enkoderdan yanlış okunan pulse için yardım
Gönderen: bulut_01 - 18 Haziran 2019, 06:53:27
swich case yöntemide mantıklı deneyecegim rda düzenlicem sonuç yine yazarım @RaMu  tşk ederim üstad.
Başlık: Ynt: enkoderdan yanlış okunan pulse için yardım
Gönderen: bulut_01 - 18 Haziran 2019, 07:54:22
E1now = (PORTB>>2 & 0b00001100);

yerine
 
E1now = (PORTB & 0b00110000); böyle kullansak ne olur?
Başlık: Ynt: enkoderdan yanlış okunan pulse için yardım
Gönderen: Tagli - 18 Haziran 2019, 08:24:22
Alıntı yapılan: bulut_01 - 17 Haziran 2019, 21:43:04kesme içinde kapa aç neden yapmamalıyım?
Kesme içindeyken başka bir kesmenin gelmesine donanım izin vermez zaten. Bayrak kalkar ama dallanma olmaz. Kesmeye girildiğinde GIE otomatik olarak 0 olur (ki bunu donanım yapar), çıkarken tekrar 1 yapılır (bunu da derleyici yapar).

Kesme öncelikleri kullanıyorsan, düşük öncelikli bir kesme, yüksek öncelikli bir kesme tarafından kesilebilir. Bu ayrı bir mesele.
Başlık: Ynt: enkoderdan yanlış okunan pulse için yardım
Gönderen: bulut_01 - 18 Haziran 2019, 08:37:45
@Tagli hocam dogru ben kapatıp açmamın sebebi gie sıfırlamak onu donanım kendi yapıyor demişin.
Başlık: Ynt: enkoderdan yanlış okunan pulse için yardım
Gönderen: RaMu - 18 Haziran 2019, 11:22:06
Alıntı yapılan: bulut_01 - 18 Haziran 2019, 07:54:22E1now = (PORTB>>2 & 0b00001100);

yerine
 
E1now = (PORTB & 0b00110000); böyle kullansak ne olur?

Bir şey olmaz, yani gerçekten bir şey olmaz,
kod çalışmaz case 0 a gider, en fazla case default a gider.

Kodun olayı enkoderın 2 pininin şu anki ve bir önceki konumlarına ait
bir durum tablosu yapabilmek,
bunuda switch(şuraya) case ... yapacaksak,
şuraya değerleri 0~15 olursa daha okunaklı olur.

case kısmında
0b 0 0 _ _ _ _ 0 0
.....
0b 0 0 _ _ _ _ 0 0

0b 0 0 0 0 0 0 0 0
.....
0b 0 0 1 1 1 1 0 0 gerekli düzenlemeyi yaparsan,
E1now = (PORTB & 0b00110000);
şeklinde kullanabilirsin,
1 2 komut çevrimi de kazanmış olursun, güzel olur
ama öncelikle çalışsın algoritma sonra bunu denersin.
Başlık: Ynt: enkoderdan yanlış okunan pulse için yardım
Gönderen: bulut_01 - 18 Haziran 2019, 11:43:11
case olan port değişkenleri değil mi kısacası b4 b7 kdr olan rb int benim kullandıgı  b4 b5 portları b6 b7 gnd baglı onlar devamlı 0

case 00 00
case 00 10
case 00 01
case 00 11
 şeklinde olmuyacak mı son 3 ve 4 bitler devamlı sıfırda çünkü yanlış mı düşünüyorum?
Başlık: Ynt: enkoderdan yanlış okunan pulse için yardım
Gönderen: RaMu - 18 Haziran 2019, 20:10:56
B4 ve B5 pinlerini kullanıyorsun diye düşünüyorum, doğru mu?
Encoder A - B , B4 - B5 pinlerine bağlı değil mi?
Başlık: Ynt: enkoderdan yanlış okunan pulse için yardım
Gönderen: bulut_01 - 18 Haziran 2019, 20:37:06
doğru
Başlık: Ynt: enkoderdan yanlış okunan pulse için yardım
Gönderen: bulut_01 - 18 Haziran 2019, 20:37:44
yukarda verdiğim örnek yanlış mı
Başlık: Ynt: enkoderdan yanlış okunan pulse için yardım
Gönderen: RaMu - 18 Haziran 2019, 21:19:25
Yanlış.

Encoder A - B PortB B5,B4 e bağlı ise
PORTB register ında 0b XXXX XXXX = 0b X X B5 B4  X X X X
misal B5, B4 pinleri 1,1 geri kalan bitler 0 olsa PORTB = 0b 0011 0000 olur.

case kısmını tüm 8 biti yazarak düşünmelisin,
örnekte üst 4 bit sıfır olduğu için yazılmamış, sadece alt 4 bit yazılmış.
Yazılmasına gerek yok, yazılsa şöyle olurdu ve yine aynı olurdu,
herhangibir sayının soluna istediğin kadar sıfır yazmak gibi yani:
     case 0b00000000:
     case 0b00000101:
     case 0b00001010:
     case 0b00001111:  break;   //..nothing changed
 
     case 0b00000001:
     case 0b00000111:
     case 0b00001110:
     case 0b00001000:  E1position++;
                         break;
 
     case 0b00000100:
     case 0b00000010:
     case 0b00001011:
     case 0b00001101:  E1position--;
                         break;


Verdiğim örnekte case kısmı
alt 4 bite göre yazıldığından,
senin enkoder girişlerin alt 4 bite değer yazacak şekilde değer üretmeli.
Case içindeki "k" değişkeninin
bit3,bit2 kısmına Enkoder B-A son değerleri
bit1,bit0 kısmına Enkoder B-A bir önceki değerleri
yazılacak.
Başlık: Ynt: enkoderdan yanlış okunan pulse için yardım
Gönderen: bulut_01 - 18 Haziran 2019, 21:38:14
eyw üstad deneyelim bakalım sonuç ne olacak.