DOSTLAR ,
ASSEMBLY İLE PİC PROGRAMLAMA DAİR ÖNEMLİ NOTLARINIZI , DENEYİMLERİNİZİ BU BAŞLIK ALTINA YAZALIM...
SELAMLAR
INTERRUPT NEDİR?
INTERRUPT ya da Türkçe ifadeyle KESME.
KESME’yi biraz açalım. Diyelim ki VCD Player’ınıza bir güzel film koydunuz , izliyorsunuz.Bu anda cep telefonunuz çaldı.Ne yaparsınız?
Belki ilk anda moraliniz bozulur hatta konsantrasyonunuz kalmaz bile. Ve ne yapacağınıza karar verirsiniz.
Eğer önemli bir telefon ise VCD Player’ınızın PAUSE tuşuna basarak filmi durdurursunuz.Telefon konuşmanız bittikten sonra da filmi durdurduğunuz yerden tekrar izlemeye devam edersiniz.Eğer telefona cevap vermek istemiyorsanız bu kez de kararınız arayanın telesekretere mesaj bırakması olur.Ve böylece filmi bölmemiş olursunuz.
Ya da eşiniz yemek yapma hazırlıkları yaparken telefon çaldı.İşini orada KESER , NEREDE BIRAKTIĞINI HAFIZASINA KAYDEDER ve koşar telefona cevap verir.Konuşma bittikten sonra mutfağa gider , işini nerede KESTİĞİNİ hatırlar.Ve kaldığı yerden işine devam eder.
Peki ne yaptık telefon geldi diye filmi izlemekten vaz mı geçtik.Ya da eşiniz tamamen yemek yapmayı mı bıraktı.Hayır.Diğer işlerini bitirdi.Tekrar öncelikli işine döndü.
İşte , hayatımızda bu ve bunun gibi pek çok örneklerle karşı karşıyayız.Yani bir işi yaparken yarıda bırakıp (yarıda KESİP), başka önemli birşeyle ilgilenip sonra tekrar kestiğimiz işe devam etme olayları..
Günlük hayatımızda farkında olmadan böyle KESMELER yaparız
PIC Kesmeleri de burada anlattığımız olaylara benzer.Buna göre PIC’lerde oluşan kesmeyi şöyle tarif edelim.
PIC’in portlarına ya da PIC’in kendi içindeki bir sayıcısından gelen herhangi bir sinyal nedeniyle belleğinde çalışmakta olan programın kesilmesi olayıdır, INTERRUPT(KESME)
Programın kesildiği andan itibaren önceden hazırlanan bir alt program çalışır.ALT PROGRAM işlevini bitirdikten sonra program kaldığı yerden itibaren çalışmasına devam eder.SONUÇTA bir kesme , ana programın çalışmasını sadece DURAKLATIR , ama hiçbir zaman işlevini devam ettirmesini engellemez.
Dikkat edelim.Kesmeyi herhangi bir alt programı çağırmayla karıştırmayalım. Aralarında önemli bir fark vardır.
Normal alt programını çağırma işi CALL komutuyla yapılır.
Kesme alt programlarının çağrılmasını ise donanımda oluşan değişiklikler yapar.
Bir INTERRUPT oluştuğunda , o anda çalışmakta olan komutun çalışması biter.Programın akışı PICin program belleğinin ----16F84 için --- h’0004’ adresine atlar ve buradaki komutu çalıştırır.Bu komut ile kesme alt programı çağrılır.PIC , kesme alt programı çalıştıktan sonra ana programın hangi adresine döneceğini kesinlikle unutmamalıdır.Bu yüzden MCU bu unutmaya meydan vermemek için kesme oluştuğu anda çalışan komutun adresini STACK (Yığın) registerine kaydeder.Alt program işlevini bitirip , program akışı ana programa geçince az önceki STACK ta saklanan adresten itibaren devam eder.
Bu arada kesme alt programından ana programa dönüş komutunun RETFIE olduğunu hatırlatalım.
INTERRUPT SIRASINDA OLUŞACAK OLAYLARI KISACA ŞÖYLE BİR ÖZETLEYELİM.
1.Kesme olayı başladığında dostumuz , emenetçi STACK registerin olduğu adrese atla.
2.Ana programın kaldığı adres bu STACK registere yazılır ki kesme bittiğinde ana program kaldığı yerden işlemeye devam etsin.
3.Kesme alt programının olduğu adrese atla.
4.Kesme alt programını çalıştır.Bitir ve dön.
5.Dönüşte STACK registere uğra .
6.Emanet olan Ana programa dönüş adresini al.
7.Adrese alınan yerden itibaren yoluna devam et.
Pic 16F84 için 4 değişik kaynaktan INTERRUPT sinyali gelebilir.Bunları aşağıdaki gibi sıralayabiliriz.
1. RB0/INT harici pininden giren sinyal.
2. PORTB High Level Change.RB4 , RB5 , RB6 ve RB7 pinlerinin herhengi birinde oluşacak lojik seviye değişikliği.
3. TMR0 ( Timer / Counter ) 0xFF’den 0x00 ‘a geçerken oluşan kesme, ya da başka bir deyişle TMR0 sayıcısında oluşan zaman aşımı kesmesi.
4. EEPROM’a yazma işlemi tamamlandığında oluşan interrupt.
Bu interrup kaynakların aktif olabilmesi için OPTION Register , INTCON Register gibi özel registerlerde bazı değişiklik yapmamız gerekecekir.Amaca ve kesme kaynağına göre bu özel registerlarda neler yapılacağına sonra değinelim.Bundan önce kısaca şu özel registerlar nelermiş onlar bir tanıyalım.
INTCON ( INTerrupt CONtrol ) Registeri
Bu register Pic'in RAM belleğinin h'0B' adresinde bulunan özel registerlerden birisidir.Bu register içerisinde her bir kesme kaynağı için bir FLAG bir de GLOBAL Kesme Bayrağı bulunur.
TÜM KESME İŞLEMLERİNİ KONTROLÜ BU REGİSTER VASITASIYLA YAPILIR.
Şimdi bu registeri biraz inceleyelim.
(http://members.lycos.co.uk/edadown3/images/INTCON0.gif)
Bit 7--> GIE : Tüm Kesme işlemlerini iptal etme bit'idir.
0 = Tüm kesmeler geçersiz (DISABLE)
1 = Aktif yapılmış tüm kesmeler geçerli (ENABLE)
Bit 6--> EEIE : EEPROM belleğe yazma işlemini tamamlama bit'i.
0 = Geçersiz (DISABLE)
1 = Geçerli (ENABLE)
Bit 5--> TOIE : TMR0 sayıcı kesmesini aktif yapma bit'i.
0 = Geçersiz (DISABLE)
1 = Geçerli (ENABLE)
Bit 4--> INTE : Harici kesmeyi aktif yapma bit'i.
0 = Geçersiz (DISABLE).Harici kesmeler kabul edilmiyor.
1 = Geçerli (ENABLE). Harici kesmeler kabul ediliyor.
Bit 3--> RBIE : PORTB ( 4. , 5. ,6. , 7. bitleri) değişiklik kesmesini aktif yapma bit'i.
0 = Geçersiz (DISABLE). PORTB'deki değişiklikler kesme oluşturur.
1 = Geçerli (ENABLE). PORTB'deki değişiklikler kesme oluşturur.
Bit 2--> TOIF: TMR0 sayıcısı zaman aşımı kesme biti.
0 = Zaman aşımı yok.
1 = Zaman aşımı var.( h'FF' adresinden h'00' a geçiş. )
Bit 1--> Harici INTF: Harici RB0/INT kesme bit'i.
0 = Harici kesme meydana gelmediğinde.
1 = Harici kesme oluştuğunda.
Bit 0--> RBIF: PORTB değişiklik kesme biti.
0 = RB4~RB7 uçlarında değişiklik yok.
1 = RB4~RB7 uçlarından en azından birinde değişiklik var.
OPTION REGISTER
OPTION Register , RAM belleğin 1. bankındaki h'81' adresinde bulunan özel bir kaydedicidir.
(http://members.lycos.co.uk/edadown3/images/OPT-REG2.gif)
Bu register'a ait özellikler aşağıdaki gibi sıralanmıştır.
1. PORTB 'nin çıkışlarının PULL-UP yapılma durumunu kontrol eder.
2.TMR0 ve/ veya WDT Âyi seçme bayrağını bulundurur.
3. TMR0 ve WDT adına frekans bölme sayısı için gerekli bitleri bulundurur.
4.INTERRUPT sinyalinin tetikleme kenarını seçer(Düşen kenarda mı? , yükselen kenarda mı? ).
5.Ayrıca yukardaki şekilde de görüldüğü gibi bu register 8-bitliktir.
Yukarıdaki şekilde görülen bitleri tanıyalım.
Bit 0 -- > PS0 ,
Bit 1 -- > PS1, ------->>> FREKANS BÖLME SAYISI ( PRESCALER VALUE )
Bit 2 -- > PS2 ,
Bit 3--> PSA: Frekans bölücü seçme bit'i
0 = Frekans bölme sayısı TMR0 için geçerli
1 = Frekans bölme sayısı WDT için geçerli
Bit 4--> TOSE: TMR0 Sinyal kaynağı kenar seçme bit'i
1 = RA4/TOCKI ucundan düşen kenar tetiklemesi.
0 = RA4/TOCKI ucundan yükselen kenar tetiklemesi.
Bit 5--> TOCS: TMR0 Sinyal kaynağı seçme bit'i
0 = Dahili komut saykılı seçilir.
1 = Harici dijital sinyal ( RA4/TOCKI ucu ) seçilir.
Bit 6--> INTEDG: Harici RB0 kesme sinyali kenar seçme bit'i
0 = RB0 / INT ucundan düşen kenar tetikleme.
1 = RB0 / INT ucundan yükselen kenar tetikleme seçilir.
Bit 7--> RBPU: PORTB Pull-Up geçerli yapma bit'i
1 = PORTB uçlarındaki Pull-Up'lar iptal edilir.
0 = PORTB uçlarındaki Pull-Up'lar geçerli yapılır.
PRESCALER'İN KULLANILMASI
OPTION Registerin 0. , 1. , 2. bit'leri Âki bu bitlere sırayla PS0 , PS1 , PS2 demiştik- içerisine yerleştirilen 0 ya da 1 digitleri , TMR0 veya WDT'ye uygulanan sinyali böler.Bunun sayesinde de dolayısıyla sayma hızları değiştirilebilir.Buraya yerleştirilen 3 bit'lik bu sayı bize TMR0'a ve WDT'e biririnden farklı 8 çeşit oran seçme olanağı sunar.
OPTION Registerin 3. biti olan PSA bit'i ki  hatılayalım bu bit, Frekans bölücü seçme bit'i idi.- bu , prescaler sayısının hangi sayıcıya uygulanacağını belirler.
Eğer bu biti 0 seçerseniz Frekans bölme sayısı TMR0 için geçerli olur.
Eğer bu biti 1 seçerseniz Frekans bölme sayısı WDT için geçerli olur.
Aşağıda hangi prescaler değerinde giriş frekansının kaça bölünceğini gösteren tablo bulunmaktadır
(http://members.lycos.co.uk/edadown3/images/PRES.gif)
Bu tabloya göre örneğin ;
Prescaler değeri b'101'seçilirse , TMR0 oranı 1 / 64 , WDT oranı 1 / 32 seçililir.
Prescaler değeri b'111'seçilirse , TMR0 oranı 1 / 256 , WDT oranı 1 / 128 seçililir.
TMR0 SAYICISININ ÖZELLİKLERİ
Sayıcı içerisindeki sayının bir arttırılması için lazım olan clock bilgisi 2 farklı kaynaktan sağlanabilir.
1. PIC’in içindeki dahili komut saykılı ile
2.Harici digital sinyal yardımıyla.
*** Harici digital sinyal PORTA’nın 3. bit’i olan RA4/TOCKI ucundan uygulanır.
*** TMRO dediğimiz dahili sinyal kaynağını seçmek için OPTION REGISTER’in 5.bit’i olan TOCS flag’ı kullanılır.Ve bu bit 0 olmalıdır.Aşağıdaki bilgiyi hatırlayalım. Alıntı YapBit 5--> TOCS : TMR0 Sinyal kaynağı seçme bit’i
0 = Dahili komut saykılı seçilir.
1 = Harici dijital sinyal ( RA4/TOCKI ucu ) seçilir.
*** Frekans bölme sayısı WDT ya da TMR0 ‘a OPTION REGISTER’in 3. bit’i olan PSA flağ’ı ile yönlendirilir. “0” seçtiğimizde TMR0 ‘a , “1” seçtiğimizde ise WDT ‘ye yönlendirmiş oluruz. Aşağıdaki bilgiyi hatırlayalım. Alıntı YapBit 3--> PSA : Frekans bölücü seçme bit’i
0 = Frekans bölme sayısı TMR0 için geçerli
1 = Frekans bölme sayısı WDT için geçerli
*** Bu registerin 0. , 1. ve 2. bitleriyle de 8 farklı sinyal bölme değeri seçebiliyorduk.Bir üst konudaki tabloyu inceleyiniz. *** Harici dijital sinyal kullanıldığında TMR0 içindeki sayının , gelen sinyalin hangi kenarında (yükselen mi? , düşen mi?) uygulanacağı OPTION REGISTER’in 4. bit’i olan TOSE ile ayarlanır.Aşağıdaki bilgiyi irdeleyiniz.
Buna göre bu flağ’ı “1” seçerseniz RA4/TOCKI ucundan gelen sinyalin her düşen kenarında TMR0 sayıcısı içerisindeki sayı bir artar. “0” seçtiğinizde ise yükselen kenarda … Alıntı YapBit 4--> TOSE : TMR0 Sinyal kaynağı kenar seçme bit’i
1 = RA4/TOCKI ucundan düşen kenar tetiklemesi.
0 = RA4/TOCKI ucundan yükselen kenar tetiklemesi.
*** TMR0 sayıcısından çıkış sinyalleri aşağıdaki hallerde oluşur.
------------Sayıcının h’FF’ ‘den h’00’’a geçişinde oluşan taşma sinyalinin INTCON REGİSTER’inin 2. bit’i olan TOIF bayrağına “1” yazılması anında,
------------ RAM belleğinin 0. Bank’ında h’01’ adresindeki TMR0 registeri okununca. Alıntı YapBit 2--> TOIF : TMR0 sayıcısı zaman aşımı bayrağı.
0 = Zaman aşımı yok.
1 = Zaman aşımı var.( h’FF’ adresinden h’00’ a geçiş. )[/color]
16F84 için Kesme Kaynaklarından Harici Kesmeler
Bu INTERRUPT türünün aktif olabilmesi için OPTION ve INTCON register’lerine ait bayraklarında gerekli değişiklikleri yapmak gerekecektir.Her iki register’in hangi bayraklarında ne gibi değişiklikleri niçin yapmamız gerektiği aşağıda açıklanacaktır.
RB0/INT harici pininden giren sinyal ile kesme oluşturabiliriz.Bunu yapabilmek için bazı şartların yerine getirilmesi gerekir.Evvela bu uç dışardan gelebilecek kesmeyi alabilecek şekilde hazırlanmalıdır.Bunun için 2 şey yapmalıyız:
1) RB0/INT ucunu giriş olarak ayarlamalı ,
2) Daha önce de belirttiğimiz gibi INTCON Registerin 4. bit’i olan INTE (Harici kesmeyi aktif yapma bayrağı ) bayrağı harici kesme işlemi için aktif , geçerli ( yani 1) yapılmalıdır. Alıntı YapBit 4--> INTE : Harici kesmeyi aktif yapma bayrağı
0 = Geçersiz (DISABLE).Harici kesmeler kabul edilmiyor.
1 = Geçerli (ENABLE). Harici kesmeler kabul ediliyor.
Bir de bu uçtan alınacak sinyalin alçalan kenarda mı yoksa yükselen kenarda mı INTERRUPT oluşturacağına karar vermek gerekir.Bunun için de OPTION Register’de ayarlama yapmamız gerekiyor.
OPTION Register’in 6. bit’i olan INTEDG ( Harici kesme sinyali kenar seçme bit’i ) bayrağı ile bir karara varılır. Alıntı YapBit 6--> INTEDG : Harici kesme sinyali kenar seçme bit’i
0 = RB0 / INT ucundan düşen kenar tetikleme.
1 = RB0 / INT ucundan yükselen kenar tetikleme seçilir.
Kesme alt programımız çalışıyorken başka bir kesmenin oluşmasını engellemek için , kesme oluşturulduğu zaman harici kesmeler kabul edilmemeli prensibiyle yani INTE -->0 yapılmalıdır. Alıntı YapBit 4--> INTE : Harici kesmeyi aktif yapma bayrağı
0 = Geçersiz (DISABLE).Harici kesmeler kabul edilmiyor.
Harici kesme oluştuğunda ise INTCON Registerinin 1. bit’i olan INTF bayrağı 1 olur.Bu bayrağı KESME alt programı içerisinde tekrar 0 yapmalıyız.Aksi halde tekrarlanan kesmelerle karşılaşabiliriz.
KISACA şöyle özetleyelim.
Harici bir kesme oluştuğunda ;
• Sonraki kesmeleri iptal için INTE--->0 olsun.
• Kesme alt programı çalışsın.
• INTF ->0 olsun.
• Yeni kesmeleri aktif yapmak için INTE--->1 olsun.
PORTB High Level Change Kesmesi Daha öncede bahsi geçtiği gibi bu da PIC16F84’deki INTERRUPT çeşitlerinden biridir.PORTB ‘nin üst dört bit’inde meydana gelen herhangi bir değişiklik RBHigh Kesmesini oluşturur. Bu kesme’nin aktif olabilmesi için INTCON register’inin 3.biti olan RBIE biti’inin programın başında “ 1 “yapılması gerekir. Alıntı YapBit 3--> RBIE : PORTB ( 4. , 5. ,6. , 7. bitleri) değişiklik kesmesini aktif yapma bayrağı
0 = Geçersiz (DISABLE). PORTB’deki değişiklikler kesme oluşturur.
1 = Geçerli (ENABLE). PORTB’deki değişiklikler kesme oluşturur.
PORTB’nin bu bitlerinde oluşan bir değişiklikte ise INTCON register’inin 0. biti olan RBIF ise “1” olur.
Bunun yanısıra Kesme alt programında diğer işlemlerden önce bu flağın sıfırlanması gerekir. Alıntı YapBit 0--> RBIF : PORTB değişiklik bayrağı.
0 = RB4~RB7 uçlarında değişiklik yok.
1 = RB4~RB7 uçlarından en azından birinde değişiklik var.
Bu interruptun kullanımına bir misal verelim:
PORTB ‘nin üst bitlerine bağlı bir klavyemiz olsun.Bu interrupt'u kullanarak klavye bilgisi okuyacak olalım.Her zamanki gibi programda evvela Portlarımızı tanımlıyor.Sonra da RBHigh interrupt’ını tanımlıyoruz.Eğer klavyemizin herhangi bir tuşuna basılırsa , RBHigh uçlarında bir değişiklik oluşuyor.
Ve INTCON register’inin 0. biti olan RBIF ise “1” oluyor.Program klavye KESME alt programına dallanıyor.Bu kesme alt programında önce RBIF bayrağı resetlenmeli ---hatırlayalım---.Sonra klavye değeri okunur.Sonuç gerekiyorsa , gerekli yerlere gönderilir.KESME alt programından çıkılır.Program normal akışına devam eder
TÜM KESME İŞLEMLERİNİ AKTİF YAPMAK
Tüm kesme işlemlerini aktif yapma bayrağı INTCON register’inin 7. biti olan GIE idi.Bu flag’ı “1” yaparak kesme işlemini aktif yapmış oluruz.
Hatırlayalım: Alıntı YapBit 7--> GIE : Tüm Kesme işlemlerini iptal etme bayrağıdır.
0 = Tüm kesmeler geçersiz (DISABLE)
1 = Aktif yapılmış tüm kesmeler geçerli (ENABLE)
Bir kesme olayı olduğunda ise bu 7. bit -- > “ 0 ” olur. Bu resetleme işlemi PIC tarafından otomatikman yapılır.Sebebi de KESME alt programının çalışması esnasında yeni bir kesmenin oluşmasını engellemek içindir. KESME alt programı sona erip ana programa dönüldüğü anda ise sonraki KESME’lerin aktif labilmesi için tekrar otmatikman 7. bit “1” yapılır.
KESME GECİKMESİ
Bir kesme meydana geldiğinde kesme alt programı çalıştırılmadan evvel bir gecikme oluşur.Bu gecikmeye biz “KESME GECİKMESİ” diyoruz.Bu takriben 3 ya da 4 komut saykılı süredir.
KESME ADRESİ
Bir kesme meydana geldiğinde kesme alt programının ilk komutu h’004’ adresine yazılmalıdır.
ORG h’000’ ;-----------------> Ana Program başlangıcı
GOTO BASLA
ORG h’004’ ;-----------------> Kesme alt programı başlangıcı.
ORG INT_ALT_PROG
TMR0 ORANI , bu sayıcıyı seçtiğimizde kaç dahili komut saykılında bir , bir üst sayıya geçişini belirler.Örnek verelim.
TMR0 Oranı 1/4 ise , her 4 komut saykılında bir kez üst sayıya geçiş olur.
TMR0 Oranı 1/128 ise , her 128 komut saykılında bir kez üst sayıya geçiş olur.
----------------------------------------------------------------------------------
WDT ORANI , bu sayıcıyı seçtiğimizde kaç dahili komut saykılında bir , bir üst sayıya geçişini belirler.Örnek verelim.
WDT Oranı 1/2 ise , her 2 komut saykılında bir kez üst sayıya geçiş olur.
WDT Oranı 1/16 ise , her 16 komut saykılında bir kez üst sayıya geçiş olur.
Bu değerler yukardaki PRESCALER’İN KULLANILMASI adlı konu başlığındaki tablodan alındı.
Program belleğine yazdığımız komutların çalışması için PIC’e harici bir osilatörden clock sinyali (f osc ) uygulanması gerekir.
Bu frekans PIC tarafından 4’e bölünür.Ve OSC2 / CLK OUT ucundan dışarı verilir.4’e bölünen bu frekansın bir saykılı bir komutun çalışması için geçen süredir.
Örneğin , 20 MHz’lik bir kristal osilatör kullanılan PIC ‘te , dahili komut saykılı (periyodu) süresi şöyle bulunur.
f komut-----> Dahili Komut Saykılı Frekansı
Tkomut ----> Dahili Komut Saykılı (Periyodu) Süresi
f komut = f osc / 4 =20 MHz / 4 =5 MHz
Tkomut = 1 / f komut =1 / 5 = 0.2 µS
Peki 4 MHz ‘lik bir osilatör kullansaydık , dahili komut saykılı süresi ne olurdu?
Bir hesaplayalım:
f komut = f osc / 4 =4 MHz / 4 =1 MHz
Tkomut = 1 / f komut =1 / 1 = 1 µS
TMR0 SAYMA ARALIĞI SÜRESİ / KESME SÜRESİ HESABI
CLOCK Frekansı bilinen bir PIC'te TMR0 sayıcısının kaç µS aralıklarla saydığını hesaplayalım.
Önce bir PRESCALER değeri seçelim. Örneğin Frekans bölme sayısı b'000'olsun.Aşağıdaki tabloya bakın.
(http://members.lycos.co.uk/edadown3/images/PRES.gif)
Tablodan da anlaşıldığı üzere bu prescaler değerin TMR0 oranı karşılığı 1 / 2 dir.
Bu demektir ki TMR0 sayıcısı dahili komut saykıl süresinin 2 saykılında 1 kez artıyor
Yine 4 MHz Âlik bir osilatör kullandığımızı varsayalım.
Hatırlayalım (Yukarıdaki örnekten) 4 MHz Âlik bir osilatör kullanıldığı bir PIC'te dahili komut saykılı süresi 1 µS idi. TMR0 SAYMA ARALIĞI SÜRESİ aşağıdaki gibi hesaplanıyor.
TMR0 SAYMA ARALIĞI SÜRESİ = Tkomut X TMR0 oranı
.............................................= 1 µS x 2 = 2 µS
TMR0 saymaya başladığındaki ilk sayı h'00' ise bu sayı h'FF''ye yani desimal 256'ya gelince kesme sinyali meydana gelecektir.
Not: TMR0 16f84 de 8 Bitlik sayıcı olduğundan maximum 255'e kadar sayar.Kesme işlemi de TMR0 sayıcısının 255 den tekrar 0'a geçişi esnasında oluşur .Bunları unutmayalım.
KESME GECİKMESİ = TMR0 sayma aralığı X 256
............................= 2 µS x 256 = 512 µS eder.
WDT ZAMNLAYICISI
(WATCHDOG TIMER)
Pic içerisinde bulunan bir diğer zamanlayıcıdır. Bu zamanlayıcının sinyal kaynağı , Pic içindeki bir
osilatördür.
Pic'in önceden belirlenen sürede yapması gereken işi zamanında yapamadıysa , bir diğer deyişle program controlden çıkıp da kilitlendiyse , WDT devreye girer ve PIC'e reset
atar.
WDT , bir de SLEEP -uyuma- moduna girmiş PIC'İ uyandırarak yeniden çalışmaya devam etmesini sağlar.
Bu zamanlayıcının uygulama alanına bir örnek
verelim.
Sözgelimi ,seri üretim yapan bir fabrikadakaki bir bant üzerinden geçen ürünlerin montajını yapan robotu bir PIC kontrol etsin.Herhangi bir problem yok ise ,ürünlerin montajı
robot başka bir deyişle Pic tarafından yapılmaya devam edecektir.Bant üzerinde herhangi bir problem oluştuğunda ürün geçişi duracağından bir gecikme meydana gelecektir.Bu gecikme WDT’nin
ayarlanan zaman aşımı süresini geçerse , bu zamanlayıcı- WDT - devreye girecek ve programa reset atarak , programın baştan çalışmasını sağlayacaktır.
Bu faydalı resim , döküman , üyemiz elektromer'e
aittir.
(http://members.lycos.co.uk/edadown3/images/elektromer01.gif)
Teşekkürler
elektromer
Bu faydalı döküman da Sevgili
elektromer 'e aittir.
EEProm Yazma ve Okuma
Programı
;****************************************************************************;
; PROGRAM ADI : EEProm Yazma ve Okuma
Programı
; DOSYA ADI : eeprom.asm
; YAZAN :
; TARİH : 01 Ocak 2004
; TARİH : 04:33
; İŞLEMCİ : PIC
16F84
; SAAT HIZI (XTAL) : 3.2768 MHz
;****************************************************************************;
; NOT : Buradaki şablon benim genelde kullandığım formatı
gösterir,
; ve ağırlıkla programlarımı TMR0 kesmesi kullanarak yazarim.
; Bu dosya yeni başlayacak arkadaşlara fikir vermesi amacıyla
hazırlanmıştır.
;****************************************************************************;
LIST P=
16F84A, R=HEX, C=80
ERRORLEVEL -302
#INCLUDE "f84.inc"
LIST
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF &
_XT_OSC
;****************************************************************************;
; RAM
tanımlamaları
;****************************************************************************;
CBLOCK 0x0C
e_data1 ;
e_data2 ;
ENDC
;*****************************************************************************;
; Ana Program
Başlangıcı
;*****************************************************************************;
org 0x00
clrw ;
movwf porta ;
movwf portb ;
goto BASLA ; Başlangıç Etiketine git.
;*****************************************************************************;
BASLA call TANIM ; Port
tanimlamalari.
;*****************************************************************************;
; 1.EPROM datamız = 0x33 Adresimiz = 0x00
; Eprom Adresi 0x00 ile 0x3F
dahil arası olabilir.
;*****************************************************************************;
movlw 0x33 ; W'ye 0x33 değerini al.
movwf eedata ; eedata1
yazmacına kopyala. (1. EEPROM datası)
movlw 0x00 ; W'ye 0x00 değerini al.
movwf eeadr ; eeadr yazmacına kopyala. (1. EEPROM adresi)
call E_YAZ ;
Eproma yazdir.
;*****************************************************************************;
; 2.EPROM datamız = 0xDC Adresimiz = 0x2F
; Eprom Adresi 0x00 ile
0x3F dahil arası olabilir.
;*****************************************************************************;
movlw 0xDC ; W'ye 0xDC değerini al.
movwf eedata ; eedata
yazmacına kopyala. (2. EEPROM datası)
movlw 0x2F ; W'ye 0x2F değerini al.
movwf eeadr ; eeadr yazmacına kopyala. (2. EEPROM adresi)
call E_YAZ ;
Eproma yazdir.
;*****************************************************************************;
; Şimdide 0x00 Eeprom adresindeki datayı
; e_data1 yazmacına
kopyalayalım.
; Eprom Adresi 0x00 ile 0x3F dahil arası olabilir.
;*****************************************************************************;
movlw 0x00 ; W'ye 0x00
değerini al.
movwf eeadr ; eeadr yazmacına kopyala. (1. EEPROM adresi)
call E_OKU ; Epromu
oku.
movwf e_data1
;*****************************************************************************;
; Şimdide 0x2F Eeprom adresindeki datayı
; e_data2 yazmacına
kopyalayalım.
; Eprom Adresi 0x00 ile 0x3F dahil arası olabilir.
;*****************************************************************************;
movlw 0x2F ; W'ye 0x00
değerini al.
movwf eeadr ; eeadr yazmacına kopyala. (1. EEPROM adresi)
call E_OKU ; Epromu oku.
movwf e_data2
SON goto SON ;
;*****************************************************************************;
; Micro Kontrolor icin tanimlamalar
; Port tanımlarken, çıkış olacak bitleri 0, giriş olacaklari 1
yap.
;*****************************************************************************;
TANIM bsf _rp0 ; BANK 1'e geç.
movlw b'00000000' ; RA0-4
Cikis
movwf trisa ; TRISA'ya kopyala
movlw b'11110001' ; RB1-3 Giris, RB0,4-7 Cikis
movwf trisb ; TRISB'ya kopyala
bcf _rp0 ; BANK
0'e geç.
return ;
;*****************************************************************************;
; Data EEPROM'una Degisen veri
yazilir.
;*****************************************************************************;
E_YAZ bsf _rp0 ;
bsf _wren ;
movlw 0x55 ;
movwf eecon2
;
movlw 0xAA ;
movwf eecon2 ;
bsf _wr ;
bcf _wren ;
btfsc _wr ;
goto $-1 ;
bcf _eeif ;
bcf _rp0
;
return ;
;*****************************************************************************;
; Data EEPROM'undan veri
okunur.
;*****************************************************************************;
E_OKU bsf _rp0 ;
bsf _rd ;
bcf _rp0 ;
movf eedata,w ;
return ;
;*****************************************************************************;
; Data EEPROM iceriklerinin set edilmesi
; Bu bölümde Programınızda
EEPROM içeriğine bazı değerler vermek isterseniz
; kullanabilirsiniz..
; En son satirda, Programın en son yazildiği tarihi saklamak için kullandım.
; de 1, 1, 20, 4, 0,
0, 4, 33 ;
; Gün Ay Yıl Saat Dakika
;*****************************************************************************;
org h'2100'
de 0, 0,
0, 0, 0, 0, 0, 0 ;
de 0, 0, 0, 0, 0, 0, 0, 0 ;
de 0, 0, 0, 0, 0, 0, 0, 0 ;
de 0, 0, 0, 0, 0, 0, 0, 0 ;
de 0, 0, 0, 0, 0,
0, 0, 0 ;
de 0, 0, 0, 0, 0, 0, 0, 0 ;
de 0, 0, 0, 0, 0, 0, 0, 0 ;
de 1, 1, 20, 4, 0, 0, 4, 33 ;
;*****************************************************************************;
end
Teşekkürler
elektromer
PIC16 nanoWatt
teknolojisi
(http://ground.com.co.nr/picproje/2.gif)
PIC18 nanoWatt
teknolojisi
(http://ground.com.co.nr/picproje/4.gif)
" ORG " Deyimi
ORG Deyimi ingilizcedeki orgin kelimesinin kısaltılmış halidir.Ve bu deyim iki amaç için kullanılır.
1. Program komutlarının hangi adresten başladığını ifade eder.
ORG 0x000
0x000 --> İlk komutun başlama adresidir.
2.Kesme(interrupt) alt programlarının başlangıç adresini belirlemede kullanılır.
ORG 0x004
0x004 --> Kesme alt prog. başlama adresidir.
http://rapidshare.com/files/22752429/Assembly_komut_seti.rar.html
Alıntı yapılan: "Ziya"http://rapidshare.com/files/22752429/Assembly_komut_seti.rar.html
Dosya bulunamadı, diye sonuç var
An error has occured:
File not found
Hocam yazıları sürdürmeyi düşünüyormusunuz çok başarılı bir çalışma bence.
mplab programı hakkında detaylı kullanım klavuzu gibi birşey arıyorum , bulamadım var mıdır acaba?
Kendi sitesinde var. Bu dosya (http://ww1.microchip.com/downloads/en/DeviceDoc/MPLAB_User_Guide_51519c.pdf).
Alıntı yapılan: "Tagli"Kendi sitesinde var. Bu dosya.
türkçe arıyorum ama
Mplab anlatımı çeşitli yerlerde verilmişti.
Hatırladığım " akıl defterim " içerisinde vardı.Hatta daha fazlası da vardı onun içerisinde.
http://www.4shared.com/file/19204730/e400b422/MPLAB.html
http://www.4shared.com/file/78713710/46545429/MPLAB_IDE.html
-----------------
Aşağıda 3-4 kitap var , assembly kullanarak pic programlamayı anlatıyorlar.
http://www.4shared.com/file/116811556/97b4ded4/Pic_Assembly.html
Çok faydalı bilgiler için teşekkür ederim :) Elinize sağlık hocam benzer ayrıntılır varsa devamıda gelirse güzel olcaktır .Konuyu hortlattım :D ama.
ilk öncelikle intrrupt kesme demektir.kesme ise ana programın bitmesini beklemeden dışardan gelen sinyalle örneğin harici kesme sayıcı kesmesi pin değişiklik kesmesi gibi bir sürü yazılabilir.kesme registeri intcondur yani interrupt kontrol registeri intconun bayrakları yani belli başlı bitleri vardır
ie ile başlayanları kesme izni
if ile başlayanları kesme
gie genel kesme izni :) ;) :D >:( :( :o ??? ::) :P :-[ :-X :-\ :-* :'(
Bi sorum olacaktı arkadaşları
Hani bu komutları hep alt alta yazıyoruz yaa. Acaba aralarına bir karakter koyup Yan yana yazmamıza imkan varmı acaba?
Örnek:
BSF PORTA,7
BSF PORTA,6
BSF PORTA,7 ? BSF PORTA,6
Bunun icin kendin bir oncu derleyici yazmalisin.
Yazacagin basit bir program yan yana asm komutlarla olusturdugun programin bulundugu dosyadan alt alta yazilmis kodlara donusum yapar ve 2. bir dosya uretir ve bu yeni dosya derlenir.
Derleme sonucunda hata olduysa hatali satir yazdigin program tarafindan ogrenilir ve yan yana kodlarin yazili oldugu dosyada hatali satir ve sutun hesaplanir.
Ugrasirsan cok zor bir sey degil.
Çok çok faydalı olmuş .
Teşekkürler
MPLAB ID assembly derleme programının son sürümü kaçtır. Bilen var mı.?
Uzun zamandır assemly ile çalışmadığım için takip edemedim.
Bilen varsa nerden indirebilirim acaba?
Ben birkaç hafta önce 8.88 indirmiştim, microchipin sitesinden direk indiriyorsunuz nede olsa mplab asm derleyici ücretsiz.
Alıntı yapılan: RaMu - 15 Şubat 2013, 22:58:40
Ben birkaç hafta önce 8.88 indirmiştim, microchipin sitesinden direk indiriyorsunuz nede olsa mplab asm derleyici ücretsiz.
Teşekkürler. Microchipin sitesine baktım . Son Sürümü 8.89. indirdim.
Buradan indirilebiliyor
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en019469&part=SW007002 (http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en019469&part=SW007002)