Filed under:
ATxmega関連,
未分類 タグ:
uart通信,
xmega
どうもこんにちは。Shunです。
今回はxmegaのUART通信のソースを公開していきたいと思います。
UART通信って何?っていうひとはggrks Google大先生に聞いてください。
テスト環境はUSARTE1でATxmega128a1uの内部発振子32MHzでボーレート9600bpsです。
ではではコード説明に移りましょう。
void init_usart(void){
PORTE.DIRSET=PIN7_bm;//PORTE7をOUT設定
PORTE.DIRCLR=PIN6_bm;//PORTE6をIN設定
USARTE1_BAUDCTRLA =207 ;//USARTE1のボーレート設定
USARTE1_BAUDCTRLB =0x00 ;//USARTE1のボーレート設定
USARTE1.CTRLC = (USARTE1.CTRLC & ~USART_CHSIZE_gm) | USART_CHSIZE_8BIT_gc;//データbit数設定
USARTE1.CTRLB = (USART_RXEN_bm | USART_TXEN_bm);//TXD,RXD許可
}
以上がUSARTのイニシャライジングです。
特に何もいうところはありませんね。
ボーレート設定はデータシートを読んでください。
以下、データ送信です。
void usart_send(char c)
{
while( !(USARTE1_STATUS & USART_DREIF_bm) ); //Wait until DATA buffer is empty
USARTE1_DATA = c;
}
void usart_string(char *text)//文字データ送信
{
while(*text)
{
usart_send(*text++);
}
}
void usart_putdec(uint16_t data){//4桁数列送信
usart_send(data/1000 + ‘0’);
data %= 1000;
usart_send(data/100 + ‘0’);
data %= 100;
usart_send(data/10 + ‘0’);
data %= 10;
usart_send(data + ‘0’);
}
特にいうことなしですね。
まあ。こんな感じでしょう。
送信完了割り込み等はしておりません。
将来的にできるようになりたいなと。。。
今回は以上ですね。
今はI2CとSPIに苦戦中です。
最後にソースをまとめたものを。
void init_usart(void){
PORTE.DIRSET=PIN7_bm;//PORTE7をOUT設定
PORTE.DIRCLR=PIN6_bm;//PORTE6をIN設定
USARTE1_BAUDCTRLA =207 ;//USARTE1のボーレート設定
USARTE1_BAUDCTRLB =0x00 ;//USARTE1のボーレート設定
USARTE1.CTRLC = (USARTE1.CTRLC & ~USART_CHSIZE_gm) | USART_CHSIZE_8BIT_gc;//データbit数設定
USARTE1.CTRLB = (USART_RXEN_bm | USART_TXEN_bm);//TXD,RXD許可
}
void usart_send(char c)
{
while( !(USARTE1_STATUS & USART_DREIF_bm) ); //Wait until DATA buffer is empty
USARTE1_DATA = c;
}
void usart_string(char *text)//文字データ送信
{
while(*text)
{
usart_send(*text++);
}
}
void usart_putdec(uint16_t data){//4桁数列送信
usart_send(data/1000 + ‘0’);
data %= 1000;
usart_send(data/100 + ‘0’);
data %= 100;
usart_send(data/10 + ‘0’);
data %= 10;
usart_send(data + ‘0’);
}
Filed under:
TEPIA タグ:
LINE MAKER,
TEPIA
さてさて。前回のTEPIAチャレンジ助成事業が、グランプリに輝いて以来、高三の先輩方は受験勉強に本格的に移り始め、クラブ運営が我々高一に移ってきた今日この頃。
何となんと、新入生の新規入部者は、15人を超え、中二、中三、高一でそれぞれ1名づつ、入部しました。部室も賑やかになってきましたね。
本題に入りまして、我々は今回もTEPIAチャレンジ助成事業に応募しました。
今回のテーマは「学校生活で活躍するロボットを開発せよ!」とのことで、なんとか、企画書を、書き上げ応募した理由です。
面接の手応えは良好で、なんとなんと採択されました!
こちらにもある通り、今回は LINE MAKER つまり、校庭の白線引きロボットとしました。
しかし! 見たところ一校の工業高校と、アイデアが被っているようです・・・
どこで差を付けるかが腕の見せ所ですね。
二年連続グランプリ目指して頑張っていきます!!
Filed under:
ATxmega関連
さて。ブログ上では初めまして。
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