tmr1 ile enkoder pals sayımı

Başlatan kamoz, 02 Nisan 2009, 13:39:32

kamoz

OPTION_REG=%01101000'timer 0 in kurulumu
TMR0=0 'timer o ın sayıcı degişkeni
T1CON=%00000111
TMR1l=0 'timer1 sayacının low byti
TMR1h=0 'timer1 sayacının low byti
ana:
eksil=TMR1L
position=(position+TMR0)-eksil
TMR0=0
TMR1L=0
TMR1H=0
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
tmr0 ve tmr1'i harici pals ile saydırıyorum.Buraya kadar bir sorun yok lakin enkoderin çıkışını cw ve ccw olarak lojik devre ile ayırdım.Enkoder artırma sinyallerinde tmr0 ı kullnırken mükemmel sayarken.azaltma sinyallerinde tmr1 ile yapılan çıkarma işlemi saglıklı olmuyor.eger displaye direk regisiterleri basarsam degerlerin palslerle ertdıgını görebiliyorum.Sanırım aritmatik işlemlerde bir hatam var.Bilgilerinizi ve yardımlarınızı rica ederim....Hayırlı İşler

debi

Kusura bakma soruna cevap veremeyeceğim, fakat encoderi nerden aldığınızı öğrenebilir miyim? Çoğu yere sormama,bakmama eağmen encoder bulamadım..

stlg

Sevgili debi

Nasıl bir enkoder arıyorsun bu malzemeyi satan okadar cok yer varki hatta bizim sitede bile var

https://www.picproje.org/index.php/topic,24449
ALLAHA EMANET OLUNUZ Hoştur bana senden gelen,  Ya gonca gül yahut diken,  Ya kaftandır yahut kefen,  Kereminde hoş lütfunda hoş.

stlg

Bence cw ve ccw okuma kısmında bir hata var bu girislerdeki bilgiyi okumada bir gecikme olusuyor olabilir
ALLAHA EMANET OLUNUZ Hoştur bana senden gelen,  Ya gonca gül yahut diken,  Ya kaftandır yahut kefen,  Kereminde hoş lütfunda hoş.

alayli

Sevgili kamoz;

Gerek TMR0 ve gerekse TMR1 sayıcısını kesme kullanmaksızın enkoder okumak için kullanırsanız, pals kaçırmanız hemen hemen kaçınılmazdır... Arada yaptığınız matematik işlemleri sırasında kaçırdığınız palsler sayımın hatalı olması sonucunu doğurur. Kesme kullandığınız durumda bile bu ikisini (TMR0 ve TMR1) 12 ve 16 serisi PIC'lerde aynı anda kesmeye sokamazsınız. Hem CW hem de CCW sayım yapacaksanız, size tavsiyem; enkoderin A veya B ucunu rb02'a diğer ucu başka bir pine (en uygunu rb1 olur) girip rb0 kesmesini kullanmanızdır. rb0 kesmesi ile enkoder okumaya dair kod örneklerini forumda aratırsanız bulabilirsiniz.
Anca kazganmiş itmiş ilimiz törümüz erti. Türk Oguz begleri budun esiding. Üze tengri basmasar, asra yir telinmeser, Türk budun, ilingin törüngin kim artati? (udaci erti)

BenC

Alıntı yapılan: "kamoz"OPTION_REG=%01101000'timer 0 in kurulumu
TMR0=0 'timer o ın sayıcı degişkeni
T1CON=%00000111
TMR1l=0 'timer1 sayacının low byti
TMR1h=0 'timer1 sayacının low byti
ana:
eksil=TMR1L
position=(position+TMR0)-eksil
TMR0=0
TMR1L=0
TMR1H=0
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
tmr0 ve tmr1'i harici pals ile saydırıyorum.Buraya kadar bir sorun yok lakin enkoderin çıkışını cw ve ccw olarak lojik devre ile ayırdım.Enkoder artırma sinyallerinde tmr0 ı kullnırken mükemmel sayarken.azaltma sinyallerinde tmr1 ile yapılan çıkarma işlemi saglıklı olmuyor.eger displaye direk regisiterleri basarsam degerlerin palslerle ertdıgını görebiliyorum.Sanırım aritmatik işlemlerde bir hatam var.Bilgilerinizi ve yardımlarınızı rica ederim....Hayırlı İşler

Belki arkadaş sorunu çözmüştür ama yinede cevap vereyim dedim.

Malum şuan rotary encoder ile uğraşıyorum.

Bende ilk olarak burdaki yazılan gibi yaptım.Arkadaşın dediği gibi yukarı sayarken sorun yok aşağı sayarken sağlıklı olmuyordu. Uzun uğraştan sonra hatanın her iki timer modülünü de aynı anda sıfırlamak olduğunu gördüm. Bu şekilde yaptığımız da encoder a ve encoder b değerlerini okuyan timer0 ve timer1 sağlıklı saysada hatalı olan yazılım oluyor.

Kod:
void Hesapla()
	
	{
		YukariSayac = TMR0;
		AsagiSayac  = TMR1L;
		
		

		if (YukariSayac > AsagiSayac)
			{
				Led_Sari = ON;
				Yon = 1;
				DeltaZ =DeltaZ + YukariSayac;  
				TMR0=0;
					
				if ( DeltaZ >= 0x7F7F )
					{
						DeltaZ = 0x0000;
					}

				
			}

		if (AsagiSayac > YukariSayac )
			{
				Led_Yesil = ON;
				Yon = 0;
				DeltaZ =DeltaZ - AsagiSayac;  
				TMR1L =0;
	  			TMR1H =0;

				if ( DeltaZ > 0x7F7F )
					{
						DeltaZ = 0x7F7F;
					}


			}


	}



Yukarıdaki 7F7F kontrolü benim kendi seçimim. Bunu yapmam daki amaç hareketimi belli değerler arasında tutumak. yani sayac 0000 ile 7f7f arasında gidip geliyor.

Rotary Encoder olarak Bourns ENC1J encoder kullanılmıştır. Bu encoderi decode rtmek için ise pic an696 daki decoder devresi kullanılmıştır. Yukarı aşağı sayma için timer0 ve timer1 modülü kullanılmıştır. Burdaki örnek fonksiyon farenin scroll verisini okumak için kullandığım fonksiyon..
ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!