Geri Saydırma YArdım

Başlatan elektronik_ci, 08 Ekim 2008, 22:16:29

elektronik_ci

s.a. arkadaşlar...sizlerden bi yardım rica ediyorum mümkünse...pic basic proyu yeni yeni öğrenmeye başladım...özellikle ETE hocamın emek harcayarak oluşturduğu PBP eğitim dökümanlarından oldukça faydalandım...kendiside bana yardımcı olursa çok minnettar olurum...sorum şudur:

arkadaşlar ben 4 digitli (soldaki iki digit dakika / sağdaki iki digit saniye) 7 segment displaylerle bir timer devresi yapmak istiyorum..bunla ilgili çalışmalarım oldu fakat takıldığım bir nokta var..oda oluşturduğum sayı değişkenini bir saniye aralıklarla geriye saydrma işlemi...şu ana ortaya çıkan proje çok güzel bir sayıcı oldu!!bir butonla daikka değerini bir butonla saniye değerini artırıyorum..iki digitte 60 olduğunda 0 a dönüyor falan filan...ama tabiki bu yapmak isteğim proje değil...interrupt denedim başaramdım...kodlar şunlar....


trisa=%10000
trisb=%00001111


sayidk var byte
sayisn var byte
birler var byte
onlar var byte
yuzler var byte
binler var byte
a var word
yaz var porta.4
ileridk var portb.1
ilerisn var portb.2
baslat var portb.0
oku var portb.3


sayidk=0
sayisn=0



basla:                                                                                  

if ilerisn=0 then
sayisn=sayisn+1
pause 100
endif
if sayisn=61 then
sayisn=0
sayidk=sayidk+1
endif

if ileridk=0 then
sayidk=sayidk+1
pause 100
endif
if sayidk=61 then sayidk=0

if yaz=0 then
write 0,sayisn
write 1,sayidk
endif

if oku=0 then
read 0,sayisn
read 1,sayidk
endif




birler=sayisn dig 0
onlar=sayisn dig 1
yuzler=sayidk dig 0
binler=sayidk dig 1

portb.4=1
porta=birler
pause 1
portb.4=0
pause 5

portb.5=1
porta=onlar
pause 1
portb.5=0
pause 5


portb.6=1
porta=yuzler
pause 1
portb.6=0
pause 5

portb.7=1
porta=binler
pause 1
portb.7=0
pause 5

goto basla

                                                   

END


evet arkadaşlar bir butonla hafızaya alıp start tuşuna bastığımda en son hafızadaki sayı değerinden itibaren bir saniye araluklarla geriye saydırmak istiyorun..fakat bunu başaramadım...bana en azından bir yön levhası gösterirseniz o yöne giderim...şimdiden yardımlarınız için size çok teşekkürederim...saygılarımla...

mucit07

basic bilmiyom ama bukadarını eger kendin yaptıysan gerisini zaten yaparsın  kolay gelsin

mech

interrupt da basit ama önce şu şekilde çalıştır bence. Kodu programa, araya bu şekilde ekle.
.
.
.
if oku=0 then 
read 0,sayisn 
read 1,sayidk 
endif 

if baslat=0 then   'buton pinlerini +5V'a 4K7 ile çekmeyi unutma.
devam:
if sayisn=0 then high portb.7 'buraya bir led tak
if sayisn>0 then pause 1000 'saniye 0 değilse 1 saniye daha bekle:)
sayisn=sayisn-1
goto devam
endif
.
.
.

ayrıca kullandığın pic 16f628 ya da 16f877 ise başına
adcon1=7 '628'de yok
cmcon=7
yazmalısın. mclr içten değilse 1K ile +5'e vermeyi de unutma. ISIS'te gerek olmayabiliyor.
Bilginin Efendisi Olmak İçin Çalışmanın Kölesi Olmak Şarttır

ete

Kesme örneği benim dersler içinde var idi. Oradan yararlanman mümkün. Ben yinede örneği senin isteğine uygun olarak burada uyarlayayım;
Önce kesme örneğimizi verelim;
PORTA=0:portb=0
TRISB=%00000000   'PortB tamamı çıkış yapıldı.
TRISA=%00000000   'A portu tamamı çıkış yapıldı.
'-----------------------------------------------------------------
@ DEVICE pic16F628                      	     'işlemci 16F628                                
@ DEVICE pic16F628, WDT_OFF              'Watch Dog timer kapalı
@ DEVICE pic16F628, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628, PROTECT_OFF     'Kod Koruma kapalı
@ DEVICE pic16F628, MCLR_off               'MCLR pini kullanılıyor.
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak 
'-----------------------------------------------------------------

'-------------------------------------------------------------------------
ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
OPTION_REG=%10000101   	 'Pull up dirençleri İPTAL- Bölme oranı 1/64.
INTCON=%10100000  		 'Kesmeler aktif ve TMR0 kesmesi aktif
TMR0=0
CMCON=7    			'16F628 de komparatör pinleri iptal hepsi giriş çıkış
'----------------------------------------------------------------------------
SAYAC   VAR   BYTE
SN      VAR   BYTE
DAK     VAR   BYTE
SAAT    VAR   BYTE
GUN     VAR   BYTE
'-----------------------------------------------------------------------------
CLEAR  'tüm değişkenler sıfırlandı
PAUSE 200

'-----------------------------------------------------------------------------
BASLA:
'Bu araya hem buton kontrolünü hem ekran gösterimini koyacaksın.
'Pause komutunu kullanmamaya bak. Kullanmak zorunda kalırsanda 
'döngü kurarak en büyük pauseus  değerini 5 us olarak al ve döngü ile 'gecikmeyi çoğalt.

'Genelde bu tip devrelerde bir anahtar olur ve anahtar =0(default) ise 
'sayac ileri sayar, anahtar=1 ise sayac geri sayar.
'Kesme alt programında kullanılan SN-dak isimli değişkenleri başka yerde 
'kullanma. İleri geri sayma için SAYI_SN ve SAYI_DAK isimli iki ayrı 
'değişken kullan. Tabiiki bunların artması yada eksilmesini kesme 
'kısımında kontrol et örnek orada verilmiştir.
GOTO BASLA

DISABLE
KESME:
      SAYAC=SAYAC+1  	    'kesme sayacı  1 sn= 61(sayac) x 256 (Tmr0) x 64 (bölme)
      IF SAYAC=61 then  	    '61 adet kesme olunca 1 sn. süre geçiyor.(999424 us)
         SAYAC=0       	    'sayaç sıfırlanıyor
         SN=SN+1       	    'saniye değeri bir artırılıyor
         IF ANAHTAR=0 then
            SAYI_SN=SAYI_SN+1
            IF SAYI_SN=60 then
              SAYI_SN=0
               SAYI_DAK=SAYI_DAK+1
            ENDIF
         ELSE
            SAYI_SN=SAYI_SN-1
            IF SAYI_SN=255 THEN 
               SAYI_SN=59
               SAYI_DAK=SAYI_DAK-1
            ENDIF
         ENDIF
          ENDIF
          
            IF SN=60 THEN  	   'saniye 60 olmuş ise 1 dakika süre geçti o halde
               SN=0        	   ' saniye sıfırlanıyor
               DAK=DAK+1   	   ' dakika değeri bir artırılıyor
                  IF DAK=60 THEN   'dakika 60 olmuş ise 1 saat süre geçti
                     DAK=0         	   ' dakika sıfırlanıyor
                     SAAT=SAAT+1   ' saat değeri bir artırılıyor
                        IF SAAT=24 THEN  'saat 24 olmuş ise 1 gün geçti
                           SAAT=0        'saat sıfırlanıyor
                           GUN=GUN+1     'gün değeri bir artırılıyor
                              IF GUN=365 THEN GUN=0  'gün 365 olmuş ise
                        ENDIF                    'gün sıfırlanıyor 1 yıl geçti
                  ENDIF 
            ENDIF
         ENDIF
         INTCON.2=0        'TMR0 Kesme bayrağı sıfırlanıyor
         RESUME
         ENABLE
         
END


Örnekte ilave etmediğim sayı_dak değişkeninin limitlere ulama durumu bunu sana bıraktım.
Artma modunda sayı_dak=60 olmuş ise normalda saat değişkeni artırılmalı ve dak değişknei sıfırlanmalı ama galiba sen yalnızca dakika kullanacaksın.
Aynı şekilde eksiltme modunda ise sayı_dak=255 olmuş ise sayı_dak=0 olması ve saatin de bir eksilmesi gerekir.

Gerisini sen halledersin artık.

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

mustafa_cmbz

bu aralar herkes bomba timer yapma derdinde ne iştir anlamadım .... kolay gelsin...

gulbey84

birazdan tmr0 kesmesini okuyacağım detaylarıyla..lakin ben bo tmr0 kesmesini bir bıtona basarak başlatmnak istiyorum...örneğim rb0 kesmesini düşen kenar yada yükselen kenar şeklinde bir butonla başlatabiliyoruz...aynı şekilde rb4-rb7 change kesmesinide öyle...fakat arkadaşlar ben ete hocamın bana öğrettiği bu tmr0 kesmesini nasıl bir butona basarak başlatacağım...şimdi hocam ben ileridk butonuyla dakikayı 55 e ayarladım...ileri sn butonuylada saniyeyi ayarladım...start yada başlat butonunuda bir out pinine uydfurdum...o butona bastığımda tmr0 kesmesini nasıl başladtırım..

şöyleki

interrupt goto kesme ----- eğer kesme ouşursa şunu yap....

kesmeyi nasıl oluşturmalıyım bir buton ile bunu kavrayamadım!!

emekleriniz için çok sağol lun...bu devreyi yapar isem basit güzel çirkin demicem bilmeyen arkadaşkarla paylaşacağım..

selmetle kalın
HABURDA KARŞILANANLAR YALNIZCA O BEBEK KATİLLERİ,VATAN HAİNLERİ DEĞİLDİ!!AYNI ZAMANDA YALANLAR VE KARANLIKLAR İMPARATORLUĞUNUN YOKOLUŞUNUN KARŞILANMASIYDI! NE MUTLU TÜRKÜM DİYENE

mech

Herhangi bir butona basmana gerek yok. Kesmenin amacı bu zaten ilk başa on interrupt goto kesme deyip intcon,vb register'ları ayarladığın zaman, program çalışırken uzun pause'lar hariç herhangi bir anda kesme oluştuğunda tmr0 bayrağı set olduğunda kesme kendiliğinden oluşuyor(TMR0 kesmesi için), bu bayrağın set olma zamanı kristal saykılları ile oluşuyor(sanırım 256 saykılda). Toplam 61 kesmede(4Mhz için) 1sn geçiyor. Buton kesmesi de benzer şekilde, herhangi bir buton komutu kullanmadan, programın herhangi bir yerinde portb_change ile portb'deki değişikliği algılıyor ve kesme labeline gidiyor. Burada anlıyorsun ki bir butona basılmış. Bu olay çok hızlı olduğundan buton o anda hala basılıktır ve sen artık burda kontrol ediyorsun, hangi buton basılmış diye. Daha bunun gibi bir sürü kesme var, lazım oldukça bulursun, mesela adc değişikliği,seri bilgi girişi(Hserout),vs. Bunlara öncelik sırası da verebiliyorsun(Hangisi daha önemli, aynanda olduğunda gibi).

Start butonuna basılınca saniye=30 diyerek(mesela); 61 kesmede bir saniye=saniye-1 dersin. Ana programda da if saniye = 0 then high portb.0'bir led mesela. dersen 30 saniye geri sayım yapmış olursun.
Bilginin Efendisi Olmak İçin Çalışmanın Kölesi Olmak Şarttır

gulbey84

mech hocam tmr0 kesmesinin nasıl çalışıtğını biraz anlayabildim...ama hala start butonuyla nasıl ilişkilendireceğimi anlayamdım!! siz şunumu demek istiyorsunuz..

intcon yazmcından hem rb4-rb7 kesmesini aktif ediyöm hemde tmr0 kesmesini aktif ediyim..
daha sonra bir butonda değişklik olduğunda kesmeye gitsin ama kesme tmr0 kesmesi olarak çalışcak??? böle bişeymi anlayamadım k..

yani ben sayı değerini ayarladım...ete hocanın verdiği örneğide kavrayıp projemde uyguladım...fakat bu kesmeyi ben bnuıtona basarak nasıl başlatacağım..

bişey okudumda kafam karıştı arkadaşlar..intcon yazmcında 4.bit 0 olursa yükselen kenar diyo yani bu durumda ra4e bir botun bağlayıp o buton ilemi tmr0 kesmesini başlatacağım..vbeni ydınlatırmısınız

saygılarıma


teşekkürederim
HABURDA KARŞILANANLAR YALNIZCA O BEBEK KATİLLERİ,VATAN HAİNLERİ DEĞİLDİ!!AYNI ZAMANDA YALANLAR VE KARANLIKLAR İMPARATORLUĞUNUN YOKOLUŞUNUN KARŞILANMASIYDI! NE MUTLU TÜRKÜM DİYENE

sekoli

Bence şöyle yapmalısın,

Bu tmr0, adı üzerinde interrupt, sürekli çalışıyor zaten. Anladığım kadarı ile yapman gereken tek şey interrupt prosedürünün başına bir if koyarak "interruptı başlatsın" dediğin butonun basılıp basılmadığını kontrol etmek ve istediğin işlemlerin yapılmasını sağlamak.

OG

Alıntı yapılan: "sekoli"
Bu tmr0, adı üzerinde interrupt, sürekli çalışıyor zaten.
TMR0, "interrupt" değil bir "donanımsal sayıcı"dır, diğer ismi ile zamalayıcı. İsmi Timer0. Ancak istenip, gerekli ayarlamalar yapılırsa TMR0'dan kesme elde edilebilir.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

sekoli

Alıntı yapılan: "OG"
Alıntı yapılan: "sekoli"
Bu tmr0, adı üzerinde interrupt, sürekli çalışıyor zaten.
TMR0, "interrupt" değil bir "donanımsal sayıcı"dır, diğer ismi ile zamalayıcı. İsmi Timer0. Ancak istenip, gerekli ayarlamalar yapılırsa TMR0'dan kesme elde edilebilir.

OG hocam haklı, bir kavram karmaşası olmuş. TMR0 bir sayıcıdır. Fakat, sayın OG hocam, arkadaşımızın sorusunu da cevaplarsanız bizi daha da aydınlatmış olursunuz.

ete

TMR0 kesmesini bir butona basarak başlatmak için;
- Önce TMR0 sayacının bölücü oranları  Option Registerinden ayarlanır.
- Global interrupt lar açılır. Yani INTCON.7=1 yapılır (şayet diğer kesmeler açık ise zaten global int ler açık olmak zorundadır). Ama Tmr0 kesmesi henüz açılmaz (INTCON.5=0).
- Tmr0 belirli bir sayıdan saymaya başlayacak ise bu sayı hazırlanır ve
- butona basılır basılmaz hemen ardından Tmr0=sayı ve INTCON.5=1 komutları verilerek kesme sayacı başlatılır. TMR0 değeri 256 ya ulaştığı anda kesme oluşacaktır.
- Tabiiki birden fazla kesme açık ise hanigi kesmenin oluştuğunu anlamak için kesme bayraklarına (flag) bakmak gerekiyor. Tmr0 ın bayrağı INTCON.2 olup bu 1 ise kesme oluşmuş değilse başka kesme oluşmuştur.

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

gulbey84

arkadaşlar yardımlarıız içi çok sağol lun  ;)
HABURDA KARŞILANANLAR YALNIZCA O BEBEK KATİLLERİ,VATAN HAİNLERİ DEĞİLDİ!!AYNI ZAMANDA YALANLAR VE KARANLIKLAR İMPARATORLUĞUNUN YOKOLUŞUNUN KARŞILANMASIYDI! NE MUTLU TÜRKÜM DİYENE

gulbey84

hocalarım birşey dha sormak istiyorum..özellikle ete hocam...

çok güzel bir şekilde bana yardımcı oldunuz...bende projeyi yüzde 80 çalıştırdım..ama bi sorunum daha var hocam...kesmeyi başlatıyoprum...geri sayma olayı mükemmel çalışıyor...kaldiki bütün değerler 00:00 olduğunda amacımızı gerçekleştirip kesmenin durması gerekirken 00:00 danda geriye saymaya devamö ediuyor....bunu saatlerdir inceliyorum fakat yapamadım :S hocam

if sayisn=0 and sayidk=0 then
sayisn=0
sayidk=0
endif
gibi bişey yaptım yinede durmuyo kesme rutini...

bakınız:

disable
gerisay: 'kesme burada başlıyor
sayac=sayac+1
if sayac=61 then
sayac=0
sayi_sn=sayi_sn-1
if sayi_sn=255 then
sayi_sn=59
sayi_dk=sayi_dk-1
(((((buraya ne uydurursam uyduruyim yinede geriye saymayı durduramıyorum!!! )))))

endif
endif
endif
intcon.2=0 ((((hocam acaba bu bölgede mi bi işlem yapmalıyız?????))))
resume
enable
end

yani arkadaşlar ben sayidk ve sayisn değerlerinin ikiside 0 olduğunda (00:00) artık geri sayma olayının son bulmasını ve programın ana döngüsünden itibaren çalışmasını istiyorum fakat işğin içinden çıkamıyorum!!....

saygılarımla
HABURDA KARŞILANANLAR YALNIZCA O BEBEK KATİLLERİ,VATAN HAİNLERİ DEĞİLDİ!!AYNI ZAMANDA YALANLAR VE KARANLIKLAR İMPARATORLUĞUNUN YOKOLUŞUNUN KARŞILANMASIYDI! NE MUTLU TÜRKÜM DİYENE

ete

Timer-0 sayacı durdurulmaz. Devamlı sayar. Sana lazım olunca sayacı sıfırlar ve gerektiği anda sayac değerini başka bir değişkene aktarırsın.
Sayac sayarsa saysın saymaya bağlı olarak kesme oluşmasın istiyor isen INTCON.5=0 yap yada tüm kesmeleri iptal et (INTCON.7=0)
Senin örneğinde ,
If Sayi_sn=0 and Sayi_dak=0 then Intcon.5=0 'artık kesme oluşmaz
if sayi_sn=255 then
sayi_sn=59
sayi_dk=sayi_dk-1

Başkada önereceğim bir şey yok.

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