Kapı zili sorunu

Başlatan ipek, 22 Nisan 2011, 00:54:43

ipek


http://hotfile.com/dl/115349552/272bbf7/Ding_dong.rar.html

bir kapı zili yapmam istendi   , GP4 button  GP0 Logic Fet ile Dingdong'a Bağlı, GP1'de uyarı ledi var
sistem kısaca zil butonuna bir kez basıldı GP0 10 kez ding dong yaptı (gürültülü ortam) ve biri geldi kapıda biri varmış zil'e
basıp gitmiş bunuda GP1'e bağlı led sürekli yanık kalıp bize bilgi veriyor bunun uyarı aldığında yanıp sönmesini isterdim nafile beceremedim.
şimdi sistem pille çalıştığı için beklenen işlem uyku moduna giriyor buraya kadar her şey normal çalışıyor, fakat mclr'ye koyduğum butonla resetliyorum 10 kerede 5 kex uyarı ledi
çalışır durumda başlıyor, isiste sıkıntı yok pcb'ye kurulan devre böyle hatalı davranıyor

ikinci sıkıntım ise basic'te kesmelerden anlamadığım için boşta kalan GP5 portuna'da bir led koyayım 2 saniyede bir 500ms'lik yansın sönsün en azından pil bitmişmi gözlemleyebileyim.
anlayacağım kadarı ile önerilerinize açığım sağlıcakla.........

Code

'A change from Vdd to Vss on GPIO.4 will cause the 12F675 to wake up
'It will then blink a LED times and go back to sleep
'Front end setup

@ Device PIC12F675,WDT_OFF,PWRT_ON,PROTECT_OFF,MCLR_OFF,BOD_OFF',INTRC_OSC_NOCLKOUT
'sets configuration [12F683]

TRISIO=%010000    'sets GPIO.3 and GPIO.4 as inputs and all others as outputs (or %00010000)
CMCON=%0000111
'CMCON=7            'turns off comparator function [CMCON0=7]
ADCON0=0           'no ADC - doesn't seem necessary but may be a good idea
ANSEL=0            'no ADC input - IMPORTANT if using ports in digital mode
VRCON=0            'turns off voltage reference to minimize sleep current
INTCON=8           'Enables port change interrupt ie GPIE
IOCB=%00010000   '16 sets GPIO.4 for Interrupt on change [IOC=16]
OPTION_REG.6=0    'INT on falling edge
OPTION_REG.7=0    '00000000 WPU enabled,
WPU=%00010000 '16 '00000000 = 38 set unused ports 1,2 and 5 tied to weak pull-up resistors
gpio=0
'Define Variables
wakeup VAR GPIO.4 'input, interrupt on change.
LED VAR GPIO.0    'LED output
Alarm VAR GPIO.1  'LED output
x VAR BYTE

'Initial settings
LED=0
Alarm=0
'Program
Begin:
INTCON.0=0
Pause 100
@ Sleep
Pause 100
For x= 1 TO 10
LED=1
Pause 1000
LED=0
Pause 1000
Next x
Alarm=1

GoTo begin

End

ete

Tecrübelerime dayanarak söyleyebleceğim bir kaç kusur görüyorum.
Birincisi Pic ilk çalışırmada registerlerin yerleştirilmesi için biraz gecikme ister.
Öyle hemen program ksımına geçmeniz yanlış olur ve bu tür durumlarda pic genelde rastgele çalışır.
Bu nedenle BAsla (begin) satırından evvel ortalama 300 ms lik bir gecikme koymanızda yarar vardır.
Bu açılış yada kendine gelme süresi genelde data sheetlerde yazlıdır. AMa 300 ms nin yeterli olacağını düşünüyorum.

Bu verilen programda ASM modunda Pic uykuya sokulmaktadır. Bu moddan ancak bir harici kesme ile çıkılabilir.
Programda portB değişiklik kesmesi açılmış ama programa kesme oluştuğunda nereye gitmesi ve orada ne yapması gerektiği söylenmemiş.
Asıl eksiklik burada sanırım. Kesme oluştuğu zaman program uykudan uyanacak ve kesme etiketine gidip orada belirtilen işleri yaptıktan sonra kesme bayrağını sıfırlayacak ve geri dönecektir. Sizde muhtemelen kesme oluşunca program bir yere gidiyor ve kesme bayrağı set edilmiş kaldığı için aynı işi bir daha yapamıyordur.

Diğer bir kusurda kesme kullanılan programlarda büyük gecikmelere yer verilmemesi gerektiğidir. Programda Pause 1000 şeklinde 2 tane komut var ve bu komutlar büyük ölçüde sağlıklı kesme oluşmasını etkilerler.
Bu komutlar yerine
FOR Z=0 to 10000
   pauseus 5
next
şeklinde bir alt program düzenleyip pici oraya yönlendirmeniz uygun olacaktır. Böylece kesme oluşması için gerekli süre 5us ye ye düşürülmüş olacaktır.

Hepsi bu kadar. Bu ksuurları düzeltebilirseniz yapıp deneyin değilse yeniden haber verin eksikleri tamamlayayım.

Ete

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

ipek

hocam Begin '!den sonra 500ms verince sorun çözüldü
diğer iki beceremediğim konuya yorum yapabilirmisiniz

GP1'e bağlı led sürekli yanık kalıp bize bilgi veriyor bunun uyarı aldığında yanıp sönmesini isterdim nafile beceremedim.

GP5 portuna'da bir led koyayım 2 saniyede bir 500ms'lik yansın sönsün en azından pil bitmişmi gözlemleyebileyim

ve ısrarla küçük bir örnek istiyorum bir sürü asm hatası alıyorum compile seçeneğinden asembleri kapatınca düzeliyor saygılar..