Picproje Elektronik Sitesi

DERLEYİCİLER => PIC Assembly => Konuyu başlatan: XNHCX - 08 Şubat 2004, 23:28:06

Başlık: PİC ASSEMBLY ÜZERİNE BAZI ÖNEMLİ NOTLAR
Gönderen: XNHCX - 08 Şubat 2004, 23:28:06
DOSTLAR ,
ASSEMBLY İLE PİC PROGRAMLAMA DAİR ÖNEMLİ NOTLARINIZI , DENEYİMLERİNİZİ  BU BAŞLIK ALTINA YAZALIM...

SELAMLAR
Başlık: PİC ASSEMBLY ÜZERİNE BAZI ÖNEMLİ NOTLAR
Gönderen: XNHCX - 08 Şubat 2004, 23:34:51
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.
Başlık: 16F84 için Kesme Kaynakları
Gönderen: XNHCX - 08 Şubat 2004, 23:37:50
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.
Başlık: INTCON ( INTerrupt CONtrol ) Registeri
Gönderen: XNHCX - 08 Şubat 2004, 23:43:12
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.
Başlık: PİC ASSEMBLY ÜZERİNE BAZI ÖNEMLİ NOTLAR
Gönderen: XNHCX - 08 Şubat 2004, 23:56:52
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.
Başlık: PRESCALER’İN KULLANILMASI
Gönderen: XNHCX - 09 Şubat 2004, 20:02:16
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.
Başlık: PİC ASSEMBLY ÜZERİNE BAZI ÖNEMLİ NOTLAR
Gönderen: XNHCX - 10 Şubat 2004, 19:52:08
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]
Başlık: 16F84 için Kesme Kaynaklarından Harici Kesmeler
Gönderen: XNHCX - 10 Şubat 2004, 19:54:54
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.
Başlık: PORTB High Level Change Kesmesi
Gönderen: XNHCX - 10 Şubat 2004, 20:00:36
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
Başlık: PİC ASSEMBLY ÜZERİNE BAZI ÖNEMLİ NOTLAR
Gönderen: XNHCX - 10 Şubat 2004, 20:04:00
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.
Başlık: PİC ASSEMBLY ÜZERİNE BAZI ÖNEMLİ NOTLAR
Gönderen: XNHCX - 10 Şubat 2004, 20:04:44
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.
Başlık: PİC ASSEMBLY ÜZERİNE BAZI ÖNEMLİ NOTLAR
Gönderen: XNHCX - 10 Şubat 2004, 20:05:41
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
Başlık: TMR0 /WDT ORANI
Gönderen: XNHCX - 10 Şubat 2004, 20:08:17
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ı.
Başlık: PİC ASSEMBLY ÜZERİNE BAZI ÖNEMLİ NOTLAR
Gönderen: XNHCX - 10 Şubat 2004, 20:17:19
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
Başlık: TMR0 SAYMA ARALIĞI SÜRESİ / KESME SÜRESİ HESABI
Gönderen: XNHCX - 14 Şubat 2004, 02:05:46
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.
Başlık: WDT ZAMNLAYICISI (WATCHDOG TIMER)
Gönderen: XNHCX - 29 Şubat 2004, 19:20:25
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.
Başlık: PİC ASSEMBLY ÜZERİNE BAZI ÖNEMLİ NOTLAR
Gönderen: XNHCX - 02 Mart 2004, 00:50:48
Bu faydalı resim , döküman , üyemiz elektromer'e

aittir.

(http://members.lycos.co.uk/edadown3/images/elektromer01.gif)

Teşekkürler

elektromer
Başlık: EEProm Yazma ve Okuma Programı
Gönderen: XNHCX - 02 Mart 2004, 00:54:08
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
Başlık: PİC MİMARİLER
Gönderen: ground - 02 Mart 2004, 10:23:22
PIC16 nanoWatt

teknolojisi
(http://ground.com.co.nr/picproje/2.gif)

PIC18 nanoWatt

teknolojisi
(http://ground.com.co.nr/picproje/4.gif)
Başlık: PİC ASSEMBLY ÜZERİNE BAZI ÖNEMLİ NOTLAR
Gönderen: XNHCX - 14 Kasım 2005, 15:43:50
" 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.
Başlık: PİC ASSEMBLY ÜZERİNE BAZI ÖNEMLİ NOTLAR
Gönderen: Ziya - 25 Mart 2007, 22:56:54
http://rapidshare.com/files/22752429/Assembly_komut_seti.rar.html
Başlık: PİC ASSEMBLY ÜZERİNE BAZI ÖNEMLİ NOTLAR
Gönderen: ercinatay - 19 Mayıs 2008, 22:03:05
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
Başlık: PİC ASSEMBLY ÜZERİNE BAZI ÖNEMLİ NOTLAR
Gönderen: _md_ - 16 Kasım 2008, 13:26:14
Hocam yazıları sürdürmeyi düşünüyormusunuz çok başarılı bir çalışma bence.
Başlık: PİC ASSEMBLY ÜZERİNE BAZI ÖNEMLİ NOTLAR
Gönderen: camby - 08 Temmuz 2009, 12:55:37
mplab programı hakkında detaylı kullanım klavuzu gibi birşey arıyorum , bulamadım var mıdır acaba?
Başlık: PİC ASSEMBLY ÜZERİNE BAZI ÖNEMLİ NOTLAR
Gönderen: Tagli - 08 Temmuz 2009, 13:06:03
Kendi sitesinde var. Bu dosya (http://ww1.microchip.com/downloads/en/DeviceDoc/MPLAB_User_Guide_51519c.pdf).
Başlık: PİC ASSEMBLY ÜZERİNE BAZI ÖNEMLİ NOTLAR
Gönderen: camby - 08 Temmuz 2009, 13:29:04
Alıntı yapılan: "Tagli"Kendi sitesinde var. Bu dosya.
türkçe arıyorum ama
Başlık: PİC ASSEMBLY ÜZERİNE BAZI ÖNEMLİ NOTLAR
Gönderen: KAZIMUGUR - 08 Temmuz 2009, 23:10:02
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
Başlık: Ynt: PİC ASSEMBLY ÜZERİNE BAZI ÖNEMLİ NOTLAR
Gönderen: quardian - 20 Temmuz 2011, 02:23:27
Ç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.
Başlık: Ynt: PİC ASSEMBLY ÜZERİNE BAZI ÖNEMLİ NOTLAR
Gönderen: muratyamak10 - 01 Ağustos 2011, 22:34:09
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 :-\ :-* :'(
Başlık: Ynt: PİC ASSEMBLY ÜZERİNE BAZI ÖNEMLİ NOTLAR
Gönderen: supermakarna - 29 Ocak 2012, 12:48:15
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
Başlık: Ynt: PİC ASSEMBLY ÜZERİNE BAZI ÖNEMLİ NOTLAR
Gönderen: z - 29 Ocak 2012, 12:58:27
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.
Başlık: Ynt: PİC ASSEMBLY ÜZERİNE BAZI ÖNEMLİ NOTLAR
Gönderen: Extreme - 19 Kasım 2012, 23:48:33
Çok çok faydalı olmuş .

Teşekkürler
Başlık: Ynt: PİC ASSEMBLY ÜZERİNE BAZI ÖNEMLİ NOTLAR
Gönderen: selvi - 15 Şubat 2013, 21:35:22
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?
Başlık: Ynt: PİC ASSEMBLY ÜZERİNE BAZI ÖNEMLİ NOTLAR
Gönderen: 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.
Başlık: Ynt: PİC ASSEMBLY ÜZERİNE BAZI ÖNEMLİ NOTLAR
Gönderen: selvi - 16 Şubat 2013, 21:35:42
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)