Atmega328P ve MikroC + Register Bilgilerinden kendimce ( kenarda dursun )

Katılım
18 Ocak 2008
Mesajlar
1,088
Puanları
156
Yaş
40
Herkese selamun aleyküm değerli ustalarım abilerim ve kardeşlerim. Uzun zamandır atmel yani avr serisi mikrodenetleyici ailesi ile uğraşmak onları biraz kurcuklamak ve azıcık çözmek istiyordum ameliyat olduğum rapor süresi içinde fırsatını yakaladım ve birazcık çözümlemeler yapabildim. Bu çözümlediğim bilgileri burada paylaşmak istiyorum. Zaten eminim ki işi bilen kişiler zaten biliyorlar ama ben hiç bilmeyen benim gibi biraz başlamak isteyen yada öğrenci olan kardeşlerimize faydası olsun açısından paylaşma ihtiyacı duydum, şimdiden faydalı olması dileklerimle...

Konuya önce MikroC programı ile başlayalım neden mikroC ? Bence çünkü neredeyse her aileye yazılım yazılabilen bir derleyici program pic, avr, arm vs... bu yüzden ben severek kullanıyorum denemelerimi de mikroc de yaptım. Ama burada mikroc yi anlatmaya kalksam hem beceremem hem de büyük bir kitap yazılmış elimde var ve o bile bazen çerez gibi kaldığı oluyor...
Birde bedava versiyonu bir çok ticari konuda işimi çözdü bedava diye kullanıcıya ölüm diye bir kural koymamışlar.

Burada önemli olan bir kaç şeyi açıklamak istiyorum.
1 : AVR işlemcilerinde Atmega328P nin datasheetini incelediğim zaman config ayarlarını ( bazen sigorta ayarı da deniliyor ) yazılımda kodlar ile yapılmadığını gördüm. Bunun için bu ayarları programı işlemciye yüklediğiniz yükleme programı ile çözmeniz gerekiyor örneğin ben XGECU TL866 ii plus kullanıyorum

Benim kullandığım yazılımın tik işaret anlamına değinmek istiyorum orada olan ibare örneğin CKDIV8 = 0 ve yanında onay kutusu var burada eğer o kutu işaretlenirse ckdiv8 e 0 değeri atanmış olur işaret kaldırılırsa ckdiv8 = 1 değeri alır buraya dikkat etmek gerekmekte.

hwiv3fs.jpg


Görüldüğü gibi Fuse Low byte ve Fuse High byte diye iki tane alan verilmiş ve aşağıda ok işareti ile işaretlediğim alanda da config menüsüne giriş sekmesini gösterdim.

Şimdi burada önemli olan orada tik işareti ile gösterilen ckdiv8, sut1, sut0, cksel3...cksel0 gibi işaretli alanların ne olduğu işte tam olarak burada devreye datasheet giriyor.

Bu resimde kısaca Fuse Low Byte yani config ayarlarının düşük byte si ile ilgili kısa ve işe yarar bilgiler vermiş.
b80y79n.jpg


Divide clock by 8 = Saat frekansını 8 e böl diyor yani kristal frekansının 8 e bölünerek elde edilen sonuç değer ile çalışacağı anlamında.

CKOUT(3) = Verilen frekansın kare dalga çıkışını aktif yada pasif etme durumu.

SUT1 = Başlangıç zamanını seçin

SUT0 = Başlangıç zamanını seçin

CKSEL3 = Saat kaynağını seçin


CKSEL2 = Saat kaynağını seçin

CKSEL1 = Saat kaynağını seçin

CKSEL0 = Saat kaynağını seçin

Şimdi Ben programlama esnasında Full Swing Crystal Oscillator ile çalışmak istedim ve o şekilde çalıştım. Şimdi Full Swing Crystal Oscillator seçeneğinin açıklandığı datasheet in 29. sayfasından bir kare ekliyorum.
6ca1dmi.jpg


Resimdeki tabloda 0.4 Mhz ile 16 Mhz arasında bir kristal yada seramik rezenatör takabileceğim yazılı ve ben 10 mhz kristal osilatör kullandım ve aynı zamanda bu osilatör kristali için 12-22 pF arası iki tane kondansatör kullanmam gerektiği yazıyor ve işte can alıcı nokta :

Benim Full Swing Crystal Oscillator seçeneğini seçebilmem için cksel1 - cksel2 ve cksel3 bitlerine vermem gereken değerleri bu tabloda gösteriyor. dolayısıyla ben
CKSEL3 = 0
CKSEL2=1
CKSEL1=1 yapmam gerekiyor.

Aşağıdaki resimde ise Full Swing Crystal Oscillator seçeneği için bağlayacağım kristal ve kondansatörlerin devresini veriyor bire bir pic denetleyiciler gibi aynı.

cpkcdzt.jpg


Sut0 ve Sut1 registerleri ile yapılacak ayarları biraz daha detaylıca anlattığı bir alan daha var
7jkj7oa.jpg


Bu tabloda ise Kristal Osilatör, yavaşça artan güç seçeneği olan tablonun en altındaki bütün değerlerin 1 olduğu Crystal Oscillator, slowly rising power seçeneğini kullandım.

İhtiyaç duyan ekte verdiğim datasheet i kullanarak Türkçeye çevirebilir ben de o şekilde https://www.google.com/search?q=tra...HgAgAF8iAHwAZIBAzAuMpgBAKABAQ&sclient=gws-wiz ile türkçe diline çeviri yaparak çözmeye çalıştım.

Şimdi az biraz da ekteki datasheet sayfa 288 de bulunan Fuse High Byte for ATmega328P kısmına bakalım.

kdb7hc5.jpg


RSTDISBL = Harici olarak reset pinini yani pic lerde kullanılan mclre' pinini iptal edip o pini I/O olarak kullanmamızı sağlayan bit eğer bu biti 1 yaparsak o pin reset pini olarak çalışır ve o pinden gelen her hangi bir andaki lojik 0 değeri mikrodenetleyiciyi resetler.

DWEN = Hata ayıklama devrede yada devre dışı biti.

SPIEN = Entegreyi seri hat üzerinden programlamayı etkinleştir yada devre dışı bırak biti.

WDTON = Watchdog Zamanlayıcı Her Zaman Açık yada kapalı biti.

EESAVE = Eeprom belleğin silinmesini koruma biti yani bunu işaretlersek başka program yazmayı unutmamız gerekir.

BOOTSZ1 = Önyükleme Boyutunu Seçin(bkz. Tablo 26-7, sayfa 283) detaylar için)

BOOTSZ0 = Önyükleme Boyutunu Seçin(bkz. Tablo 26-7, sayfa 283) detaylar için)

BOOTRST = Vektörü Sıfırla'yı seçin

Buraya kadar anlatmaya çalıştığım Yerleri kodlar ile programda yazamıyorsunuz yani o bellek yapılarına kodlar ile erişim yok en azından ben yapamadım ve olmadığını da bir kaynaktan okumuştum.

Şimdi biraz da mikroc de yazdığım bir kodu ve bu kodu yazarken aldığım notları paylaşmak istiyorum.

Kod:
void main() {

MCUCR.PUD   =   1 ; /*
PUD (Pull-Up Disable) Bu bit “1” yapıldığında tüm giriş ve çıkış portlarındaki dahili pull-up
dirençleri devre dışı kalır. DDxn ve PORTxn yazmaçlarında pull-up tanımlansa dahi bu
işlem gerçekleşir. Pull-Up dirençlerini devre dışı bırakmayı kaldırmak için bu bit tekrar sıfır
yapılır.*/
//******************************************************************************************************
ADCSRA.ADEN=0; //Bit 7 – ADEN : ADC Faal Bu biti HIGH yapmak ADC’yi faal hale getirir. Sıfır yapınca ADC
//kapatılır. ADC’yi dönüşüm aşamasında kapatmak dönüştürmeyi sonlandırır.
//******************************************************************************************************
ACSR.ACD=1; //ACSR – Analog Karşılaştırıcı Denetim ve Durum Yazmacı
//Bu yazmaç analog karşılaştırıcı hakkında bütün işlemleri yapacağımız yazmaçtır.
//Bit 7 – ACD : Analog Karşılaştırıcı Devre Dışı
//Bu bit bir (1) yapıldığında analog karşılaştırıcıya giden besleme devre dışı bırakılır. Bu bit
//istenilen her zaman devre dışı bırakmak için kullanılabilir. Güç tasarrufu için aklımızda
//bulundurmakta fayda vardır. ACD biti değiştirilirken ACIE biti ile kesmenin de devre dışı
//bırakılması gereklidir.
//********************************************************************************************
didr1.ain0d=0; //Dijital Girişi Devre Dışı Bırakma Yazmacı Bu yazmaçtaki AIN1D ve AIN0D bitleri bir yapılırsa bu ayaklardaki dijital giriş devre dışı
//bırakılır. Böylelikle analog sinyal uygulanan ayaklarda dijital giriş tamponu devre dışı
//bırakılarak güç tasarrufu sağlanır.
didr1.ain1d=0;
/////////////////////////////////////////////////////////////////////////
//***********************************************************************************************************
//Bu yazmaca yazılan HIGH bitleri karşılık gelen ADC kanalındaki dijital girişi devre dışı bırakır.
DIDR0.ADC0D=0;
DIDR0.ADC1D=0;
DIDR0.ADC2D=0;
DIDR0.ADC3D=0;
DIDR0.ADC4D=0;
DIDR0.ADC5D=0;
//**********************************************************************************************
mcucr.pud=1;//PUD (Pull-Up Disable) Bu bit “1” yapıldığında tüm giriş ve çıkış portlarındaki dahili pull-up
//dirençleri devre dışı kalır. DDxn ve PORTxn yazmaçlarında pull-up tanımlansa dahi bu
//işlem gerçekleşir. Pull-Up dirençlerini devre dışı bırakmayı kaldırmak için bu bit tekrar sıfır
//yapılır.
//*************************************************************************************************
//                         DDRx REGİSTERİ BİTLERİ 0 OLURSA GİRİŞ 1 OLURSA ÇIKIŞ OLUR.
ddrb        =   0XFF;
DDRC        =   0X00;
DDRD        =   0XFF;
PORTB       =   0X00;
//*******************************************************
while(1){


}
}

Yukarıdaki yazdığım programın while(1){ ..... } arasındaki kodları siz kendiniz istediğiniz gibi mikroc kurallarına uygun olarak yazabilirsiniz ben burada aslında yukarıda açıklamalarını yaptığım kodları register alanlarını ve o alanların ne işe yaradığını açıklamak için bu kodu paylaşıyorum.

Kodu paylaştıktan sonra Önemle ama çok önemle belirtmek istediğim bir konu var bunun için hemen hemen 2 gün araştırma yaptıktan sonra çözebildim evet komik ama gerçek iki gün araştırma yaptım.

Bir portun her hangi bir pinini çıkış yapıp o çıkışa bir değer vermek için isterseniz

Portb.b0=1;
portb=1;
portb=0b00000001;
pinb.b0=1;

Şeklinde istediğiniz gibi kullanabiliyorsunuz lakin eğer o portun o pini giriş olarak kullanılacak ise işler değişiyor ve aynen pinb.b0 şeklinde yazmanız gerekiyor... Özellikle if komutunu kullanacaksanız.

if(pinb.b0==1){
.......
......
}
else{
.....
.....
.....
}

Umarım faydası olur.
 

Ekli dosyalar

  • 1652894029060.png
    1652894029060.png
    312 bayt · Görüntüleme: 10
  • 1652894043469.png
    1652894043469.png
    312 bayt · Görüntüleme: 7
  • site için yükleme.pdf
    5.8 MB · Görüntüleme: 0
  • full swing-1.jpg
    full swing-1.jpg
    342.7 KB · Görüntüleme: 4
  • full swing-2.jpg
    full swing-2.jpg
    29.6 KB · Görüntüleme: 4
  • full swing-3.jpg
    full swing-3.jpg
    285 KB · Görüntüleme: 4
  • fuse high byte.jpg
    fuse high byte.jpg
    175.4 KB · Görüntüleme: 9
  • fuse low byte.jpg
    fuse low byte.jpg
    133.2 KB · Görüntüleme: 7
  • t866iipls.jpg
    t866iipls.jpg
    158.8 KB · Görüntüleme: 13
Ayrıca çalışma hızı diyebileceğiniz bir
değer var. MC Pic denetkeyicilerde
Fosc / 4 olan bu durum. AVR de 1/1 dir.
Yani seçilen osilatör ile mcu direkt
çalışır.
Bir deney yaptım yularıdaki kodun sonsuz döngüsü içine bir pini high ve low yaptırdım hiç delay kullanmadan ve 1,2 mhz ölçtüm dijital osiloskop ile.

Kristal 10 mhz ile bir pinin high - low olma frekansı bana aşırı az olarak geldi.

Bir programın çevrim süresi 7,8 mhz etki etmez diye düşündüm ama sebebini halen araştırmaktayım :D
 

Forum istatistikleri

Konular
130,047
Mesajlar
932,498
Kullanıcılar
453,017
Son üye
cnturkmenoglu00

Yeni konular

Geri
Üst