n_shinichi’s blog

日々の備忘録、 趣味のあれこれなど紹介 (すみません、メニュー、リンク、カテゴリー分けがうまくできてません、★記事一覧★で見てください...) NHK魔改造の夜ではDンソーのベテランアドバイザーってことで出ました♪

MENU

ATtiny1614 内部温度センサ値を読むのに四苦八苦... チャットgpt先生のサンプル一例も動かず... スケッチ例をまず見ましょう。。。

まず、スケッチ例をまず見ましょう。。。

まる2日の夜なべ仕事が無駄だった・・・・について

**************************************

2日前...

ATtiny1614でマイクロロボ作るにあたって

  マイコンの状況を測定出来てたら何かと役に立つよな

 

  AVR、ATtiny・・・は大抵のモノは内部温度検出やVccを

  読み取ることができるとのこと。

 

なので調べてやってみようと始めたのだけど

 ATtiny1614でそのものずばりのサンプルが見つけられない。

 

大抵、Arduino でやるなら先輩のありがたいサンプルがあるものだけど

 よー見つけれんかった。

 

で、、、

 チャットgpt先生まともに動くサンプル教えてくれることよくある。

 でも、教えてくれたスケッチ動かない。。。

 なんでWire・・・?

で・・・

あれ?

 内部の2V使うんだっけ?

間違いだったのか・・・

でも、その修正版も動かない。。。

おいおい。。。

で・・・こんなんを10回ほど繰り返したけど

だめで...

 この辺りからチャットgptではダメかな となった。

 

で・・・・しょうがない。ってことでまじめに?

 結局データシート見ながらやることにした

 



だいたいわかった。。。

 

なるほど。。。

 

でもって、あーでもないこーでもないって めんどーだなぁって

思いながらも、、、こんな感じで温度とか取れるようになった。

 

uint16_t adcVal,dL, dH,count,count2;
//bool ADC0_conersionDone(void);
float temp1,temp2;

void setup(){
  Serial.begin(57600);
  ADC0_init();
}

void loop(){
 int8_t sigrow_offset = SIGROW.TEMPSENSE1; // 識票列から符号付き変位(オフセット)補正値読み込み
 uint8_t sigrow_gain = SIGROW.TEMPSENSE0; // 識票列から符号なし利得補正値読み込み
// uint16_t adc_reading = 0; // 1.1V内部基準電圧でのA/D変換結果
  
   if (ADC0_conersionDone())
   {
     dH = ADC0.RESH;
     dL = ADC0.RESL;
     adcVal = dL | (dH << 8);
     count2++;
     ADC0.COMMAND = 0b00000001; // AD start
   }
   uint32_t temp = adcVal - sigrow_offset;
   temp *= sigrow_gain; // 結果(10ビット×8ビット)は16ビット変数を溢れるかもしれません。
   temp += 0x80; // 次の除算で正しい丸めを得るために1/2を加算
//   temp >>= 8; // ケルビン温度を得るために結果を除算
//   uint16_t temperature_in_K = temp-273;  
    temp >>= 4;
    temp1 = temp/16 -273;

  temp2 = 34.0 * (float)adcVal/536.0;
  
  Serial.printf("count %3d   adcValue:%5d   temp1 ",count,adcVal); 
  Serial.print  (String(temp1,2));
  Serial.printf("  temp2 ");
  Serial.println(String(temp2,2));
  delay(1000);
  count++;
 
 }


bool ADC0_conersionDone(void)
{
 return (ADC0.INTFLAGS & ADC_RESRDY_bm);
}

 
void ADC0_init(void)
{

 
 VREF.CTRLA   = 0b00010001;
 ADC0.MUXPOS  = 0b00011110; // temp
 ADC0.CTRLA   = 0b00000001; // 10ビット動作 ADC許可
 ADC0.CTRLC   = 0b01000001; // ref1.1V  clk/4
 ADC0.CTRLD   = 0b10110000;
 ADC0.SAMPCTRL =0b00011111;
 ADC0.COMMAND = 0b00000001; // AD start
 
}

 

 

レジスタいじってやるのなんて組込みで仕事のマイコン

じゃないのに Arduino でやるのに残念・・・

 

ってここまで来て・・・・

 

そーだ、スケッチ例見るの忘れてたっての気が付いた。

readTempVcc なんてのがある!!!!

うそー ってなった。

 

ライブラリ

#include <megaTinyCore.h>  を読み込めば、

readSupplyVoltage();  ・・・でVcc電圧

readTemp(); ・・・・で温度

 

が読める。ちょー簡単... 

この2日間はなんだったんだ。泣きたくなった。

 

まずは

スケッチ例をまず見ましょう。。。でした。