Arduinoで動くAVRマイコンとして8PinではATtiny202,402,412、14PinではATtiny404,1604,1614を主に使ってきました。

近頃,ATtinyのシリーズとして20PinのATtiny1616が手に入りやすくなっているので試してみました。


・20PinシリーズのPin配置です



PA0がプログラミング用のUPDI (Unified Program and Debug Interface)担当Pinになっているので,8bitのデータがパラレルにフルで使えるポートが無いのはちょっと残念ですが,,アナログ入力ができるPinは多いですね。


・20Pinシリーズのスペックのgithubからの転載です





ハードの準備

秋月電子では単体のATTINY1616-SFRとATTINY1616-MNRがDIP20変換基板に装着済みのキットの2種が販売されています。

ま,どちらにしても半田付けが必要ですのでちょっと準備が必要です(^^)。




単体のATTINY1616-SFRは変換基板に半田付けしますが,基板側のPinと接近している所はMCUの足を先にした方がやりやすいですね。

基板のPin は外側からコテを当てれば特に問題なく付けられると思います。



ミニブレッドボードは半田付けの作業台や仮配線の土台として使っています。
またキットの基板にはPin名が書かれていて,やはり工作には便利ですね(^^)。






・ソフトの準備

Arduino IDE にATtiny202などのためのボードマネージャ「megaTinyCore」が必要です。

・ボードマネージャがあるURLの一つ
http://drazzy.com/package_drazzy.com_index.json
・参考までに
Arduino IDEでボードマネージャ "megaTinycore"が読み込めない時の対処

megaTinyCoreが読み込めればChipにATtiny1616,書き込み装置にUPDI(私はSLOW 57600 baud)を選択しておきます。





・プログラムの書き込み

Arduinoでプログラミングして,ATtiny1616に書き込みます。
ATtiny202などにUSBシリアル経由のUPDI方式で書き込むアダプタを作ってみた

書き込んでLチカを行ってみました。





以上のように動作は確認できました。
8Pinや14PinのATtinyシリーズと同様に8bitマイコンとして安定した動作が期待できそうです。


ついでに,せっかく20Pinあるので4連の7SegLEDをつないでみました。
各Pinの役割分担です。


UARTとI2C担当Pinは外していますので,この状態でもセンサーや通信はつなげますね(^^)。


実際の動作中です。
さすがに素の7SegLEDへの配線はごつくなります(^^;;;;;;。




上の動作のプログラムを一応メモしておきます。
ダイナミック動作へのパラレル出力ですが,特にはポート操作など行わず,普通のdigitalWriteを使っています。

//ATtiny1616 7segLED test1


// 7Seg LED Segment Data for cathode_common :0,1,,,9,A,B(b),C,D(d),E,F
byte segData[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
               0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};


byte segPin[]={14,15,16,0,1,2,3,4};  // Seg._Pin, PA1-7 : Dot_Pin, PB5
byte digPin[]={10,11,12,13};  // Digit_Pin, PC0-3

byte digMax=4;            // Buffer of Disp._data for 4 digit data
byte dBuffer[4];



void setup() {                                 /** SET UP **/
 // initialize digital pins as output.  

 for (byte i = 0; i < 8; i++){ ;  // Seg. Pin
   pinMode (segPin[i], OUTPUT);  
 }

 for (byte i = 0; i < 4; i++) {;  // Digit Pin
   pinMode (digPin[i], OUTPUT);  
 }

} // setup end



void loop() {                                 /** LOOP **/

 for(byte i = 0; i < 13; i++){   // set data
   dBuffer[0]=i;
   dBuffer[1]=i+1;
   dBuffer[2]=i+2;
   dBuffer[3]=i+3;
   for (int j = 0; j< 50; j++){  // call disp. and waiting
     disp7seg();
   }
 }

} // loop end



void disp7seg(){                            /** Disp. Data **/
 
 for (byte i=0;i<digMax;i++){

   byte digBit=0xFF; // Init. digit for cathode_common
   bitClear(digBit, i);
   for (byte j = 0; j < digMax; j++){    // Set digit_bit
     digitalWrite(digPin[j],bitRead(digBit, j));
   }

   for (byte j = 0; j < 8; j++){         // Ascii -> segment_bit
     digitalWrite(segPin[j], bitRead(segData[dBuffer[i]], j));
   }
   delay (5);    // waiting time
 }

} // disp7seg end