enkoderdan yanlış okunan pulse için yardım

Başlatan bulut_01, 16 Haziran 2019, 12:54:30

RaMu

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.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

bulut_01

yön bilgisi için baska nasıl algoritma önerirsin rda içini düzenlerim.
YENİLMEZ..

bulut_01

kesme içinde kapa aç neden yapmamalıyım?
YENİLMEZ..

RaMu

#18
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.aspx
E1now = (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.


Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

bulut_01

swich case yöntemide mantıklı deneyecegim rda düzenlicem sonuç yine yazarım @RaMu  tşk ederim üstad.
YENİLMEZ..

bulut_01

E1now = (PORTB>>2 & 0b00001100);

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

Tagli

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.
Gökçe Tağlıoğlu

bulut_01

@Tagli hocam dogru ben kapatıp açmamın sebebi gie sıfırlamak onu donanım kendi yapıyor demişin.
YENİLMEZ..

RaMu

#23
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.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

bulut_01

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?
YENİLMEZ..

RaMu

B4 ve B5 pinlerini kullanıyorsun diye düşünüyorum, doğru mu?
Encoder A - B , B4 - B5 pinlerine bağlı değil mi?
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

bulut_01

YENİLMEZ..

bulut_01

YENİLMEZ..

RaMu

#28
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.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

bulut_01

eyw üstad deneyelim bakalım sonuç ne olacak.
YENİLMEZ..