Son Yazılar »

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.

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.

XL- MaxSonar®- WR1™ Ultrasonik uzaklık ölçer sensörünün datasheet’inde yazdığına göre en iyi uzaklık okuması sensörün darbe /pulse çıkış pininden yapılabiliyor. Bu kısa kod yardımıyla, kolayca sensörden alınan darbe genişlik miktarı ölçülebilir.

Ana Kod/Main Code:

/*
 *      Pulse width reading main code
 *	interrupt driven, only 1 timer and external
 *	interrupt source needed
 *	Version: 0.1 - tested,working
 *	MCU:ATmega1280 @16MHz (change this code for your uC)
 *  Created on: 30.06.2011
 *      Author: Hasan Yetik - TPHY
 *		Web:hyetik.wordpress.com
 *		e-mail:hyetik89[at]gmail[dot]com
 *      Licensed under GPL. go http://www.gnu.org/licenses/gpl.html
 */

#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <util/delay.h>

#define mask 64     //PORTB.6 signal read pin 2^6=64

volatile uint8_t start=0;
volatile char* text="        ";
volatile long olcum=0;

void init_eint(){
PCICR|=1; 	//PCINT7:0 INT. ENABLE
PCMSK0=255;	//PCINT7:0 ALL INT. ENABLE
}

int main(){
init_eint();
DDRB=0;
PORTB=0;
_delay_ms(200);
sei();

while(1){
if ((PINB==0)& start){
//TR- olcum değişkenini kullanarak istediğiniz işlemi yapın,okunan değer 4 ile carpıp sinyalin darbe genişliği us cinsinden hesaplanabilir.
//ENG- use olcum variable for your calculations, to obtain pulse width simply multiply olcum with 4 and get signal width in us
}
}

}

ISR(PCINT0_vect){
if ((PINB&mask)==mask){
TCNT1=0;
TCCR1B=3;
start=1;
olcum=0;
}
else if((PINB&mask)==0){
olcum=TCNT1;
start=0;
}

}

Bu aralar merak saldığım film (analog) fotoğrafçılık adına makara makara film çektim. İşte ilk makaramdan seçmeler. Umarım beğenirsiniz. Makine: Zenit 122 Lens: Helios 44M-4 58mm f/2  Film: Kodak 200ASA

Fotoğrafların izin alınmadan kopyalanması ve kullanılması5846 sayılı Fikir ve Sanat Eserleri Yasasına göre suçtur.

Lunaparkta zıplayan çocuk:

Kent Ormanından Afyon Kalesi

Afyon Yoncaaltı Camii

Kent Ormanından Afyonkarahisar’ın bir bölümü

“Yalnızlık”

“Hayata Merhaba”

WordPress.com'dan blog alın. | Tema Motion, volcanic tarafından yapılmıştır.
Follow

Get every new post delivered to your Inbox.