Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

Yine kesme sorunu

Başlatan ipek, 27 Ocak 2012, 01:05:13

ipek

yine interupt olayına takıldım
fikir öneri yardım hepsine açığım dostlar.

http://s2.dosya.tc/server6/4H2hCh/12F675_555test.zip.html    bu zip'li hali
http://s2.dosya.tc/server6/4H2hCh/12F675_555test.rar.html    buda rar'lı hali
dsn dosyası mevcut

bir butonumuz var her basışta  15 saniyelik bir çıkış mevcut
bu özellikle One Shot mantığı ile çalışıyor yani butona basılı tutuyorum
15 saniye çıkış verip duruyor bu mantık bana gerekli olan mantık zira buton dediğim
nesne bilyalı bir tilt titreşim switch'i bir kere salladık 15 saniye var buraya kadar bir çözüm buldum
istediğim sallantı devam ettiği sürece çıkış aktif olsun sallantı durunca 15 saniye aktifliğini koruyup
dursun.(not One shot mantığı bilyalı switch için gerekti , zira her salladığmızda ya 1 yada konumunda
kalıyor yani hiç kararlı değil..

'*  Name    : 12F675_555test.BAS               *


DEFINE OSC 4
DEFINE OSCCAL_1K 1

CMCON = 7
ANSEL = 0
TRISIO = %00111100         'GP2-5 Inputs, GP1,0 Outputs
WPU = %00000100            'GP2 Pullup Enabled
GPIO = 0                   'All Ports Low To Start
OPTION_REG = %00000000     ' Internal Pull-ups enabled, Trigger On                
                            '  Falling Edge
INTCON = %10010000          'Enable External Interrupt
X var   word
On Interrupt GoTo pulse    ' Create Interrupt

Main
'    High 0          'Send continuous 5 Hz
'    pause 100        ' 50% duty cycle
    Low 0           ' clock pulse out
    pause 1         ' pin GP0
GoTo Main

' *** Interrupt handler routine ***
Disable
   
pulse:

    High 1            ' Send 250 msec pulse
    For X = 0 To 150  '
   
    pause 100         ' out the GP1 pin   250
    Next
    Low 1
     
INTCON.1 = 0          ' Clear Interrupt flag   
Resume
Enable

OG

Hocam bunun için kesme ile uğraşmanıza gerek yok, 15sn lik döngü kurar ve bu döngü içinde butonun konumuna bakarsınız, butonun basılı olması tekrarlanırsa süreyi sıfırlar.

Device = 12F675 
Config CPD_OFF, CP_ON, BODEN_OFF, MCLRE_OFF, PWRTE_ON, WDT_ON, INTRC_OSC_NOCLKOUT

Xtal = 4
Set_OSCCAL

All_Digital = TRUE  

CMCON = 7
ANSEL = 0
TRISIO = %00111101      
OPTION_REG = %00001111  
WPU = %00000100         				
INTCON = 0       

Dim say As Word

Dim buton As GPIO.2
Dim LED As GPIO.1


GPIO = 0
DelayMS 100     '' cihaza enerjilenince yerleşme süresi verelim
clrwdt  
'''''''''''''''''

Main:
    DelayMS 1
    clrwdt
    If buton = 1 Then Main  '' buton basılmasını bekle

''' Buton basıldı ledi yak
    LED = 1

birak:
    For say = 1 To 15000
        DelayUS 985
        clrwdt
        If buton = 0 Then birak     '' buton basımı tekrarlanırsa süreyi baştan al
    Next

'' süre bitti    
    LED = 0


GoTo Main


:100000001628A101E83EA000A109FC30031C0B2822
:10001000A00703180828A0070000A10F082820182F
:100020001128A01C1528000015280800FF2383169E
:10003000900083120730990083169F019F0183125D
:1000400099008B018F30831681003B30850083122D
:1000500005150130A70040302702031837280F305C
:10006000A100763002206400A70A031D2B28051189
:100070000130A70040302702031846280F30A100A6
:10008000763002206400A70A031D3A282728472853
:02400E000C3F65
:104200000000FF00000000000000000000000000AF
:104210007700770077002E006F00730073006F0047
:1042200065006C0065006B00740072006F006E002A
:1042300069006B002E0063006F006D002E0074009B
:104240007200200031003200460036003700350091
:10425000200066006C006100730068006500720059
:0842600020007600320020006E
:00000001FF
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

ipek

Hızır hocam pardon OG hocam :)

hocam verdiğiniz kod ayrıca işime yarayacak topolojiyi anlayabilmem için

galiba ben'de anlatamadım yada eksik anlattım hocam kod'unuz kusursuz çalışıyor fakat benim istediğim
bu her darbede timer'i resetliyor gayet iyi ,fakat bilyali yada civalı  sensor her zaman aynı konumda durmuyor.
sallıyorum bırakıyorum ya 1 yada 0 konumunda nerede ise random sizin kod'da butona sürekli basık tutarsam
15 saniyelik timer hiç durmuyor kesmeyi o yüzden OneShot mantığı ile çözebilmek için seçmiştim.

CaFFeiNe

#3
akış şeması çizip ona göre yazdım simüle etme şansım yok şu anda malesef


ButonLow = 0
x = 0
LED = 1 'ilk anı darbe kabul edersek kalsın, etmezsek bu satırı silebiliriz
MAIN:
    If ButonLow = 1 Then KONTBUTONLOW 
KONTBUTONHIGH:  'low->high geçişi kontrol et
    If Buton = 0 Then DONGU2 
    ButonLow = 1 'buton basıldı
    GoTo DONGU1
KONTBUTONLOW:  'high->low geçişi kontrol et
    If Buton = 1 Then DONGU2
    ButonLow = 0 'buton bırakıldı
DONGU1:
    x = 0
    LED = 1
DONGU2:
    x = x + 1
    DelayMs 1
    If x < 15000 Then Main
    LED = 0
    x = 0
    GoTo Main


OG

he hey ben anlayamadım gerçekten. Kesme falan niçin hala anlamadım. Isis de counter reset butona bağlanmış, buton basıldıkça resetleme yapılmalı anlamına geliyor gibi.

İlk basış ile one shot süre sayacak ve bu arada süre sayarken butonun durumu ilgilendirmeyecek ise yalnızca şurası değişir ve böyle olur,


birak:
    For say = 1 To 15000
        DelayUS 988
        clrwdt
    Next


Counter RST ucu da butondan ayrılmalı gnd yapılmalı yoksa süreyi eksik gösterir.

:100000002728A301A200FF30A207031CA307031C9B
:1000100023280330A100DF300F200328A101E83E90
:10002000A000A109FC30031C1828A00703181528FC
:10003000A0070000A10F152820181E28A01C2228A8
:100040000000222808008313831203130800FF23F3
:100050008316900083120730990083169F01831244
:10006000990083169F013D3085000F3081000430D8
:1000700095008B01831285016430012064000130FA
:1000800001206400051D45283F2885140130A40087
:10009000A5013A302502031C5328031D5C28993022
:1000A000240203185C280330A100DC300F20640018
:0E00B000A40A0319A50F492885103F285E28D1
:02400E000C3F65
:00000001FF

FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

ipek

OG hocam pazar günü sabrınızı zorlamak istemem.hata benim anlatım tarzında.devreyi
bir top düşünelim topu yuvarlayalım tilt sensor bir sürü saçma sapan 1 yada 0 dizini üretecektir bunu'da bizim trigger switch'i olarak düşünelim topu sağa sola atıp yuvarladığımız sürece topun ortasındaki
Led hep yansın top moment olarak durduğunda ki buda titl sensorunda bilgi gelmediği için 15 saniye daha led yanık kalıp sönsün aslında bu 15 saniye 15 dakika olacak ama orasından vazgeçebilirim for next döngüleri ile oynayıp
yakalamaya çalışırım.yazdığınız kodlar isteğe çok yakın fakat top durduğunda ihtimal yüksek switch olarak tanımladığımız bilyalı sensor 0 konumunda kalıyor bu durumda Led hep yanık
kalıyor devre amacından sapıyor batarya tasarrufu için böyle bir seyi geliştirmek ihtiyacı duydum.

net'ten bulduğum  parçacıklar hep butona basılma prensibi ile çalışıyor bilyalı sensoru el ile sağa sola salladığınızda buton olarak basılmış gibi vazife yapıyor fakat sallantı durduğunda butona hep basıyormuş gibide kalabiliyor sorun burada bu durumda led sürekli yanıyor aslında amatörce çözdüm olay benim yazdığım devre butona bağlı süreyi kısaltım 1 saniye gibi salladıkça 1 saniye çıkış alıyorum tilt'in nerede kaldığını umursamıyor  bunun çıkışını sizin verdiğiniz örneğin girişine bağladım istediğimi tam olarak elde ettim fakat gülünç duruma düşmek istemiyorum...... ;D

OG

Hocam doğru anladı isem siz buton basma değilde buton değişimi dikkate almaya çalışıyorsunuz. Buton değişim kesmesi kullanabilirsiniz ama onun için de kesmeye gerek yok, şöyle, buton konumu değişiyorsa süreyi resetlersiniz.

Device = 12F675 
Config CPD_OFF, CP_ON, BODEN_OFF, MCLRE_OFF, PWRTE_ON, WDT_ON, INTRC_OSC_NOCLKOUT

Xtal = 4
Set_OSCCAL

All_Digital = TRUE  

CMCON = 7
ANSEL = 0
TRISIO = %00111101      
OPTION_REG = %00001111  
WPU = %00000100         				
INTCON = 0       

Dim say As Word
Dim buton_hafiza As Bit

Dim buton As GPIO.2
Dim LED As GPIO.1


GPIO = 0
DelayMS 100     '' cihaza enerjilenince yerleşme süresi verelim
clrwdt  
'''''''''''''''''

buton_hafiza = buton

Main:
    DelayMS 1
    clrwdt
    If buton = buton_hafiza Then Main  '' buton basılmasını bekle
    
    buton_hafiza = buton

'' Buton basıldı ledi yak
    LED = 1

birak:
    For say = 1 To 15000
        DelayUS 968
        clrwdt
        
        If buton <> buton_hafiza Then
            buton_hafiza = buton
            GoTo birak
        EndIf
    Next

'' süre bitti    
    LED = 0
    buton_hafiza = buton
GoTo Main


:100000002728A301A200FF30A207031CA307031C9B
:1000100023280330A100DF300F200328A101E83E90
:10002000A000A109FC30031C1828A00703181528FC
:10003000A0070000A10F152820181E28A01C2228A8
:100040000000222808008313831203130800FF23F3
:100050008316900083120730990083169F01831244
:10006000990083169F013D3085000F3081000430D8
:1000700095008B0183128501643001206400831098
:100080000519831483182614831C261001300120BF
:10009000640003010519013E2618013C031D512887
:1000A000462883100519831483182614831C2610F0
:1000B00085140130A400A5013A302502031C6628EE
:1000C000031D7E289930240203187E280330A100E6
:1000D000C8300F20640003010519013E2618013CB9
:1000E00003197A2883100519831483182614831C96
:1000F00026105928A40A0319A50F5C28851083101F
:100100000519831483182614831C26104628872873
:02400E000C3F65
:00000001FF


Süre 15 sn ye ye göre.

15 dk için (tam süre denenmedi) değerler yaklaşık şöyle verilirse,

birak:
    For say = 1 To 19920
        DelayMS 45
        clrwdt
        
        If buton <> buton_hafiza Then
            buton_hafiza = buton
            GoTo birak
        EndIf
    Next


Bu değerler ile derlenirse,

:100000002728A301A200FF30A207031CA307031C9B
:1000100023280330A100DF300F200328A101E83E90
:10002000A000A109FC30031C1828A00703181528FC
:10003000A0070000A10F152820181E28A01C2228A8
:100040000000222808008313831203130800FF23F3
:100050008316900083120730990083169F01831244
:10006000990083169F013D3085000F3081000430D8
:1000700095008B0183128501643001206400831098
:100080000519831483182614831C261001300120BF
:10009000640003010519013E2618013C031D512887
:1000A000462883100519831483182614831C2610F0
:1000B00085140130A400A5014D302502031C6628DB
:1000C000031D7C28D130240203187C282D30012008
:1000D000640003010519013E2618013C0319782824
:1000E00083100519831483182614831C261059289D
:1000F000A40A0319A50F5C28851083100519831421
:0C01000083182614831C2610462885282E
:02400E000C3F65
:00000001FF
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

CaFFeiNe

CCS kullandığım için ilk gönderdiğim kodları ccs ye çevirip simüle ettim istediğinizi yapıyor, basicten farkı pek yok sadece LED = 1 yerine output_high() vs. gibi değişiklik yaptım
ilk gönderdiğim kodu basicte yazıp simüle edebilirsiniz, basic derleyicim olmadığı için kafadan yazmıştım belki yazım hatası filan yapmışımdır

#include <16F628A.h>
#FUSES XT,PUT,NOBROWNOUT,NOWDT
#use delay(clock=4000000)


void main()
{
  short ButonLow;
  long x;
  
  ButonLow = 0;
  x = 0;
  output_high(PIN_B0); //ilk anı darbe kabul edersek kalsın, etmezsek bu satırı silebiliriz
MAIN:
  If(ButonLow == 1) goto KONTBUTONLOW; 
KONTBUTONHIGH:  //low->high geçişi kontrol et
  If(input(PIN_A0) == 0) goto DONGU2; 
  ButonLow = 1; //buton basıldı
  GoTo DONGU1;
KONTBUTONLOW:  //high->low geçişi kontrol et
  If(input(PIN_A0) == 1) goto DONGU2;
  ButonLow = 0; //buton bırakıldı
DONGU1:
  x = 0;
  output_high(PIN_B0);
DONGU2:
  x = x + 1;
  Delay_Ms(1);
  If(x < 15000) goto Main;
  output_low(PIN_B0);
  x = 0;
  GoTo Main;
}


ipek

OG hocam son yolladığınız kodlar 15 dakika dahil olarak  tam istediğim gibi olmuş klavyenize sağlık. derdini anlatamayan derman bulamazmış röntgenin olmadığı çağlarda
dişi ağrıyan şu mu bu mo o mu der iken ağrıyan dişi bulana kadar bir sıra dişten olurmuş.. ;D

Caffein hocam özletmiştiniz ,ne yalan söyleyeyim protonu bir türlü derleyemedim ama CCSC harika kusursuz çalıştı bende bunu 12F'e uyarlayım bari

hepinize iyi hafta sonları kalın sağlıcakla...