AVR C Programlama

Arduino İçerisinde ki Dahili Analog Karşılaştırıcı Modülünü Kullanma [atmega328]



Selamlar , bu yazı içerisinde atmega328p mikrodenetleyicisi içerisinde ki analog karşılaştırıcı biriminin nasıl aktif edilerek , kullanılacağından bahsedeceğim.

Temel olarak analog karşılaştırcıların 2 girişi ve 1 adet çıkışı bulunmakta. Bu girişlerinden negative input pini bizim referans voltajımız , positive input pini ise bizim referans voltajı ile kıyaslamak istediğimiz bir diğer girişimiz.

Capture.PNG

Yukarıda atmega328p datasheetinden alınmış bir görsel mevcut. Bu görsel içerisinde görebileceğiniz gibi AIN1 VE AIN0 girişleri mevcut. AIN0 atmega328 mikrodenetleyicisinin 12.pinine tekabül etmekte , arduino kartı üzerinde ise digital 6.pin. AIN1 ise mikrodenetleyicinin 13.pini , arduino kartı üzerinde ise digital 7.pin. Şayet karşılaştırıcının positive pini üzerinde ki gerilim (arduino kartı için konuşacak olursak digital 6.pin ) negatif pini üzerinde olan gerilimden daha fazla ise ACO biti set edilmiş olacak. Biz bu sayede isr içerisinde işlem yapabileceğiz. Bazı mikrodenetleyicilerde bu ACO biti direkt fiziksel bir pin olarakta dışarıya verildiğini görebilirsiniz.

Diagram üzerinde gördüğünüz bandgap reference seçmeniz durumunuzda karşılaştırıcının  positive pini üzerinde olması gereken  gerilim yaklaşık olarak 1.1v olacaktır. Datasheet içerisinde bandgap reference voltaj üzerinde sıcaklık orantısına bakabilirsiniz. 1.0v ile 1.2v arasında değişiklik gösterebilir.

Karşılaştırıcının negatif pini yukarıda belirttiğim gibi mikrodenetleyicinin 13.pini. Fakat dilerseniz bu girişi donanımın imkan verdiği herhangi bir analog girişe de yol vermenizi sağlıyor. Bunun için datasheet içerisinde “Analog Comparator Multiplexed Input ” başlığını inceleyebilirsiniz. Burada yaptığımız karşılaştırma işleme normal bir adc karşılaştırmasından çok daha hızlı bir şekilde işliyor. Uygulama içerisinde aynı zamanda interrupt kullanacağımız için sürekli bir kontrol yerine gerektiği zaman yapıp ana işleyişe geri döneceğiz.

Analog_Comparator

Devremizi basit haliyle bu şekilde kurduğumuzu düşünelim . Referans olarak yaklaşık 0.9 volt alıyoruz. Positive pinimiz içinse ldr yardımıyla bir gerilim bölücü hazırlıyoruz. Bildiğiniz gibi ldr üzerine düşen ışık miktarı ile direnç değeri değişen bir eleman. Şayet 0.9volt üzeri bir voltaj gelir ise positive pine ,  isr çalışacak ve ekrana trigger olduğunu belirten bir mesaj yazacak. Datasheet içerisinde aktif ettiğimiz register bitlerine ait bilgileri aşağıda ki görsellerden okuyabilirsiniz.

12

 

volatile boolean triggered;

ISR (ANALOG_COMP_vect)
{
triggered = true;
}

void setup ()
{
Serial.begin (9600);
ADCSRB = 0;  // Analog Multiplexer Registerini Disable ediyoruz.
ACSR = bit (ACI) // Interrupt Flag temizlendi.
| bit (ACIE)  // Interrupt birimi aktif edildi.
| bit (ACIS1);  //trigger on falling edge modu seçildi.
}

void loop ()
{
if (triggered)
{
Serial.println (“Triggered!”);
triggered = false;
}

}

 

Farklı modlarda trigger etmenize olanak sağlayan bir yapısı var. Rising ,falling ,toggle gibi seçenekler mevcut. Uygulamada düşen kenar seçildi.

Bricked Olmuş Bir AVR Çipi Nasıl Kurtarılır?


Selamlar bu yazımda sizlere , yanlış girilen sigorta ayarları yüzünden çipinize ulaşamıyorsanız nasıl eski ayarlarına getirebileceğinizdan bahsetmeye çalışacağım.

High Voltage Programming Mode ile yapacağız.

İhtiyacımız olan şeyler bir adet Arduino( Uygulama içerisinde uno kullanılmıştır , nano için aynı uygulama geçerlidir fakat mega için gerekli pinlerin doğru olup olmadığını kontrol etmeniz gerekir )

Transistör , 12v bir kaynak , x6 -1k direnç

Aşağıda ki görselde ki gibi devreyi kurmanız gerekiyor.

Capture

Attiny85 için default durumda ki sigorta ayarları

LFUSE, 0x62
HFUSE, 0xDF   , EFUSE, 0xFF şeklinde olması gerekiyor.

Bağlantıları yaptıktan sonra gerekli yazılıma buradan ulaşabilirsiniz.

Dilerseniz Serial pencereden işlemi takip edebilirsiniz.

AVR C vs ARDUINO


Herkese merhabalar , bugün ki yazım daha çok farkındalık oluşturmak adına olacak.Bildiğiniz gibi atme328p , avr serisinden bir entegre.Lakin insanlara atme328p , programlayabilir misin ya bir proje için dediğiniz de, o da ne la ? moduna giriyor , kısaca kullandığı şeyin farkında bile değil , özellikle mühendislik öğrencileri arduino boardunu c diliyle çok güzel bir şekilde programlayabileceğinin farkında bile değiller  , hem de atmel studio kullanmadan direkt olarak arduino ‘nun kendi arayüzü ile , zira c ile kodlarsanız kodunuz kapladığı alandan dahi büyük ölçüde tasarruf yapabilirsiniz.Nitekim flash hafızası sadece 32kb.Eee iyi de mübarek sen değil misin gömülü sistemci takılacak , sen değil misin bu işi gerçekten öğrenmek isteyen madem öyle azcık kolları sıva yahu 🙂

Şimdi şunu yapacağız , aynı işlevi yapan iki kodu bir , literatürde olmayan arduino diliyle  ve c dili ile kodlayacağız , basit bir usart örneği yapacağız birlikte.

Önce datasheetimizi açıyoruz , http://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf   USART ile ilgili bölüme geliyoruz , sadece okuma kardeim sen de aç şu datasheeti , (sayfa 170) -sayfa 191 e kadar bu usart nedir , nelerden nasıl etkilenir ? hesaplamaları nelerdir ? Hangi registerları nasıl kullanmalıyım , nasıl usartı başlatabilirim ? gibi şeyleri sakince bir oku.Baktın ingilizce , ingilizce öğren en azından teknik bir şeyi okuyacak kadar ! (Güzel ama ingiliçce deme)

Capture.PNG

Asynchronous Normal Mode çalıştırmak için formülümüz yukarda yazıyor.

#define UBRR_VALUE (((F_CPU / (USART_BAUDRATE * 16UL))) – 1)

ne yaptım ubrr_Value yi içler dışlar yaptım çektim oradan.Şimdi sayfa 191 de register tanımlamalarını görüyorsunuz muhtemelen , UDRn – USART I/O Data Register n  ilki buymuş , orada ki “n” usart0 kullanacağımız için 0(sıfır) olacak zaten , kabaca bizim bufferomız burası , gelen veriyi , gönderdiğmiz veriyi burada saklayabileceğimz bahsediyor.

Şimdi veriyi koyacağımız yeri buldukta , bu veriyi biz nasıl alacağız kardeşim değil mi?

Önce usartımı kuralım mı kanka ?

Capture.PNG

Elimizde 12 tane bit bize kalmış oluyor , << ya da >> nedir diye bir bakar mısın kardeşim ?

Şimdi baudayarımızı registerlarımıza yerleştiriyoruz.

UBRR0H = (uint8_t)(UBRR_VALUE>>8);
UBRR0L = (uint8_t)UBRR_VALUE;

Şimdi de , 8 data bits, no parity, 1 stop bit olacak şekilde ayarlayalim.

Capture.PNG

Control registerına geldik , bu bitler ne işe yarar diye aşağıda doğru ilerleyeim datasheette.

Capture.PNG

Baktık 8 bit için ne yapmamız gerektiği yazıyor.

UCSR0C |= (1<<UCSZ01)|(1<<UCSZ00);

Şimdi baud tamam , frame tamam , donanımsal olarak tx rxi kullanacağımız belirtmek gerek değil mi ?

Datasheette şunu bulduk , biraz aşağı indirdik , registerlar ne yapıyor baktık.

Capture.PNG

UCSR0B |= (1<<RXEN0)|(1<<TXEN0);

 

Data alma , gönderme kısımlarını da size bırakarak devam ediyorum.

Şimdi şöyle bir şey yapalım , usarttan aldığımız veriyi geri gönderelim.

C KODU 

#include <avr/io.h>
#define USART_BAUDRATE 9600
#define UBRR_VALUE (((F_CPU / (USART_BAUDRATE * 16UL))) – 1)
void USART0Init(void)
{
UBRR0H = (uint8_t)(UBRR_VALUE>>8);
UBRR0L = (uint8_t)UBRR_VALUE;
UCSR0C |= (1<<UCSZ01)|(1<<UCSZ00);
UCSR0B |= (1<<RXEN0)|(1<<TXEN0);
}
void USART0SendByte(uint8_t u8Data)
{
while(!(UCSR0A&(1<<UDRE0))){};
UDR0 = u8Data;
}
uint8_t USART0ReceiveByte()
{
while(!(UCSR0A&(1<<RXC0))){};
return UDR0;
}
int main (void)
{
uint8_t gelen_data;
USART0Init();
while(1)
{
gelen_data = USART0ReceiveByte();

USART0SendByte(gelen_data);
}
}

Arduino Kodu

void setup()
{
Serial.begin(9600);
}
void loop()
{
uint8_t gelen_data;
if(Serial.available()>0)
{
gelen_data=Serial.read();
Serial.write(gelen_data);
}
}

Sonuçlara bakalım mı ?

Serial pencereden yaptığımızı test ettik

capture

İkisi de aynı işlevi yapıyor da , peki kapladıkları alanlar ?

C İÇİN

Capture.PNG

ARDUINO İÇİN

Capture.PNG

Yorum sizin 🙂 , herkese iyi çalışmalar.

C ile AVR DERSLERİ İÇİN
https://www.youtube.com/playlist?list=PLBTJOzkfYY02EuHiRMr_ivZwTU0AK5l12

C ile AVR Programlama Dersleri


Her hafta ortalama olarak bir ders eklediğim , c ile avr programlama derslerimi youtube üzerinden takip edebilirsiniz arkadaşlar.İzleyenler ya da takip edenler geri dönüş yaparlarsa çok sevinirim.Ha bir de kanalıma abone olmanız 🙂
İyi çalışmalar.
Oynatma listesi :