Aslında WinAVR ve avr-gcc paketi içerisinde gelen fakat bir çoğumuz tarafından bilinmeyen/kullanılmayan bir kaynak. İndirmek için tıklayın.
Archive for Kasım, 2011
Atmel AVR programlarken bazen verilerimizi EEPROM’da tutmak isteyebiliriz. Bu veriler her zaman tam sayılar olmayabilir. Eğer saklamak istediğimiz veri float (virgüllü sayılar) ise ne yaparız?
Cevabı avr-gcc de yer alan eeprom.h dosyasında saklı, eğer bu dosyayı açıp bakarsak şu iki fonksiyonu görebiliriz;
/** \ingroup avr_eeprom
Read one float value (little endian) from EEPROM address \a __p.
*/
float eeprom_read_float (const float *__p) __ATTR_PURE__;
/** \ingroup avr_eeprom
Write a float \a __value to EEPROM address \a __p.
*/
void eeprom_write_float (float *__p, float __value);
bu fonksiyonlar sayesinde kolayca kayar noktalı (virgüllü sayılar) eeprom’da kolayca saklanabilir.
Projenize eeprom.h dosyasını eklemek için kodunuza;
#include <avr/eeprom.h>
satırını eklemeniz yeterlidir.
Dikkat! Programınız çok hızlı kesmelere cevap verebilen ya da 3.3ms den hızlı tepki vermesi gereken bir program ise ve saklamak istediğiniz bilgiler elektrik kesintisinden etkilenmesi durumunda verilerin kaybolması sorun oluşturmayacaksa bu verileri RAM bellekte saklanmasında yarar vardır. Zira EEPROM’a yazılan her bir byte için 3.3ms gerekir, double/float veri tipi (avr-gcc’de) 4byte olduğu için, bir double tipindeki verinin EEPROM’a yazılması 10ms civarında vakit alır. Ve EEPROM’a veri yazılması süresince mikrodenetleyici kod işlemez. (Son cümleden araştırma yaparak emin olunuz, ben öyle hatırlıyorum)
Sparkfun 9DOF Razor IMU üzerinde magnetometre ivmeölçer ve gyroscope bulunan bir sensör yumağı, kartta sensörlere ilaveten sensör verilerini işleyerek seri port (UART) üzerinden veri gönderen bir ATmega328p mikrodenetleyici var. Ancak kartın üzerinde gelen programın seri port çıktısı sensörlerden alınan raw (işlenmemiş) verilerden ibaret. Malum bu veri işleme kısmından kurtulmak için IMU alıyoruz böyle bir çıktı vermesi biraz saçma, bütün hesaplamaları yine ben yapacaksam eğer IMU almanın manası nedir ki? İnternnette biraz araştırma sonrasında, http://webbot.org.uk/iPoint/49.page linkinde yer alan yazılımı buldum, bu sitede yer alan hex dosyasını kartınızın ürün koduna göre alıp AVR programlayıcı ile karta aktarıyorsunuz. Sonrasında seri port aracılığıyla üç eksen gyro verisi ve 3 eksen magnetometre verisini alabiliyorsunuz.
Fakat!!!
Programın yazarı kişi çok harika bir kod yazmış olsada baudrate 115200 olarak ayarlamış (mecburen hızlı olmalı çünkü hesaplamalar biraz uzun sürebiliyor) baudrate 115200 olması sebebiyle seri port sinyalinin oluşturulmasında %-3.5 hata oluşuyor. Bunu ona mail aracılığıyla sorduğumda %-3.5 hata kimseyi öldürmez nevinden cevap aldım
Fakat beni öldürür. Yazılım değişikliği öncesinde imu çıktısı aşağıdaki gibidir.
aÁNÇ:3.67,2.25,-3.32,ÍÁÇ:,269.00,70.00,-259.00
fakat olması gereken çıktı: !ANG:3.67,2.25,-3.32,MAG:,269.00,70.00,-259.00
Peki ne yapmalı?
Aynı sitede yazılımın açık kaynak kodu var ve GPL lisanslı. Hemen kodu indirip bir güzel işime yaramayacak magnetometre verisi hesaplamalarını kaldırdım, sonrasında baudrate hatasını %2.1′e düşürmek amacıyla 57600 olarak ayarladım. Baudrate yeterince hızlı saniyede 50 adet 3 eksen gyroscope bilgisi yolluyor ve çok iyi çalışıyor.
Düzeltme sonrasında çıktılar is şöyle:
!ANG:3.55,1.83,2.20
!ANG:3.56,1.84,2.21
!ANG:3.57,1.86,2.21
!ANG:3.55,1.85,2.22
gayet tatmin edici.
Düzeltilmiş versiyonun kaynak kodu ve derlenmiş hex dosyasını indirmek için tıklayın. Dikkat!!! Razor SEN:10125 içindir!!!
Sparkfun 9DOF Razor IMU önerir miyim?
Fiyatı 125$ + kargo!!! Siz bilirsiniz, paranız çoksa neden olmasın ama daha ucuza daha iyisi bulunabilir araştırmak lazım.
