timer ile ileri geri encoder sayma

Başlatan ota, 16 Aralık 2018, 20:11:41

ota

ccs ile pic 18f2550 kullanarak timer'la Incremental encoder okumam lazım enkoderin 2 ucu var bu uçlar A ve B uçları bunu nasıl yapabilirim veya örnek kod verebilirmisiniz ?

ete

İncremantal encoder timer ile okunur ama doğru okunmaz. Sağlıklı okumak için PORTB değişiklik kesmesi ile yada işlemciye bağlı olarak INT0 ve INT1 kesme girişlerine A ve B bağlanarak okunur.
Neden timer ile okumak istediğini açıklarsan belki anlarım maksadını.
Şöyle düşün, Encoderin ne zaman döneceğini bilemezsin. Dönüyor ise A ve B den birisi konum değiştirir. Buda kesme yaratır ve o anda okunarak bir önceki okuma ile karşılaştırılır. Dönüş yönü bulunur ve buna bağlı ne yapılacak ise yapılır.
Timer ile okurken timer sayarken A ve B konum değiştirse ama daha Timer kesmesi oluşmamış ise ne yapacaksın? hiç bir şey elbette. Doğrusu A ve B nin bağlı olduğu pinler üzerinden kesme yaratmasıdır.
Encoder mantığı ise şöyledir. A ve B çıkışları bir birinden 90 derece faz farkı olan iki çıkış verir daima. Bu ikilinin alacağı konumlar şöyledir. %11 %10 %00 %01 Dönüş yönü tespiti için daima iki okuma yapılır (en azından iki) kesme kullanınca
Terse dönüşte ise bu bitler %01 - %00 - %10 ve %11 sırası ile gelir. kesmeden çıkarken okunmuş encoder bitleri eski okuma olarak kayıt edilir. Diyelimki A ve B çıkışları PORTB.6 ve PORTB.7 ya bağlanmış olsun. Programa başlarken
ESKI=(PORTB & %11000000)>>6  şeklinde A ve B bitleri okunur. İşi kolaylaştırmak için okunan değer 6 bit sağa kaydırılır.
Program içinde kesme oluştuğunda KESME içinde bu bitler yeniden okunur.
YENI=(PORTB & %11000000)>>6  şeklinde. Ben bu açıklamayı genel mantık çerçevesinde veriyorum sen CCS  ye çevirirsin artık.

YON, eski nin 0 sıfır nolu biti ile Yeninin 1 nolu bitinin XOR lanması sonucunda bulunur.
Diyelimki ESKI=%11 ve Yenı=% 10 olarak okundu.
O halde yön=1 XOR 1=0 şeklinde olacaktır.
Encoder tersine dönse idi bu bitler ESKI=10 ve yeni=%00 şeklinde okunacak idi. O zamanda Yon=0 XOR 0=1 şeklinde hesaplanacak idi.
Böylece YON=1 ise encoder saat yönünde 0 ise tersi yönde dönüyor diyebilirsin.
Buna bağlı olarak neyi artırıp eksilteceksen onu yapıp kesmeden çıkmadan önce de,
ESKI=YENI deyip kesmeden çıkacaksın.
Böylece en son okunan değiştiği anda yenidenkesme oluşacaktır. Tabiiki kesmeden çıkmadan önce kesme bayrağınıda sıfırlamak gerekiyor.

Hepsi bu kadar.
Ete

ota

#2
Timer ile okumak istememin sebebi pcb böyle tasarlandıgı için timer ile okumam gerekiyor.

ete

Bende timer ile okunmaz yada okunur ama istediğin gibi çalışmaz diyorum. Sebebinide açıkladım zaten.

Ete

Powered by EzPortal