SLEEP den ilk uyanış için port niçin 2 defa değişim is

Başlatan OG, 14 Nisan 2007, 07:33:45

OG

Arkadaşlar asm ile (süresiz uyuma amacıyla) @sleep komutu verip, wake up port change uygulamak için en alttaki güzel kodu buldum.  

Bu koddaki şu satırın
X = GPIO           ' Take a snap shot of port on boot
ne olduğunu anlayamadım. Bu satırı kaldırınca ilgili port değişimini hissedebilmek için portun (GPIO.3) başlangıçta H veya başlangıçta L olmasının sonucu farkettirdiğini gördüm.

Bu satır kaldırılınca;
port başlangıçta H ise ilk değişimi yani L ye geçişi algılamıyor. Bundan sonra tekrar H gecişi algılıyor. Ve ardından gelen bütün diğer değişimleri algılıyor (wakeup). Yani ilk tuş basılışı kaybolmuş oluyor.

İlgili satır silinmezse bu problem yaşanmıyor. Satırın açıklamasındaki "Take a snap shot of port on boot" cümlesi de bunu söylüyor fakat snapshot yapınca pic için neyin değiştiğini çıkaramadım.

Bu satır kaldırıldığında;

Başlangıç bu şekilde olursa ilk tuş değişiminde sonuç alınamıyor.


Başlangıç bu şekilde olursa ilk tuş değişimi sonuç veriyor.


@	device  pic12F675, intrc_osc_noclkout, wdt_off, mclr_off, protect_on

'DEFINE OSCCAL_1K 1

GIE     VAR INTCON.7  ' Global interrupt enable 1=ON, 0=OFF
GPIE    VAR INTCON.3  ' Port change interrupt enable 1=ON, 0=OFF
GPIF    VAR INTCON.0  ' Port Change Interrupt Flag bit
LED     VAR GPIO.0    ' LED output GND---/\/\/\---|<|--GPIO.0
Key     VAR GPIO.3    ' Key input (10K pull-up w/switch to ground)
X       VAR BYTE      ' G.P.
ANSEL=0               ' 12f629 KULLANILIRSA GEREK YOK
CMCON = 7             ' All digital
GPIO = 0              ' Clear port on boot
TRISIO = %00001000    ' GPIO.3 input, rest outputs

GIE = 0            ' Disable global ints
GPIE = 1           ' Enable port change int
IOC.3 = 1          ' Int-on-change for GPIO.3 enabled
X = GPIO           ' Take a snap shot of port on boot
'Bir üstteki X = GPIO kapatılırsa ve ilk tuş değişimi (GPIO.3) H seviyeden L seviyeye
'geçiş şeklinde olursa pic uyanmıyor. Bir sonraki değişimde yani L'den H'a gecişte 
'işlem yapmaya başlıyor. 
	
Main:

    @ SLEEP            ' SLEEP 
    GPIF = 0           ' Clear port change interrupt flag


     TOGGLE LED        ' Toggle LED

    GOTO Main
    END


Denemek isteyenler için DSN, pbp dosyaları. http://rapidshare.com/files/25893115/sleep.zip.html
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

ete

og,
Port değişiklik kesmelerinin çalışabilmesi için portun bir defa okunması gerekiyor 8 bit olarak. X=GPIO demekle port okunmuş oluyor. Okunan hali hafızada tutuluyor ve portda olabilecek değişiklikler sürekli sleep anında karşılaştırılıyor. Port okuma genelde kesme oluştuğu anda yapılır ikinci değişikliğe zemin hazırlamak için ama burada adam programın başında portu bir defa okutup bir yerde fotoğrafını alıp hafızaya atıyor ve pic süreklı fotoğraf ile mevcut durumu karşılaştırıyor. Değişiklik oluncade sleep den uyanılıyor.
Şimdi X=GPIO komutunu kapatınca, portun durumu hafızaya alınamadığı için sistem normal çalışamıyor. Birinci port değişikliğinde  portun durumunu anlıyor ikincide bunu eskisi ile karşılaştırıyor bana kalırsa.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

OG

Alıntı yapılan: "ete"Port değişiklik kesmelerinin çalışabilmesi için portun bir defa okunması gerekiyor 8 bit olarak.
OK Hocam, altını çizmemiz gereken bu durumu öğrenmiş oldum. Teşekkür ederim. İlk geciş L'den H'a olunca problem olmamasını ise henüz çözemedim.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

omenek

Ete hocamın dediği gibi portun başlangıçta bir kez okunması gerekiyor,eğer okunmamışsa GPIO regi güncellenmediği için başlangıç değeri sıfır oluyor,bu durumda 1 den 0 a geçişi değişiklik olarak algılamıyor.