Home Contact Sitemap

洛星ロボット研究部 開発日誌

洛星中学高等学校のロボット研究部・同好会のブログです。

    アーカイブ
    ブログロール
    • happybusy
    Amazonサーチ
«

初めまして。

さて。ブログ上では初めまして。

63期のプロジェクトAquila所属のShunです。

ちなみに、プロジェクトでは、回路設計、回路制作、組み込みプログラムを担当しております。

さて、Aquilaでは、ロボットのメインのCPUとして、Atmal社のATxmega128a1uを使用しております。

自分は英語が苦手なんですが、何とか英語文献を読んだり、高三生(受験生だよね!?)の力を借りつつ組み込みプログラムをパチパチしております。

自分がネットに日本語文献が数少ないため、苦戦したため、ここに、ソースコードを提供していきたいと思います。

 

記念すべき第1回は(笑 今日、動作確認をとりました、超音波センサのソースとなります。

 

ではでは説明に移りましょう。

まず、使用する超音波センサは、こちらのパララックス社製の超音波センサ。

まあ、回路は、VCC繋げて、GND繋げて、通信線繋げます。

通信線は、xmegaの3.3Vの信号で構いません。

ここまでは、猿でも出来ますねはい。

はい。ほんで、下記のコードを使って、プログラムを作成してください。

─────────────────────────────

#include<avr/io.h>

#include<util/delay.h>

#include<util/interrupt.h>

uint16_t ping (PORT_t *p_port,uint8_t p_pin){
//PD2 ping4で読みたいとき
//ping(&PORTD,PIN2_bm);
p_port->DIRSET=p_pin;//(*p_port).DIRSET
p_port->OUT=p_pin;
_delay_us(4);
p_port->OUTCLR=p_pin;
p_port->DIRCLR=p_pin;
while((p_port->IN&p_pin)==0);
TCC0.CNT=0;
cli();
TCC0.CTRLA=TC_CLKSEL_DIV256_gc;
while((p_port->IN&p_pin)!=0);
TCC0.CTRLA=0x00;
sei();
_delay_ms(7);
return (uint16_t)(TCC0.CNT);
}

─────────────────────────────

 

ちなみに、自分たちはシステムクロックは、32MHzで動かしています。32MHzの場合、1024分周で動かしてやると、大体cm単位で値を出します(※要検証

つまり、6行目のTC_CLKSEL_DIV256_gcをTC_CLKSEL_DIV1024_gcにしてやると、1024分周で動きます。

#include<util/interrupt.h>及び、cli、seiは、波形のcheck時つまり、カウンタ駆動時に、良きせぬ割り込み処理を防ぐためのものです。

 

[使い方]

もし、PORTDの、2PINに、センサの信号線が繋がっている場合

ping(&PORTD,PIN2_bm);

このように使ってもらうといいでしょう。

必ず、ポート名の前の&を忘れないようにしてください。

こんなもんですかね。拙い文章で申し訳ありません。お役に立てたら幸いです。

質問等ごさいましたら、コメントにて宜しくお願いします。

次回以降も、xmegaについてのソースコードを上げていきたいと思います。次回はuart通信のコードの予定です。

実験の様子↓

dav

dav

By 63rd Kayaki . 2017-06-05 . 19:44
コメントお待ちしております! Filed under: ATxmega関連

コメントはありません »

コメントお待ちしております!

RSS feed for comments on this post. TrackBack URL

Leave a comment

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>