PİC i uyutmak ve uykusundan çıkarmak

Başlatan . Kağan, 16 Mart 2014, 21:16:18

. Kağan

Bir PİC i belirlenen pini uyarılmayınca uyutmak ve uykudan çıkarmak nasıl yapılır.

ete

Uykuya sokma iki şekilde yapılıyor.
Birinci şekilde basic komutunolan sleep  süre. Şeklinde bir komut kullanılıyor. Süre birim olarak saniye cinsinden verilir. Sistem komutu görünce  uykuya girer ve verilen süre sonunda otomatik uyanır.
İkinci şekilde ASM komutu olan @Sleep şeklinde komut kullanılır. Sistem komutu görünce uykuya girer ve ancak bir kesme oluşursa uykudan çıkar.

Ete

. Kağan

#2
Sayın ETE, bir forumda şöyle demişsiniz.
Alıntı YapŞayet pic'i sleep moduna sokup bir tuşa basıldığında bu moddan çıkarmak isterseniz ASM olarak sleep komutunu kullanmanız gerekir. (@ Sleep Şeklinde).

Bu durumda da sleep mod dan ancak PortB4-PortB7 tuşlarından birisine basılarak (PORTB.4-B7 kesmesi) çıkılabilir. Bu iş için PortB.4-B.7 pinleri giriş olarak yönlendirilmeli ve PortB değişiklik kesmesi açılmalıdır. PortB4-B7 tuşlarından hangi birisi çıkış olursa bu sistem çalışmayacaktır.

Ete

Ben PIC 16F675 kullanıyorum. datasheette GP2 pininin external interrupt olduğu yazıyor. Bu durumda pici GP2 ucundan uyararakmı @SLEEP komutundan uyandırmam gerekiyor.

Kesmeyi nasıl kurarım

Örneğin aşağıdaki örnek kodda bu komutu nasıl kullanırım.

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : KAGAN AYANOGLU                                    *
'*  Notice  : Copyright (c) 2014 SERBEST                        *
'*          : All Rights Reserved                               *
'*  Date    : 11.3.2014                                         *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

' Description : PICBASIC PRO program to blink an LED connected
' to GPIO.0 about once a second
'
@ __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _MCLRE_OFF & _CP_OFF

Define OSCCAL_1K 1  ' Calibrate internal oscillator
DEFINE OSC 4
DEFINE ADC_BITS    10           
DEFINE ADC_CLOC   3           
DEFINE ADC_SAMPLEUS  100

   LED Con 0     ' Alias GPIO.0 to LED

   ANSEL = 0     ' Set all digital
   CMCON = 7     ' Analog comparators off

mainloop:
   Low LED       ' Turn on LED connected to GPIO.0
   Pause 500     ' Delay for .5 seconds
   High LED      ' Turn off LED connected to GPIO.0
   Pause 500     ' Delay for .5 seconds

   Goto mainloop ' Go back to mainloop and blink LED forever

   End

ete

Data sheeti açıp Intcon registeri incelersen bütün aradıkların tek bir registerde.
Örnekler derslerde.

Ete

Mucit23

Kağan bey portb değişiklik kesmesi kullandığınız mcu da yok. Siz dış kesme kullanmanız gerekiyor. Sizdeki MCU da dış kesme tetikleme pini GP2. Datasheete baktım, dış kesme için bu mcu ya özel bir ayar yok. 16F Serisi MCU lar ile aynı görünüyor.

Sadece aynı pinde hem adc hemde comparator olduğu için GP2 nin Ansel registerinden dijital giriş yapıp comparatörü de kapatmak gerekiyormuş.

Datasheet Sayfa 65, 9.4.1 GP2/INT INTERRUPT
Alıntı YapExternal interrupt on GP2/INT pin is edge-triggered;
either rising if INTEDG bit (OPTION<6>) is set, of
falling, if INTEDG bit is clear. When a valid edge
appears on the GP2/INT pin, the INTF bit
(INTCON<1>) is set. This interrupt can be disabled by
clearing the INTE control bit (INTCON<4>). The INTF
bit must be cleared in software in the Interrupt Service
Routine before re-enabling this interrupt. The GP2/INT
interrupt can wake-up the processor from SLEEP if the
INTE bit was set prior to going into SLEEP. The status
of the GIE bit decides whether or not the processor
branches to the interrupt vector following wake-up. See
Section 9.7 for details on SLEEP and Figure 9-13 for
timing of wake-up from SLEEP through GP2/INT
interrupt.

Ete hocanın 6 nolu ders notlarına bakın.

Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

. Kağan

@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _CP_OFF

DEFINE OSCCAL_1K 1 
DEFINE OSC 4
DEFINE ADC_BITS    10           
DEFINE ADC_CLOC   3           
DEFINE ADC_SAMPLEUS  100 

CMCON = 7             'TÜM PORTLAR DİGİTALE ÇEVRİLİR.
ANSEL = 0
ADCON0 = %10000000   
TRISIO = %00000110
REM       GPI43210
WPU = 0


intcon.7=0 'Global kesmeleri kapat
intcon.3=1 'set RB change int on
intcon.0=0 'clear RB change flag
asm
@sleep
endasm


Gibi bir kod çalışırmı acaba?

Mucit23

Yalandan iki satır birşeyler yazıp "Bu kod çalışırmı?" diye soru sormanıza anlam veremiyorum? Bu soruyu foruma sorup cevap bekleyeceğine kodu derleyip isiste deneseydiniz çalışıp çalışmadığını on defa anlamıştınız.

Sorunuzun cevabına gelirsek, Çalışmaz
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Bir düzeltme yapayım 12F675 de portb değişiklik kesmesi vardır. Hem Intcon.3 hemde IOC registerinden hamgi pinler için kullanılavak ise o bitler set edilmelidir.

Ete

. Kağan

Mucit23 Merhaba,
Lütfen üslubunuza dikkat ediniz. Yalandan satırlar dediğiniz satırları anlamadığım için yazdım. Bir anlayan anlatabilir belki diye. Ben ne elektronikçiyim nede programcı. Sizlerin söylediğiniz birçok terimi hayatımda duymadım. Yardımcı olmak isteyen olur. İstemeyen görmezden gelir. Ben bir üniversite de 20 yıldır hocalık yapıyorum. Dünkü çocuk değilim. Madem bilgi paylaştıkça çoğalır nedir bu azarlamalar falan anlamadım. Size yakıştıramadım.

ete

 Kağan Bey,
Ben dahil herkes uslubuna ve tutumuna dikkat etsin. Her şeyi kötüye yorumlayıp alınganda olmamak lazım. Mucit sizi sıklıkla kullandığınız uslup için ikaz ediyor ve doğrusunun ne olması gerektiğini söylüyor. Aynı konuda bende sizi bir kere uyarmıştım ama her nedense siz sürekli olarak yazdıklarınızın başkaları tarafından onayını istiyorsunuz bu bilgi eksikliğinden kaynaklanıyor. Üstelik bu esikliği gidermeden aynı şeyi yapmaya devam ediyorsunuz. Bu nedenle bir tavsiyem olacak. Ya porojeden projeye geçmeye bir son verip alt yapınızı güçlendirdikten sonra bu işi yapmaya yeniden başlayın yada oturup derslere çalışın eksiğinizi yada hatalarınızı kendiniz bulun. Bu hiç bir zaman hatam nedir diye soramayacağınız anlamına gelmiyor. Ama bu tür soruları aynı kişi için bir iki defa kaldırabilirim ben kendi adıma konuşuyorum.  Unutmayınki ben programlamayı öğrenirken soracak kimsem yok idi. Hiç bir zaman boyumu aşan işlere girişmedim. Öğrendikçe ufkumu ve hayallerimi genişlettim. Burası sonsuz bir bilgi havuzu değil maalesef. Kaynakların %90 ı bana dayanıyor. Bir yerde beni zorluyorsunuz bu soruları sormakla. Boş vaktı çok olan birsi değilim ama cevapsız soru bırakmak da pek adetim değil bu iki özellik arasında gidip geliyorum. Kimse alınmasın ama çok fazla bedavacı var bu sitede. Bedavacı diyorum çünki hiç bir katkı yapmadan armut piş ağzıma düş peşindeler. Siz belki onlardan değilsiniz öğrenme hemde çabuk öğrenme peşindesiniz ama buda biraz çalışmaya bağlı lütfen bunuda göz ardı etmeyiniz. Yazdığınız kodların doğruluğunu çalıştırarak denemeye test etmeye çalışınız. Böylece sizde mutlu bizde mutlu olacağız.

Ete

. Kağan

Konuyu uzatmıyorum geri çekiliyorum. Ben örneksiz öğrenemeyenlerdenim. Bundan sonra da kimseyi rahatsız etmem. Forum sitelerinde kimse Zorla bilgi talebinde bulunmuyor. Yardım etmek isteyenlerden Allah razı olsun. Etmek istemeyenlerde moral bozmasın. Şu yazdıklarınıza çok canım sıkıldı. Sıklıkla kullandığım üslup dediğiniz şey sadece örnek vererek açıklamanız. Yine söylüyorum ki ben örnekle anlayabilirim. Örnek vermeden datashetin şu sayfasında şu var demek malesef hiçte açıklayıcı olmuyor. Datasheete bende okuyorum. Anlam veremediğimde de sizlere soruyorum. Sizde yine data sheete gösteriyorsunuz. Bu böyle olmaz. Ben bu konudaki ilk mesajımda ne demişim?
Alıntı YapBen PIC 16F675 kullanıyorum. datasheette GP2 pininin external interrupt olduğu yazıyor. Bu durumda pici GP2 ucundan uyararakmı @SLEEP komutundan uyandırmam gerekiyor.

Kesmeyi nasıl kurarım
demekki datasheete bakmışım ve GP2 ile ilgili bazı şeyleri anlamış, bazılarını anlamamışım. Bu mesajın üzerine
Alıntı YapYalandan iki satır birşeyler yazıp "Bu kod çalışırmı?" diye soru sormanıza anlam veremiyorum? Bu soruyu foruma sorup cevap bekleyeceğine kodu derleyip isiste deneseydiniz çalışıp çalışmadığını on defa anlamıştınız.

demek çok saygısızca bence. Çünkü ben o kodu denedim çalışmadı. Bilgimde ancak bu kadarına yetiyor. Bilen birisinin iki satır yazıp satırları açıklamasını bekliyordum. Ama tersinize denk geldim heralde. Ben yinede şimdiye kadar yaptığınız yardımlara teşekkür eder, hepinize mutlu ve sorunsuz, herkesin iyi olduğu süper forumlar diliyorum.

Saygılar.

Mucit23

Kimseyi kırmak istemem ama kusura bakmayın, eğer bu alanda hobi için bile olsa birşeyler yapmak istiyorsanız ilk başta Datasheete anlatılanları anlamayı, sonrasında araştırmayı öğrenmelisiniz.

Bu forumdan yüzlerce kişi faydalanıyor. Elektronik konusunda birşeyler yapmak kod yazmak için Elektronikçi olmanıza gerek yok.

Bu soruyu her sorana sıfırdan anlatsak ne olur bizim halimiz? Yeni birşey değilki Forumda belki onlarca kez konuşulmuş bir konu bu.

Kendi mesajımda söylemiştimki;
Alıntı YapEte hocanın 6 nolu ders notlarına bakın.
Evet Ete hoca 6. dersinde kesme konusuna ayrıntılı olarak değinmiş. Orada anlatılanlar sizin bütün sorularınızı cevaplıyor. Üstelik açıklamalı örnekler bile var. Oradaki 16F628 için yazılmış programı doğrudan 12F675 için uyarlayabilirdiniz(Uyarlama dediğim kopyala-yapıştır) Fakat yazdığınız koda bakınca daha önce interrupt kullanılan hiçbir koda bakmadığınız belli oluyor Forumda kimse dünkü çoçuk değil kimin ne yaptığı, ne için nekadar uğraştığı belli oluyor.

Canınızı sıkmanıza gerek yok. Eğer bu işte ilerlemek istiyorsanız Ete hocanın son yazdıklarına kulak verin ;)

İyi çalışmalar.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Powered by EzPortal