takıldım yardım :D

Başlatan mustafa_cmbz, 30 Ağustos 2007, 18:13:45

mustafa_cmbz

arkadaşlar benım bir projem var başka konudada belirtmiştim su mıcro dalga fırınlarda olduğu gibi  bende zaman ayarlı havya yapıcam :D

onun için 2-3 zaman seceneği olan bir menu tasarlamak isityorum fakat nerde yanlış yapıyorum neden yanlış yapıyorum anlamış değilim...daha öncede sordum kımse cvp vermedı... şimdik ben nette bir devre buldum gecıkmeyi su kodla sağlamayı düşünüyoru ama nasıl olucak bilmiyorum veya  örnek kod verbilecek olan varsa cok sevınırım bende böylelikle kesmeleri öğrenmiş olurum....

kod:

DISABLE
KESME:
SAYAC=SAYAC+1
IF SAYAC=1 then
SAYAC=0
salise=salise+1
IF salise=100 THEN
salise=0
saniye=saniye+1

IF saniye=10 THEN
HIGH PORTA.1
IF saniye=60 then
saniye=0
dakika=dakika+1
IF dakika=60 THEN
dakika=0
saat=saat+1
IF saat=99 THEN saat=0
ENDIF
ENDIF
ENDIF
ENDIF

INTCON.2=0
RESUME
ENABLE

END



şimdik yapmak istediğimi ayrıntılı anlatım:

şimdi 3 tane buton olsa bu butonlara up set down adlarını versek ve up tuşuna bastığımızda 1 artsa down tusuna bastığımızda 1 eksilse uraya kadar sorun yok diyelim fakat ben surda takılıyorum diyelim 20 kez up tusuna bastım 20dk ya geldim set tusuna bastım ve saymaya başladı ve ayarladığımız süreye gelince  röle aktif olucak ve sistem kapanacak...
fakat bunu nasıl yapacağımı bılmıyorum up veya down tuşuyla yaptığımız ayarlamayı ledle takıp etcez butonlara basığımızda led 1kez yanıp sönucek..bunu nasıl yapabilrim....verdiğim kodla değilde baska bir yöntem bilen varsa lütfen paylaşsın bişeyler öğrenim....

ve birşey daha kemseleri nasıl aktif edicez onu çok merka ediyorum mesela kesme şöyle mı olucak

ıf buton=1 then kesme

böyle olduğunda kesme aktıf mı oluyor ?
ve birşeydaha 2-3 tane kesme komutu oluştrusa bunları butolaın komutlarına göre aktif edebilimiyiz öyle olursa prgramın basına nasıl yazıcaz yanı kesme olduğunda suraya git diyorya onu programa hangı kesme etiketine gideceğini nasıl açıklıcaz ?

lordtorm

tüm kesmeleri acmak için ıntcon gie bitini set etmen gerekiyo kullanıdıgın kesmeye gore ıntcon registerından gerekli biti set etmelisin kullandıgın picin datasheetinden bakabilirsin.
buton konturolunu da:

ıf porta.1=1 then goto ledyak
ledyak:
high portb.1
pause 500
low portb.1

seklinde yapabilirsin,kullandıgın kesmenin bayraklarını kontrol ederek hangi kesmede nereye gidecegini soyleyebilirsin,kesme bayraklarını datasheetten bakıp bulabilirsin
bırakayım diyorum bu işleri

picusta

PicBasic'ten anlamam ama verdigin kodda hatalar var gibi.
Alıntı YapIF saniye=10 THEN
HIGH PORTA.1
Bunun sonuna ENDIF koymalisin, yoksa dakikalar artmaz, saniyeler 255'te bir sifirlanir.
Yazmak istedigin program tam olarak ne yapmasini bilmen çok önemli, bunun için önce kagit kalemle zaman diyagrami, akis diyagrami vs.. çiz, gerisi çorap sökügü gibi gelir.
Kesmeleri anlaman çok önemli, eminim birçok faydali örnek bulabilirsin.
Kesme ile rutin çagirmayi birbirine karistirma. Kesmenin aktif edilip edilmemesi de ayri bir konu.

mustafa_cmbz

Alıntı yapılan: "lordtorm"tüm kesmeleri acmak için ıntcon gie bitini set etmen gerekiyo kullanıdıgın kesmeye gore ıntcon registerından gerekli biti set etmelisin kullandıgın picin datasheetinden bakabilirsin.
buton konturolunu da:

ıf porta.1=1 then goto ledyak
ledyak:
high portb.1
pause 500
low portb.1

seklinde yapabilirsin,kullandıgın kesmenin bayraklarını kontrol ederek hangi kesmede nereye gidecegini soyleyebilirsin,kesme bayraklarını datasheetten bakıp bulabilirsin


kusra bakma kullanacağım pic 16f628, aklıma bişey takıldı su kesmeyi nasıl aktif etcez mesela picte portb.0 bu 1 olduğunda kesme gerçekleşiyormu :D onu anlamadım ?  yada herhangı bır pın olurmu yoksa benım dediğim gibi programı o etikete gönderdiğimizde kesme gerçekleşirmi kusra bakamyın bu kesmeler aklımı baya bir karıştırdı...

mika

Picbasic ile kesme ve timer kullanımı için basit bir örnek veriyorum.
Arkadaşların da belirttiği gibi kullandığınız PIC için register komutlarını
dökümanlarından bulup değiştirmeniz gerekiyor.

program, 1-255 dakika arasında PORTA.3 çıkışını açar, aynı süre sonunda kapatır. (programda yazım ve mantık hataları olabilir, ama yapmak istediğiniz konuda size bir fikir verir sanırım)

Kolay gelsin...



@ DEVICE pic16F88, HS_OSC, WDT_on, pwrt_on, lvp_off, MCLR_ON

FLAGS=0
DEFINE OSC 20            

TRISA      = %00000111
TRISB      = %00000100
PORTA      = 0
PORTB      = 0

ANSEL            = %00000000       ' Bütün portlar Digital
OPTION_REG  = %11010111       ' pull-up kapalı, 1:256 TMR0
INTCON         = %10100000       ' TMR0 interrupt açık
CMCON          = 7


BTN_UP   VAR PORTA.0
BTN_DN   VAR PORTA.1
BTN_SET   VAR PORTA.2

saniye     VAR BYTE
dakika     VAR BYTE
gecikme  VAR BYTE
B0          VAR BYTE
B1          VAR BYTE
B2          VAR BYTE


gecikme = 0
saniye    = 0
dakika    =0

'timer interrupt
On Interrupt Goto KESME  

'*********************************
'*         Ana Program
'*********************************
main:
      ' buton kontrolü ve diğer işlemler bu döngüde yapılacak!

      if ( dakika >= gecikme) then    
           dakika = 0
           toggle PORTA.3          
      endif      

      button BTN_UP, 1, 255, 1, B0, 1, up_btn
      button BTN_DN, 1, 255, 1, B1, 1, dn_btn      
      button BTN_SET, 1, 255, 1, B2, 1, set_btn      
     
      goto main


up_btn:
      if (gecikme < 255) then gecikme = gecikme + 1
      goto main

dn_btn:
      if (gecikme > 1) then gecikme = gecikme - 1
      goto main

set_btn:
      dakika = 0
      goto main



'******* Interrupt **********
disable                          
KESME:
        tick = tick + 1    
        If (tick < 76) Then KESME_Cik  '76 * 13,107ms ~ 1sn
        tick = 0
        saniye = saniye + 1
       
        if (saniye > 59) then
           saniye = 0
          dakika = dakika + 1
        endif  
     

KESME_Cik :
      INTCON.2 = 0    'Timer Interrupt bayrağını sıfırla
      Resume
      End      
end

mustafa_cmbz

http://www.datasheetcatalog.com/datasheets_pdf/1/6/F/6/16F628.shtml

arkadaşlar 16f628 in datasheetını buldum fakat asm üzerine örnekler verilmiş datasheet'ten bişey anlamadım eğer yardım olursanız sevinirim..


bu arada yapmak istedeğim şey şöyle :


mesela 3 tane buton olucak ve birde lcd olsun ve pic'e menu oluşturcaz mesela menu1,menu2 diye bu menulerde zaman secenekleri olucak mesela 1. menude 10dk seceneği olucak diyelimki set tusuyla bu menu onaylandı işte bundan sonrasının nasıl olacağını bılmıyorum artık her menuye ayrı ayrı kesme oluşturup, ıf ile şart oluşturup  o değere geldiğinde cıkış aktifmi olucak yoksa tek kesme etiketi ile bu sectiğimiz zaman değerine geldiğinde mı çıkış aktıf olucak bilmiyorum çünki daha mantığını kavramış değilim..... ama yapmak istediğim devre nette bir ara bir saat devresi vardı biliyorsunuz dur belkide 1den fazla alarm seceneği olan saat gibi ama sadece 5-10 menuden 1 zaman değeri girilecek veya secilecek  ve ozamana ulaştığında cıkış 1 olucak ve sistem kapanacak (röle ile ters kontak bağlıcam yanlış anlaşılma olmasın) ve ne zaman reset tusna basılırsa geriye dönecek,yine saat olarak düşünürsek alarmı kurmaya dönücek. deneme asamasında lcd kullancam daha sonra lcd yı çıkartıp sistemın işleyişini ledler ile takıp etmek isityorum fazla maliyeti artmasın diye...

ete hocam bir el at ne olursun kesmeler kestı benı :D

lordtorm

sadece acılma kapanma sürelerini kontrol edeceksen hiç picle ugrasma zman rölesi ve termostat kullanarak yap. illaki pic diyorsan sıcaklık kontrollu yapalım ben olabildim kadar yardımca olmak isterim.zamanlama kısmına gelince mika arkadasımızın verdigi kod işini cozuyor galiba
bırakayım diyorum bu işleri

mustafa_cmbz

@ DEVICE pic16F628, HS_OSC, WDT_on, pwrt_on, lvp_off, MCLR_ON
FLAGS=0
DEFINE OSC 20

TRISA = %00000111
TRISB = %00000100
PORTA = 0
PORTB = 0
ANSEL = %00000000 ' Bütün portlar Digital
OPTION_REG = %11010111 ' pull-up kapalı, 1:256 TMR0
INTCON = %10100000 ' TMR0 interrupt açık
CMCON = 7


BTN_UP VAR PORTA.0
BTN_DN VAR PORTA.1
BTN_SET VAR PORTA.2

saniye VAR BYTE
dakika VAR BYTE
gecikme VAR BYTE
B0 VAR BYTE
B1 VAR BYTE
B2 VAR BYTE


gecikme = 0
saniye = 0
dakika =0

'timer interrupt
On Interrupt Goto KESME

'*********************************
'* Ana Program
'*********************************
main:
' buton kontrolü ve diğer işlemler bu döngüde yapılacak!

if ( dakika >= gecikme) then
dakika = 0
toggle PORTA.3
endif

button BTN_UP, 1, 255, 1, B0, 1, up_btn
button BTN_DN, 1, 255, 1, B1, 1, dn_btn
button BTN_SET, 1, 255, 1, B2, 1, set_btn


goto main


up_btn:
if (gecikme < 255) then gecikme = gecikme + 1
goto main

dn_btn:
if (gecikme > 1) then gecikme = gecikme - 1
goto main

set_btn:
dakika = 0
goto main




'******* Interrupt **********
disable
KESME:
tick = tick + 1
If (tick < 76) Then KESME_Cik '76 * 13,107ms ~ 1sn
tick = 0
saniye = saniye + 1

if (saniye > 59) then
saniye = 0
dakika = dakika + 1
endif


KESME_Cik :
INTCON.2 = 0 'Timer Interrupt bayrağını sıfırla
Resume
End
end


ARKADASIM bu kodlarda bazı yerler var takıldığım button komut mesela bunları anlatırmısın ve programda 2-3 yerde eksikler var mesela gecikme için butonlardan değer giriliyor fakat bu değerleri kesmede nasıl geçiktircez? zaten en öenmlisi o onu çözdümü gerisi kolay tuşlar felan tamam da ama gerisi mesele :D

KESME NASIL BAŞLATILIYOR YANI KESME ADLI ETİKETE NASIL GİDİLİYOR DEVRE ENERJİ ALDIĞINDA MI DİREKT OTOMATIK DEVREYE GİRİYOR ANLAMADIM BİRAZ AÇIKLARSANIZ KAFAMIN KARIŞIKLIĞI GİDERİLCEK......


bir şey daha misal

hani bir zamanlayıcı vardı ana programdan bagımsız çalışan tmr0'dı galiba şimdi mesela onu kullansak ve şöyle yazsak o sayarken...

ana programdan da misal degişken 10dk geldiyse sunu yapsın 20dk geldiyse sunu yapsın...bunu nasıl yaptırabılrız...bu tımer kesme zamanlayıcı konularında bişey bilmiyorum komutları bile yabancı kalıyor eğer benım anlıcam gibi anlatabilrisnız çok sevinirim....bu yöntem daha kolay gibi geliyor...

ve bunu yaparken mesela sayıcıyı takip etmek için bir kod yazmamız gerekiyormu yoksa ana menuye sadece ıf'lı sart kurmamız yeterlimi?

lordtorm

kesme(ınterrupt) ana programdan bagımsız gerceklesir.her kesmenin kendine ait bir bayragı(carry) vardır.ana program esnasında kesme bayragını kontrol ettirip baska bir programa dallana bilirsin.tmr0 kesmesi tmr0 sayıcısının 255 ten 0'a gectigi anda ilgili bayragın 1 olması demektir.
bu bayragın kac defa bir oldugunu sayarsan gecen süreyi hesaplıya bilirsin
yani:

basla:
ıf ıntcon.2=1 then sayac=sayac+1

ıf sayac=100 then goto ledyak
goto basla
ledyak:
high portb.1

dersen senin ayarladıgın süre sonunda led yanacaktır.
buton kesmelerine gelince portb.0'a uygulanan bir kare dalganın bir oldugunda yada sıfır oldugunda ilgili bayrak bir olur yada portb.4,5,6,7 pinlerinden birisinin durumu degiştiginde ilgili bayrak bir olur.kullandıgın picin data sheetinden tmr0 ın sayma sürelerine baka bilirsin
altas yayıncılıktan kendine devamlı kullandıgın picle ilgili bir kitap alırsan daha iyi olur.ve hala soylüyorum yapacaksan ısı ayarlı yapalım ben ugrasmaya basladım.
bırakayım diyorum bu işleri

mustafa_cmbz

haklısın hocam dediğin gibi ısı ayarlı yapalım bu daha iyi olucak ben aslında bu uygulamayı unutkan olduğum için yapmak isiyordum..mesela bazen havyayı fişte felan bırakıyorum daha doğrusu unutuyorum  onun için  hem havya hasat oluyor hem elektrık yiyor...


aklıma bişey geldi hanı su mınık havyalar var içinde ısı sensörüde var hanı su kablosu ince olanlar ve jakı su eskı tip klavyelere benzeyenler,o soketin ayak bağlantılarını bulabilirsek çok süper olur hem ısı ayarlı havya yaparız hemde zaman fonksiyonunu koyarız :D ben pause komutuyla nasıl uzun süre zamanlama yapılacağını buldum eğer sende yardım edersen ortak böyle bir proje yapalım mı...

proje hakkında fikirlerim...

mesela  bir pot ile ısı eşik değerini ayarlarız , devrede 1 led olur ve bu led ayarladığımız sıcaklığa geldiğinde yanıp sönmeye başlar ve havyanın kullanıma hazır olduğunu gösterir...daha mesela zaman gecikemsi içinde bir fikrim var mesela bunun için kesmeye de gerek yok nasıl olsa hassas olmasına gerek yok pause ile bir döngü kurar ve havyayı koyduğumuz yerde optık sensör koyar ve bu sensör belli bir süre devamlı 1veya 0 alırsa swclerle belirlenene sure kadar sonra havyanın elektrığı kesılır :D

fakat aklıma takılan bir şey var  benım çalıştığım yerdekı havya böyleydi fakat güç sistemini bilmiyorum yanı şöyle söyliyim belirlenen ısının üstüne çıkıldığında elektrık kesılıyor ve ısı düştüğünde tekrar açılıyormu yoksa kare dalga ilemi ısı değeri ayarlanıyor buna pwm mu denıyordu sanırsam havyanın ayak bağlantısını bulduğumuzda sorun çözülecek benı msn e ekle hızlıdan projeye başlayalım payalştıklarımızı yine buraya koyarız başaklarıda faydalanır çünki zamanım az o yüzden :D

kolay gelsin

msn kefensiz_50@hotmail.com  ben senı ekledim