Enkoder okuma iyileştirme

Başlatan ipek, 18 Şubat 2017, 22:24:50

ipek

Elimde bir turda  1024 pulse verebilen optik bir encoder var bununla bir devremin posizyonlamasını yapıyorum normal hızda en ufak bir sorun yok...
hızı artırdığımda skop ile A B çıkışlarına baktığımda artık kare dalga formatı olmaktan çıkıp üçgene benziyor ,hele birde kapasite eklersem hepten pozizyon kaçırıyor,yabancı forumlardan aldığım yönlerdirmelerle MC14490 Bounce Eliminator yada TTL 74121 Single Shot ile yapın dedi ve anında düzeldi,istediğim hıza çıkabiliyorum,
ama içimden bu Bounce Glitch saçmalığını bertaraf edebileceğim kanısı geldi,12F675 ile başladım iki kapı OneShot ile ETE hocamın yardımlarıyla bir yere geldim, tek tek SW' lere basın kusursuz çalışıyor,fakat butonların birini basık tutup diğerine basarsanız sistem ikisini bir birine karıştırıyor ,bağımsız çalışması gerekiyor kesme falan derken kontrolü kaybettim,abuk subuk Gray kodu okuduğum için Step motorumda abuk subuk çalışıyor,önerilerinize açığım...

http://s6.dosya.tc/server8/d6tuwd/Single_Shot.rar.html    isis simulasyon 7.10

@ Device PIC12F675,WDT_OFF,PWRT_ON,PROTECT_OFF, CPD_OFF,MCLR_OFF,BOD_OFF,INTRC_OSC_NOCLKOUT
DEFINE OSC 4
DEFINE OSCCAL_1K 1

TRISIO= %000011 : GPIO= 0 :CMCON= 7 : ANSEL= 0 : OPTION_REG= %00000000
WPU= %00000011 : IOC=%00000011 :INTCON= %10001000' Enable the GPIO port change interrupt 

ON INTERRUPT GOTO Wake_up

Out_1 VAR GPIO.4
Out_2 VAR GPIO.5

Sw_1  VAR GPIO.0
Sw_2  VAR GPIO.1

Temp var byte

X var word
Y var word

Start:
goto Start

DISABLE

    
Wake_up:

IF Sw_1=0 THEN
  Out_1=1 : Pause 150  : Out_1=0
ENDIF

IF Sw_2=0 THEN
  Out_2=1 : Pause 150  : Out_2=0
ENDIF


Main:   
INTCON.0= 0	' Clear the RB port change flag bit
TEMP=GPIO
RESUME : ENABLE
END

Maxim

benzer kodu protonda gerçek interrupt ile baştan yazarsak bence bir sorun kalmayacaktır.

ipek

@Maxim bir fırsat bulduğunda ilgilenirsen sevinirim....

sezgin05

Device 16F877A
Config  HS_OSC,WDT_Off,PWRTE_On,LVP_Off   
Xtal 20
'*************************************
On_Interrupt rotary
Symbol INTF = INTCON.1        ' RB0 External Interrupt Flag
Symbol INTE = INTCON.4        ' RB0 External Interrupt Enable
Symbol GIE  = INTCON.7

'*************************************
TRISA=%00000001
TRISB=%00000011                'I/O ayarlari
TRISC=%00000010
TRISD=%11110010
TRISE=%00000000
Dim     ENCODE      As Word
'*************************************
GoTo over_irq
DelayMS 5
Cls
'**************************************
rotary:
If PORTB.0 = 1 Then
  If PORTB.1 = 1 Then
    Dec ENCODE
    Else                            'Hardware interrupt
    Inc ENCODE
  EndIf
EndIf
INTF=0
Context Restore


over_irq:
GIE  =0
INTE =1
GIE  =1

'***************************************


Stable çalışan bir projemden alıntıdır.

necati

[email]entegreterbiyecisi@yahoo.com[/email]

ipek

Arkadaşlar herhalde benim eksik ifade kullanmamdan kaynaklandı,istediğim enkoder okuma prosedürü değildi, zaten kusursuz çalışan bir devrem var ,hız'ı artırdığım zaman Jitter'ler oluşuyor encoder'in ürettiği A ve B çıkışlarını disipline edebilmek için bir birinden tamamen bağımsız çalışabilen One Shot yada Single Shot'a gereksinimim var,sinyali temizleyebilip çıkışından adam gibi kare dalga alabilmek enkoder tellerini kesip araya bunu girmek istiyorum.

devrem ebay'da bulduğum encoderli step motor devresi .normal çalışıyor fakat yazarı defalarca uyarmama rağmen tii'ye almadı, 2 adet 74LS121 mono stable One Shot'ile kusuru düzeltebiliyorum,kusur şu dönen tepsiyi kapattınız,es kaza encoder 11 yani a'da 1 b'de 1 üretiyor o anda sistem sapıtıp kalıyor,elim ile tepsiyi milim oynatıp kod'u bozuyorum her şey mükemmel,one shot işimi gördüğü için one shot yazmaya çalışıyorum kesmelerde iyi değilim.

12F675 'in tek port için external kesmesi mükemmel çalışıyor,fakat merette bu giriş yalnızca bir tane var, şimdi oraya iki tane F675 koysam banada gülerler.

aslında ETE hoca baya yardımcı oldu ama senkron olmadık anlatamadım hocama tek çip'te iki giriş birbirinden tamamen bağımsız olacak birbirinden etkilenmeyek diye

OG

Alıntı yapılan: ipek - 19 Şubat 2017, 23:08:42
12F675 'in tek port için external kesmesi mükemmel çalışıyor,fakat merette bu giriş yalnızca bir tane var, şimdi oraya iki tane F675 koysam banada gülerler.
Hocam küçük ailelerin çoğunda external kesme 1 adet dir, problem bu ise PORT değişiklik kesmesini (IOC) kullanabilirsiniz.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

ipek

zaten IOC ile kullanıyorum, fakat bir giriş 0'da ise diğer çıkışı da etkiliyor yazılımda kesme kusurunu beceremedim, bunu bir elektronik piyano olarak düşünürseniz polifonik daki plsa nota kendi tuşunu korur komşularını rahatsız etmez mevzu bu. her giriş ve çıkış bağımsız olmalı,istenen giriş 0'ra çekildiğinde
çıkış bir olacak fakat izin verdiğimiz süre ölçüsünde ,switch konum değiştirmediyse o switch uyumaya devam etmelidir ,oysa komşu switch onu uyandırıyor asıl sorun burada,bağımsızlık yok,Pic'akış algoritmasına göre zaten bağımsız olamaz aynı anda tek iş yapar kuralını ihlal etmek istiyorum..

Maxim

#8
ipek hocam bende birşeyler yaptım
birinci girişe 1000hz, ikincisine aynı anda 2000hz veriyorum
birde bağımsız 3. led her yarım saniyede sönüp yanıyor.
(kod proton+ da yazıldı)



Device 12F675
Declare Xtal=4
Config CPD_OFF,CP_ON,BODEN_ON,MCLRE_OFF,PWRTE_ON,WDT_OFF,INTRC_OSC_NOCLKOUT

TRISIO=%00000011
GPIO=%00000000
IOC=%00000011
Declare All_Digital= true

OPTION_REG.7=0
WPU=%00000011
CMCON=7

Symbol SW_1= GPIO.0
Symbol SW_2= GPIO.1
Symbol OUT_1= GPIO.4
Symbol OUT_2= GPIO.5

Symbol GIE = INTCON.7
Symbol GPIE = INTCON.3
Symbol GPIF = INTCON.0

While GIE=1 : GIE=0 : Wend
On_Hardware_Interrupt GoTo Kesme
GPIE=1
GIE=1

Loop:
High GPIO.2:DelayMS 500:Low GPIO.2:DelayMS 500
GoTo Loop

Kesme:
Context Save

If GPIF=1 Then
If SW_1=0 Then OUT_1=1:Else:OUT_1=0
If SW_2=0 Then OUT_2=1:Else:OUT_2=0
EndIf

GPIF = 0
Context Restore


:100000000000000000002F28DF0003088301DE004D
:100010005928A301A200FF30A207031CA307031C59
:100020002B280330A100DF3017200B28A101E83E68
:10003000A000A109FC30031C2028A00703181D28DC
:10004000A0070000A10F1D2820182628A01C2A2880
:1000500000002A2808008313831203130800830179
:1000600003308316850083128501831696009F0155
:1000700007308312990083168113033095000730EF
:10008000831299008B1F46288B1342288B158B17E0
:1000900083160511831205150130A300F4300A20E0
:1000A00083160511831205110130A300F4300A20D4
:1000B00048280B1C652805185F28051660280512BE
:1000C000851864288516652885120B105E08830044
:0800D000DF0E5F0E09006B2832
:02400E00443F2D
:00000001FF

ipek

@Maxim Hocam
bağımsız çalışması çok harika olmuş ,fakat yarı otomatik tüfek gibi düşünürsek ateş ederken tetiğe bastık,kurşun namluyu terkedip gitti,(bu bizim çıkış portumuzun çıkışı High'de tutuma süresi) elimiz hala tetikte,elimizi tetikten kaldırmadığımız halde ilgili çıkış portu high vermeye devam ediyor..

oysa sadece tanımlanmış süre kadar High vermeli (one shot yada single shot mantığı yani tek atış), devamını dört gözle bekliyorum..

Maxim

Alıntı yapılan: ipek - 20 Şubat 2017, 08:18:45
@Maxim Hocam
bağımsız çalışması çok harika olmuş ,fakat yarı otomatik tüfek gibi düşünürsek ateş ederken tetiğe bastık,kurşun namluyu terkedip gitti,(bu bizim çıkış portumuzun çıkışı High'de tutuma süresi) elimiz hala tetikte,elimizi tetikten kaldırmadığımız halde ilgili çıkış portu high vermeye devam ediyor..

oysa sadece tanımlanmış süre kadar High vermeli (one shot yada single shot mantığı yani tek atış), devamını dört gözle bekliyorum..

hımm iş zorlaştı :)
ama bence mümkün, birkaç deneme yapayım

miyago

Merhaba

74Hc14 tarzında bir entegre kullanmanı tavsiye ederim.

bmutlu

@ipek tek kesmeniz var ise aşağıdaki devre ile okuma yapabilirsiniz .bir önceki durumu saklamak kaydıyla yazılımı bu şekilde düşünmelisiniz..


ipek

@ miyago  tek kapı ve ard' arda denedim monostable gibi başarılı değiler, düşük hızda çözüm ,yüksek hızda kararsızlaşıyorlar.ama her zaman
Schmitt Trigger mantığını sevmişimdir...


@bmutlu ben bunu diyot ile denedim başarılı olamadım ,bu kadar IC kullanınca işin espirisi bozuluyor,ama kulağıma küpe olsun yeri gelir lazım olur..

kişişel kartlarım interactive alış verişe açık değil,paypal'de gümledi aslında çok şirin bir ürün buldum ama pes etmek yok....MAX6817

Maxim

şöyle düşünüyorum ama henüz bakamadım
IOC int ile girişleri algılıyoruz bunda sorun yok

ardından timer0 veya timer1 istediğimiz süre boyunca tetikliyoruz
bu süre boyunca çıkışlar highda kalacak, diğer türlü low