Elektronik / Elektronik Kaynakları/

M16C24 Mitsubishi (renesas) Mikroişlemci İncelemesi

Sponsorlu Bağlantılar

M16C24 hakkında detaylı bilgiler ve örnek uygulama programı Emeği geçen Kişilere Teşekkürler

M16C/245 Bit Mitsubishi Mikrodenetleyiciler

m16c245-bit-mitsubishi-mikrodenetleyiciler

M16C/245 (M30245) grubu Mitsubishi firmasının M16C çekirdek ailesine teknolojisine bağlı kalınarak üretmiş olduğu 16 bitlik bir mikro denetleyicidir. Bu mikro denetleyicide tek çipli USB ( Üniversal Seri Veriyolu )’ne bağlı USB çevre birimi bulunmaktadır. Bu mikrodenetleyicinin 80 tane bacağı ve plastik’ten yapılmış kılıfı bulunmaktadır. Bu mikrodenetleyici de bulunan tek çipli mikroişlemcinin özelliği; yüksek seviyeli komutlara çok hızlı ve verimli bir şekilde cevap vermesidir.

Bu yüzden bu tür mikrodenetleyicileri haberleşmede, bir çok endüstriyel uygulamalarda daha aklımıza gelmeyen bir çok yüksek hız ve verimlilik gerektiren uygulamalarda kullanılır.

Bir mikro denetleyici aşağıdaki elemanlardan oluşur.

Mikroişlemci: Ön belleğine yazılan programı işleterek istenilen çıkışlara yönlendiren birirmdir. Mikroişlemci veya sayısal bilgisayarlar üç temel kısımdan oluşurlar.( CPU-Merkezi işlem ünitesi ,Giriş-Çıkışlar , ve bellek) I/O ( Giriş -Çıkış ): Sayısal analog ve özel fonksiyonlardan oluşur. Mikroişlemcinin dış dünya ile ilişkisini sağlar. Mikroişlemciye verilen ve işlemlerden alınan veriler bu hat üzerinden sağlanır.

CPU ( Central Proccesing Unit -Merkezi işlem birimi): Sistemin kalbidir.Birim hesapları yapmak ve verileri idare etmek için 4.8 veya 16 bitlik veri formatında çalışır.

Bir mikroişlemcide temelde kullanılan üç yol vardır.

l-) Veri Yolu : Bu yol; işlemci, bellek ve çevre birimleri arasında veri iletmek için kullanılır.

2-) Adres Yolu : Bu yol, işlemcinin program komutlarına ve veri saklama alanlarına erişimi sağlayan bellek adreslerini, ROM ve RAM belleklerine göndermek için kullamlır.

3-) Denetim Yolu : Bu yol Ram belleğine veri yazıldığı veya ondan veri okunduğuna dair bilgi vermek gibi , denetim amaçlan için kullamlır.Bu yol aynı zamanda kesmelerin kullanımına olanak tanıyan bağlantıları da içerir.

Tipik bir mikroişlemci komutunun yürütülmesi her üç yolunda kullanımı gerektirebilir. Böylelikle kullanılan ek devreler artarak maliyet yükselir ve tasarım çok karmaşık hal alır. İşlemci ilk olarak komuta , komut adresini adres yoluna koyarak erişir.îkili kodlardan oluşan bu adres , buna karşılık gelen bellek konumu tarafından tanınır ve bu konum istenen komutu veri yolundan işlemciye gönderir.

Mikrokontrolcü : Bir yazılım olmadan hiçbir işe yaramayan bir plastik metal ve temizlenmiş kum yığınıdır. Mikrokontrolcüyü kontrol eden bir yazılım olduğundan neredeyse sınırsız bir uygulamaya sahiptir. Mikroişlemcili bir sistem yapıldığında mikroişlemcinin yanı sıra hafızalar (RAM, ROM veya EEPROM ), Giriş -Çıkış birimi ve buna benzer bir çok sistem kullanılmaktadır.

Bu karışık sistemin hem tasarlanması ve yapımı zordur ! hem de maliyeti oldukça yüksektir. Mikrokontrolcüler de bir sistemin çalıştırabilmesi için yalnızca bir mikrokontroller ve osilatör devresi kafi gelmektedir. Sistemde gerekli olan ön bellek ve Giriş-Çıkış birimi Mikrokontroller içinde bir yonga halindedir.

M16C24 Genel Donanım Ve Performans Özellikleri

m16c24-donanim-performans-ozellikleri

  • CPU : 16 bit (1 tane donanımsal çarpıcı içerir)
  • En kısa komut işlem süresi: 62.5ns (en kısa komut, f(XIN)=16MHz)
  • Hafıza kapasitesi: 128Kbyte Flash; 10KByte RAM
  • Güç tüketimi: 3.0 – 3.6V (16MHz)
  • Seri I/O: eş zamanlı saat /UART/multi fonksiyon S10 x 2 , eş zamanlı saat/UARTx2 10-bit /8bit analog-sayısal çevirici 16bit
  • zamanlayıcı : 5
  • USB özellikleri : USB 2.0 tam hız özellikleri 0-4 son nokta çifti(IN/OUT transferi)
  • FIFO buffer özellikleri: 3.25 KBytes
  • Emir Sayısı: 91
  • Frekans Çarpıcısı : PLL için 48MHz hızında
  • OTP hafıza kapasitesi : EPROM ( 128 K ) / RAM ( 5 K)
  • Kesmeler: 21 tane iç 4 tane dış kesme kaynağı ve 4 tane de yazılım kesme kaynağı
  • Çok fonksiyonlu zamanlayıcı: 5 x 16-bit, w – entegreli 20mA’lik PWM çıkışları
  • Genel amaçlı Zamanlayıcı : 3 x 16-bit, sadece iç kesme için
  • DMAC : 2 kanallı (16 tane kaynaklı tetikleyici)
  • Analog -Dijital Dönüştürücü: 10 bit ,8 kanal
  • CRC Hesap Devresi : Endüstriyel standart polinom
  • Watchdog Zamanlayıcısı : 15 bit
  • Programlanabilir Giriş-Çıkış sayısı : 63 Hat
  • Yüksek Akım ve Led Sürücüleri : 5 adet yüksek akım ve 8 adet led sürücüsü
  • Saat Darbesi üreteç devres: 1 adet geri besleme direnci
  • Çalışma Sıcaklığı : – 40 C – + 80 C derece

İç Blok Diyagramı

ic-blok-diyagrami

ic-blok-diyagrami-m16c24-mitsubishi

Yukarıdaki blok diyagramda bu mikro denetleyicinin iç diyagramı sembolik olarak gösterilmiştir. Bu türdeki blok diyagramlardan araştırma yaptığımız elemanların bir bakışta içinde neyin olduğunu neyin olmadığını anlayabiliriz.

Burada da bir bakışta, 8 adet zamanlayıcının olduğunu, 8 kanallı 10 bitlik bir ADC sinin olduğunu, USB fonksiyonu olduğunu, Sistem saat darbesi üretecinin olduğunu, hafızasının RAM ve ROM’ dan oluştuğunu, frekans sentez örünün olduğunu, 16-bit’lik CPU çekirdeğinin olduğunu, 15 bitlik waıchdog zamanlayıcısının olduğunu, 2 kanallı DMAC ‘nın olduğunu ve son olarak da Giriş ve Çıkışlarım görüyoruz.

Hafıza Haritası

mc16c-renesas-hafiza-haritasi

Yukarıdaki hafıza haritası M16C/24 grubu mikro denetleyicisine aittir. Adres bölgesi 1Mbyte uzunluğunda olup 00000 ‘dan FFFFF ‘e kadar uzanır. XXXXX16 adresinin üstü ROM belleğine aittir. Örnek olarak M32240EC mikrodenetleyicisin de adres olarak E000016 ‘dan FFFFF16 ‘a 128K byte lık Rom hafızası bulunmaktadır. Özel sayfa vektör tablosu FFEOO adresinden FFFDB adresine kadar haritalanmıştır. Eğer sabrutinlerin başlangıç adresleri yada adreslerin varacağı atlamaları burada kayıt altına alınır. Programların adım numaraları sayesinde, sabrutin çağırma emirleri ve atlama emirleri iki byte’lık emirler tarafından kullanılır.

Kesmeler : Bir kesme geldiğinde, program kendi kesme vektöründeki adres tarafından yürütülür. Vektör tablo adresleri kesmeler için aşağıdaki tabloda karışık olarak verilmiştir. Bu kesmeler seçili kesme bayrakları tarafından efkilenmezler. Kesme tablo kaydedicileri 64 tane vektörü ayarlayabilir. Her bir vektöre 0’dan 63’e herhangi bir yazılım kesmesi atanabilir. BRK emirleri değişken vektör adresleri ve karışık vektör adreslerine sahiptir. FFFE416 den FFFE716

interrupt-source-vector-table-addresses-remarks

Aşağıdaki tablo ise spesifik vektör tablo adres formatını göstermektedir.

spesifik-vektor-tablo-adres-formati

Saat Kontrolü: Ana saat darbesi, mikroişlemcinin ana saat darbe osilatörü devresi tarafından üretilecektir. Reset emri geldiğinde, saat darbesi 8’e bölünür. Ana saat darbe üretecinde stop biti gelirse darbe üretimi de durur. Saat darbe üretimi durdurulurken, güç tüketimi en aza indirgenir.

Watchdog Zamanlayıcısı: Watchdog Zamanlayıcısı programın dışında yürütülen bir fonksiyondur. Watchdog zamanlayıcısı aslında iç zamanlayıcıyı kullanarak saat darbesi türeten 15 bitlik bir sayıcıdır. Bir watchdog zamanlayıcı kesmesi, watchdog zamanlayıcı gerçekleştirilmeye yakın üretilir.

Watchdog zamanlayıcının 7 tane biti kontrol biti olup, Prescaler bölme oranını belirler. Mikroişlemci bir watchdog zamanlayıcı kesmesi isteği bulunduğunda, watchdog zamanlayıcı, watchdog zamanlayıcı başlangıç yazmacı üzerine yazmaya başlar. Prescaler sadece mikroişlemci reset attığında devreye girer. Reset bilgisi iptal edildikten sonra watchdog zamanlayıcısı ve prescaler ikisi de durur.

Aşağıdaki grafik watchdog zamanlayıcısının blok diyagramım göstermektedir.

watchdog-zamanlayicisi-blok-diagram

Reset Konumu : Mikroişlemcili sistemlerde reset devreleri çok önemli bir yere sahiptir. Giriş-Çıkış, program sayacı ve kontrol yazmaçları gibi belirli yazmaçlar için bilinen bir durumun varlığından emin mikroişlemcinin emin olmasını sağlar. Saat’in, doğru frekansa yerleşmesi için yeterli zamanın verilmesini sağlar ve son olarak da şebeke geriliminde bir sorun varsa, mikroişlemcinin düzgün olarak yeniden başlayacağından emin olunmasını sağlar.

DMAC

Bu mikro denetleyici, CPU’nun dışında verileri hafızaya gönderecek iki tane DMAC direk hafıza uygulama kontrolcüsüne sahiptir. Transfer hafıza alanı 3 şekilde olur. Herhangi RAM, ROM ve SFR adreslerinden sabit adreslere, sabit adreslerden herhangi SFR ve RAM adreslerine, sabit bir adresten sabit bir adrese doğru olabilir.

Maksimum olarak 128 kbyte’lık bir veri iletimi söz konusudur. Zamanlayıcı AO’dan zamanlayıcı A4 kesme isteklerinde, zamanlayıcı BO’dan zamanlayıcı B4 kesme isteklerinde, analog dijital çevrim kesme isteklerinde, UART0, UART1, UART2 iletim ve alım kesme isteklerinde, yazılım tetiklemelerinde ve USB fonksiyonu kesme isteklerinde devreye girer. DMAC’m blok diyagramı aşağıdaki gibidir.

dmac-blok-diagrami

Zamanlama (Timing) : Mitsubishi mikrokontrolürde RAM’den okuma işleminde şu işlemler yapılır.Önce Hafıza adres girişine bir adres uygulanır. CS girişine lojik 0 uygulanarak RAM seçilir. Seçilen hafıza hücresinin içeriği, erişim zamanına (Access time ) eşit bir süre sonra, veri çıkışları görülür.Adres hatları diğer bir hafıza hücresine yazmak veya okumak için değiştirilebilir. Bu mikrokontrolürlü sistemde, hafıza adresi mikro işlemci tarafından sağlanır.

Adres ve kontrol girişleri alarak bu girişlerden uygun hafızaya çıkış vermeyi sağlayan kod çözücü ise bu adres ve kontrol girişlerinden CS sinyali üretir.Adres üretiminden sonra, verinin çıkışta okumaya hazır olması için geçen zamana erişim zamanı denir.En az bu kadar bir zaman sonra, mikroişlemci, hafızadan veri okuma sinyalini aktifleyerek hazır olan bilgiyi okur.

Hafıza Özelliği: Mitsubishi mikrokontrolör ‘de 128k byte’lik EEPROM bir hafıza vardır. Bu tür hafızada, bilgiler elektriksel olarak silinebilirler. Silinebilir PROM 1ar da temel olarak ROM 1ar ile aynı özelliklere sahiptirler. Üzerlerine yazılmış bilgiler, ROM türü hafızaların elektrik kesintilerinden etkilenmeme özelliği sayesinde unutulmamakta, dolaysıyla cihazın çalışması esnasında kullanılan, istendiğinde değiştirilebilen ve fakat silinmemesi istenen bilgilerin, çeşitli parametrelerin saklanması için ideal bir çözüm teşkil etmektedir.

Adresleme modları: Mitsubishi mikrodenetleyiciler yazmaç dosyalarını yada data hafızasını direkt yada endirekt yolla adresler.Program sayacını içeren bütün özel fonksiyonel yazmaçlar veri hafızasında haritalanmıştır.Ortogonal(simetrik) bir komut seti, herhangi bir adresleme modunu kullanan herhangi bir yazmaç üzerinde herhangi bir işlemin taşınmasını mümkün kılar. Bu simetri tabiatı ve “özel optimal durumlar “m azlığı , Mitsubishi mikrokontrolür ile programlamayı yeteri kadar verimli hale getirmiştir.Ek olarak şunu da söyleyebiliriz ki öğrenme eğrisi gözle görülür bir şekilde azaltmıştır.

Pin Diyagramları

Vcc, Vss Güç sinyal girişi : 4.2 – 5.5 V arası Vcc kaynağı! 0 V Vss kaynağına bağ

CNVss : Bu pin işlemci modlarında anahtarlama yapar.

RESET Reset Girişi : Girişine lojik olarak sıfır geldiğinde mikroişlemciye atar.

Xin – Xout Saat girişi ve Saat çıkışı : Bu pinler ana saat darbesi üretim devresini sağlarlar.Xin ve Xout pinleri bir seramik rezonatör ve kristal arasına bağlanırlar.

BYTE Dış veri yolu genişletme seçim biti : Giriş olarak lojik düşük seçildiğinde 16 bit’lik dış veri seçimi yapılır. Eğer giriş lojik olarak yüksek seçilmişse 8bit’lik dış veriyolu seçimi yapılır.

AVcc Analog güç kaynağı girişi : Bu pin Analog-Dijital dönüştürücünün güç kaynağı ucudur. Bu pin Vcc’ye bağlanır.

AVss Analog güç kaynağı girişi : Bu pin Analog-Dijital dönüştürücünün güç Kaynağı ucudur. Bu pin Vss’ye bağlanır.

POO— P07 Giriş-Çıkış Portları : Bu pinler 8 bitlik CMOS giriş-çıkış portlarıdır.Bu pinler istendiğinde giriş, istendiğinde ise çıkış olabilirler, yazılım yoluyla tek cip modunda ayarlandığında, 4 tanesi pull-up direncine bağlanabilir.

Pİ0-Pİ7 Giriş-Çıkış Portları : Bu pinler de 8 bitlik giriş-çıkış pinleridir. Yazılım ile ayarlandıklarında dış kesme alabilirler.

P6o— P67 Giriş-Çıkış Portları : Bu pinler de 8 bitlik giriş-çıkış pinleridir Yazılım tarafından seçildiklerinde UARTO ve UART1 giriş-çıkış fonksiyonu olarak kullanılabilir.

P10o—P107 Giriş-Çıkış Portları : Bu pinler P6 pinleri ile aynı özelliğe sahiptirler. Buna ek olarak ta Analog- Dijital dönüştürcünün giriş pinleridir

DW, : DRAM bölsesine ulaşıldığında DRAM üzerine lojik olî düşük yazılır.

Mitsubishi mikrokontrollûrü C dili ile Programlamak

Mikrokontrolör sistemleri ilk zamanlarda tamamıyla asembly dili kullanılarak programlamrdı. Asembly programı ile sistem geliştirme genellikle zaman alır ve geliştirilen sistemin bakımı da oldukça zordu.Son zamanlarda Pascal, C ve Basic gibi diller de bu cihazların programlanması için kullanılmaktadır. Bu dilerin en önemli özellikleri kolay oluşları ve yazılan bir programın kolayca test edilebilmesidir. Asembly dilinin de birçok avantajı bulunmaktadır. Özel ve hız gerektiren uygulamalarda mutlaka asembly dili kullanılmalıdır. M16C24 mikroişlemci C/C++ programları ile programlanmaktadır. M16C24 için gerekli yazılımı http://download.sg.renesas.com/evaluation_software/compilers/m16c/index.html# adresinden download edebilirsiniz.

mc16c-fammily-c-complier

Bit: Bu veri çeşidinde sayılar Boolean ( 0 veya 1 ) olabilir.Örneğin , aşağıdaki tanımda değişken bayrak sadece 0 veya 1 değerlerini alabililir.

Unsigned char: Bu veri çeşidi ile 8 bitlik sayılar tanımlanır ve bu sayılar 0 ve 255 arasında değer alabilirler. Örneğin , aşağıdaki veri tanımında değişken q ,0 ve 255 arasında herhangi bir değer alabilir, ve burada q 190 olarak değerlendirilmiştir.Aynı zamanda I değişken a karakter R ye eşitlenmiştir.Unsigned char tanımı ile hem 8 bitlik bir tamsayı ve hem de bir karakter tanımlanabilir:

Unsigned char q , a;
q=190;
a=’R’;

signed char; İşaret içeren bu veri tanımı, -128 ve +127 arasındaki sayıları tanımlamak için kullanılır.

Yukarıda bahsettiğim değişken tiplerinin yanında unsigned int, long j unsigned long ,float, double gibi değişkenler de bulunmaktadır.

Değişkenlerin Bellekte Saklanması

Statik Değişkenler: Statik değişkenler genel olarak bir fonksiyonda bulunan ve fonksiyonu her kullanışta değerleri değişmeyen değişkenlerdir. Bu değişkenleri tanımlarken isimleri başına statik yazılır.

Volatile Değişkenler : Volatile değişkenler ! bir değişkenin her kullanıldığında eski değerini muhafaza edemeyeceği durumlarda kullanılır. Bütün giriş -çıkış portlan ve kesme rutinlerinin değiştirdiği değişkenler volatile yapılmalıdır.

Persistent Değişkenler: Genel olarak mikrokontrollörler reset yapıldığında programda kullanılan bütün değişkenler ilk olarak sıfır değerini alırlar. Yalnız bazı durumlarda, birtakım değişkenlerin reset esnasında değerlerini kaybetmelerini istemeyebiliriz. Herhangi bir değişkenin ismi önüne persistent kelimesini yazmakla o değişkenin reset esnasında sıfırlanmasını istemediğimizi belirtiriz.

Program Akış Kontrolü : Program akışını değiştiren komutlar asembly dili de olmak üzere herprogramlama dilinde son derece önemlidirler. Bu komutlar sayesinde döngü yapabiliriz, veya bir değişkenin değerine bağlı olarak değişik işlemler yapabiliriz.Bu komutlar aşağıdaki gibidir.

C Dilinde Kesme (Interrupt) Programlaması

Kesme programlaması gerçek zaman mikroişlemci ve mikrokontrolör sistemlerinde son derece önem taşımaktadır. Mitsubishi’nin C derleyicisinde kesme rutini #pragma INTERRUPT ve #pragma PARAMETER fonksiyonları ile çalıştırılır.

Kesme anında program otomatik olarak bu rutine gider ve rutin sonunda kesmeden dönüp bırakmış olduğu program koduna gider. Kesme anında bu fonksiyon içerisinde kesmenin nereden geldiği tespit edilir ve ona göre gereken işlemler yapılır. Kesme anında kesme fonksiyonunda kullanılan değişkenler otomatik olarak saklanırlar ve kesme dönüşünde bu değişkenler otomatik olarak saklanırlar.

Normal olarak kesme her an olabilir ve eğer herhangi bir fonksiyon hem kesme rutini tarafından ve hem de ana program tarafından çağrılırlarsa bu bir hata teşkil eder. Bunun olmasını önlemek için derleyici I kesme seviyesi diye adlandırılan bir direktif sunmaktadır. Bu direktif #pragma interrupt_level şeklinde kullanılmaktadır . 0 ve 1 olmak üzere iki tane kesme seviyesi kullanılabilir

C derleyicisini inceledikten sonra örnek olarak aşağıdaki programı inceleyebiliriz. Aşağıdaki program Mitsubishi mikrokontrollöre bağlanan bir direnç üzerindeki gerilimi ölçerek bunu Analog sayısal çevrim kullanarak sayısal halde ledler üzerinde görmemizi sağlıyor.

Örnek Program

/*********************************************************************************/
/*	R24 potansiyometresi üzerindeki analog gerilim değeri okuyarak	 */
/*	Bu değeri Analog-Sayısal dönüşümü sağlıyarak	                             */
/*	Ledler üzerinde göstermesini sağlar.	                                               */
/*	ADtrg# analog sayısal çevrimi başlatan komuttur.	                   */
/***********************************************************************************/
#include “sfr62.h”
#include “leddata.h”

void main(void);
void initport(void); 
void initADC(void); 
void setADCint(void); 
void ADCint(void); 
void initTimerAl(void); 
void startTimerAl(void); 
void setTimerAlint(void); 
void TimerA1 int(void);

#pragma INTERRUPT ADCint
#pragma INTERRUPT TimerAlint

unsigned char pot_rdg = 0;

void main(void)
{
initport();
initTimerAl();
setADCint();
setTimerAlint();
startTimerAl();
while(l);        // Sonsuz Döngü
}
void initport(void)
{
pdO = 0xFF;       // çıkış modu
pdl = 0xFF;         // çıkış modu
puOO = 0; I         // P0_0'dan P0_3' e pull-up'ı kaldır
puOl = 0;             // P0_4'dan P0_7' e pull-up'ı kaldır
puO2 = 0;            // P1_0'dan P1_3' e pull-up'ı kaldır
p1=0xFD;             // LED2’i seçili hale getir ama LED1’i seçme
p0=0xFF;             //bütün segmentleri kapat 
}

void initADC(void)
{

adcon2=0x01;       //---- ---X
                            // +- 0: bütün değerleri tut
                            // 1: örnekle ve tut


adcon0=0x60;        //	X0X0 0000 – AN0 seçildi
				 // 	|||| +---- sıfır sabiti vuruş modu seçildi
				 // 	||| +------ sıfır sabiti vuruş modu seçildi
				  // 	|| +--------tetikleyici seçme biti yapıldı
				  // 	||            0: yazılım tetiklendi
				  // 	||            1: dış tetikleme yapıldı (ADtrg,P10.0)
				  // 	| +--------   0: A-D çevrim devre dışı hale geldi
				  // 	|                1: A-D çevrim seçili hale geldi
				  // 	+--------   bit 0 frekans seçimi yapıldı 
				  //                   0: fad/4 seçildi
				   //                  1: fad/2 seçildi





/***********NOT:************/
/* Analog Sayısal çevrim başlaması, harici tetikleyicinin Analog Sayısal dönüşümü başlatır. */
/* başlama bayrağı “1” olduğunda ve ADtrg#/P9.7 girişi “H” dan “L” a dönüşür.*/

Adcon1= 0x30; 			//XX1X X0—
			//||||  |+---  sıfır sabiti vuruş modu seçildi
			//|||| +----      0: 8-bit modu
			//||||             1: 10-bit modu
			//|||+------      frekans seçme biti 1 
			//|||                0: fad/2 yada fad/4 seçildi
			//|||               ADCON0’ nun 7bitine bak
			//|||               1: fad seçildi
			//||+-------       1: Vref seçildi
			//||                  Analog-Sayısal çevrim kullanımdaysa 1 olur
			//|+--------         dış opamp bağlantı modu bitleri gösterir
			//+---------         dış opamp bağlantı modu bitlerini gösterir
				// 00: ANEX0 ve ANEX1 kullanımda değil
				// 01: ANEX0 girişine A-D  çevrimi yapıldı 
				// 10: ANEX1 girşine A-D çevrimi yapıldı	
				// 11: harici opamp bağlantı modu
}








void setADCint(void)
{

Adic0x01; 			// ---- XXXX
				//	||||
				//	|||+-- kesme öncelikli seviye seçme biti
				//	||+---  kesme öncelikli seviye seçme biti
				//	|+----   kesme öncelikli seviye seçme biti
				//	|	000:level 0 (kesme devre dışı hale geldi)
				//	|	001:seviye 1
				//	|	010:seviye2
				//	|	011:seviye3
				//	|	100:seviye4
				//	|	101:seviye5
				//	|	110:seviye6
				//	|	111:seviye7
				//	+----- kesme isteği biti
				//		0: kesme istenmiyor
				//		1:kesme isteniyor
}


void ADCint(void)		//kesme fonksiyonu
{

asm(“fset I”);		//kesmeler seçili hale geldi
	pot_rdg = ad01;		//AD0 yazmacından düşük olan biti oku

}




void initTimerA1(void)
{
	
ta1mr = 0x80;		// XX0X XX00
		//	|||| |||+-zamanlayıcı moda bu bit her zaman 0 olmalı
		//	|||| ||+-- zamanlayıcı moda bu bit her zaman 1 olmalı
		//	|||| |+--- 0:Ta1 çıkış olduğunda çıkışta darbe olmaz
		//	|||| |        1:Ta1 çıkış olduğunda çıkışta darbe 1 olur
		//	|||| |        TA0 çıkış olduğunda kapı fonksiyonu olur ve zamanlayıcı sadece saymaya başlar.
		//	||||		TA0 in olduğunda “L” tutulur.
		//	||||		1:olduğunda kapı fonksiyonu olur ve zamanlayıcı sadece saymaya başlar.
		//	||||		TA0 in olduğunda “H” tutulur.
		//	|||+------  	0: olduğunda kapı fonksiyonu hazır değildir.
		//	|||		 1: olduğunda kapı fonksiyonu hazırdır.
		//	||+------- bu bit zamanlayıcı moda her zaman 0 olmalı
		//	|+-------- seçilen kaynak bitleri saymaya başlar
		//	+--------- seçilen kaynak bitleri saymaya başlar
		//		00: f1
		//		01: f8
		//		10: f32
		//		11:fc32
	
	ta1= 0x1388;	//10msn aralıklarla A1 tekrar yüklenmiş zamanlayıcı kurmaya başlar.

//bir led için yenilenme oranını 100 Hz’e ayarlar 
}



void startTimerA1(void)
{

	tabsr |= 0x02;	//	1:olduğunda A1 (sayma bayrağı) zamanlayıcısını başlatır A1

}

void setTimerA1int(void)
{
	
ta1ic = 0x01;		// ---- XXXX
			//	||||
			//	|||+-- Kesme öncelik seviyesi seçme biti
			//	||+--- Kesme öncelik seviyesi seçme biti
			//	|+---- Kesme öncelik seviyesi seçme biti
			//	|	000: seviye 0 (kesme devre dışı hale geldi)
			//	|	001: seviye1
			//	|	010: seviye2
			//	|	011: seviye3
			//	|	100: seviye4
			//	|	101: seviye5
			//	|	110: seviye6
			//	|	111: seviye7
			//	+-----  kesme istek bilgisi
			//		0:olursa kesme istenmiyor
			//		1: olursa kesme isteniyor
}






void TimerA1int(void)			//kesme fonksiyonu başlangıcı
{
	static unsigned char led_select = 0;
	unsigned char ofset, pot_rdg_scaled;

	asm(“fset”);		//kesmeler seçili hale geldiler
	if (led_select == 0)
		{
			led_select = 1;
			p1 = 0xFD;		//LED2 seçili hale getirildi 
						// LED1 devre dışı bırakıldı
			pot_rdg_scaled = ( pot_rdg * 5 * 10 ) / 255  
  /*5.0 V bütün scala seçildi*/
			offset = pot_rdg_scaled %10;
			p0 = leddigit [ offset ];     //ekran ayarı

		}
	else
		{
		led_select = 0 ;
		p1 = 0xFE;			//LED1 seçili halde
						//LED2 ise devre dışı bırakıldı
		pot_rdg_scaled = ( pot_rdg * 5 * 10 ) / 255;
 /***bütün skala seçili hale geldi**/
		
		offset = pot_rdg_scaled / 10;
		p0 = leddigit [ offset ];		//ekran ayarı
		p0 &= 0x7F ; 			//DP yazmacı açıldı
		}

}

Kaynaklar

http://www.eng.newcastle.edu.au/eecs/ect/technical/mitsubishim16c/pdf/M16C_62_UsersManual.pdf
http://www.microcontroller.com/news/Tasking_M16C_v3.asp
http://www.iar.com/index.php?show=9961_ENG&&page_anchor=http://www.iar.com/p9961/p9961_eng.php
http://www.tasking.com/products/m16c/m16c-ds.pdf
http://www.electronicstalk.com/news/tas/tas153.html
http://download.sg.renesas.com/evaluation_software/compilers/m16c/index.html#(C/C++ derleyicilerini bu adresten indirebilirsiniz)
http://a15177702.alturo-server.de/gcc-m16c/200508072059.html
http://www.altium.com/tasking/support/m16c/
http://www.altium.com/files/corp/media/pdfs/mr_task_010604.pdf
http://www.eng.newcastle.edu.au/eecs/ect/technical/mitsubishim16c/mitsubishi.html
http://www.soem.ecu.edu.au/units/ens3541/lectures/Lecture06.pdf
http://www.eng.newcastle.edu.au/eecs/ect/technical/mitsubishim16c/mitsubishi.html#MM_Software (program örnek sample yazılımlarını bu adresten temin edebilirsiniz.)