2016年
1月
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

setup diary

2007|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|06|08|11|
2015|01|02|03|04|05|06|07|08|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|

2016-01-13 最近のAVRの使い方

_ 割り込みを利用するUARTの使い方

AVRを使うときに、以前はtiny2313をよく使っていたが、最近は秋月の価格が高くなって、megaとあまり変わらなくなったので、mega88をよく使うようになってきた。megaの方がtinyよりも安いのは、変な気がする。

AVRの書き込みにはFTDIのFT232RLを使っているが、PCとUSBで通信する時にも同じ石を使っている。arduino-ft232rの書き込みpinとTX,RXの通信pinをつないでおくと、通信と書き込みの両方ができるようになる。この配線をするのが面倒だと思っていたのだが、UncomPatino基板を使うと、この配線をする手間が省けるので、この基板を利用することが多くなってきた。それなら、Arduinoを使えば良いじゃないかとも思えるが、クロック用に2pinを奪われるので、IOに使えるpinが減ってしまう。

PCとは、USBからFT232RLでUARTに変換して、mega88と通信する。そのとき、できるだけマイコンの負荷を減らすには、割り込みをうまく使うと良い。これまで、マイコンが受信するときは、割り込みでバッファに取り込んでいたが、バッファの内容を送信するときには、一文字送信されるのを待って次の文字を送信していた。以下のようにすると、送信のときの処理時間が減らせる。

#define BUFSIZE 100
static volatile unsigned char buf[BUFSIZE];
static volatile unsigned char i_buf=0;
static volatile unsigned char run_CMD=FALSE;
ISR(USART_RX_vect){ /* received */
  volatile unsigned char c;
  c=UDR0;
  buf[i_buf++]=c;
  if(i_buf>=BUFSIZE){i_buf=0;}
  if(c==10){
    run_CMD=TRUE;
    i_buf=0;
  }
}
ISR(USART_UDRE_vect){
  if(buf[i_buf]!=10){UDR0=buf[++i_buf];} //next
  else{i_buf=0;clearbit(UCSR0B,UDRIE0);} //end
}
void buf_rs232c(){ // buffer transmit
  while(checkbit(UCSR0B,UDRIE0)){} //previous buffer transmit is running
  UDR0=buf[i_buf=0];
  setbit(UCSR0B,UDRIE0);
}
ちなみに、setbit,clearbitやcheckbitなども定義している。