Adafruit Trinketでタイマー割り込みを使う

目的

タイマー割り込みを使って定期的に処理を実施する

  • WS2822Sの制御のため300ms-500ms程でタイマー割り込みを発生させシリアルLEDに色情報を再送信したい

Trinket利用時の注意事項

開発環境について (ArduinoIDE)

Adafruit ArduinoIDEを利用する必要があります
https://learn.adafruit.com/introducing-trinket/setting-up-with-arduino-ide
https://learn.adafruit.com/adafruit-arduino-ide-setup/mac-osx-setup

また上記アプリケーションをダウンロードした後にシステム環境設定→セキュリティとプライバシー設定から
[ダウンロードしたアプリケーションの実行許可] で すべてのアプリケーションを許可 にしないとダウンロードしたアプリケーションが壊れていますというメッセージが出てしまいました

PC/MACとの接続について(プログラム書き込み)

iMacをお使いの場合直接接続する必要があるかもしれません
USB2.0hubを利用した方がよいとの記事もありましたが
iMacを利用した際には直接接続しないとデバイスを見つける事ができないメッセージが出てしまいました。

早速Lチカ

基板実装のLEDでタイマー割り込みを確認 下記ソースコードにて2.4Hzの周期でLEDをBlinkさせる事が出来ました。

情報がなくて困ったのですが、下記サイトのPDFが非常に参考になりました。 http://w8bh.net/avr/TrinketTimers.pdf

TCCR1設定値の詳細がリンク先pdfに記載してありますのでぜひご確認下さい。
動作概要は下記となります

  • プリスケーラを設定し 488Hzを生成
  • カウントする値を100にセット
  • 100に到達したら ISR(TIM1COMPAvect) 関数が実行される

つまりLチカの速度を遅くするためには OCR1C = 100の値を大きく
逆にLチカの速度を早くするためには OCR1C = 100の値を小さくすればOKです。

digitalRead(ledPin) にて ledPin (1ピン) のH/L状態を読み取り
出力を反転させる事でLチカを実現しています。

また、loop 関数の中は常時実行されているため延々とdelayで1秒間何もしない状態を繰り返しておりますが、Lチカは待たされることなくタイマー割り込みで動作している事を確認できると思います。

#include <avr/interrupt.h>

#define ledPin 1

void setup() {  
  // put your setup code here, to run once:

  // init input/output settings
  pinMode(ledPin, OUTPUT);

  // http://w8bh.net/avr/TrinketTimers.pdf

  // Disable interrupts while we're messing with them
  cli();

  // Clear Timer on Compare
  TCCR1 = (1<<CTC1);
  // all of the prescaler bits are set to 1. The prescaler divides the 8 MHz clock by 16384
  // resulting in a counter frequency of 488 Hz
  TCCR1 |= (1<<CS13) | (1<<CS12) | (1<<CS11) | (1<<CS10);
  // The output frequency for CTC mode is: freq(Hz) = 8 MHz/2/prescaler/(OCR1C+1)
  // resulting a calling TIM1_COMPA_vect frequency is 2.4 Hz
  OCR1C = 100;
  // 
  TIMSK = (1 << OCIE1A);

  // enable interrupts
  sei();
}

void loop() {  
  // put your main code here, to run repeatedly:

  delay(1000);
}

ISR(TIM1_COMPA_vect)  
{
  digitalWrite(ledPin, !digitalRead(ledPin));
}

利用した物

  • Adafruit Trinket 5V Logic

https://www.switch-science.com/catalog/1501/

  • ブレッドボード
    多少余裕のある大きさをおすすめします
    自分は秋月電子で600円の物を利用しています。

http://akizukidenshi.com/catalog/g/gP-00319/

  • ジャンパキット 使い捨てでも良ければ安いものでも全然いけます

お高いですがヘタリが少なく繰り返し使え、ブレッドボードに刺さらない部品もクリップで接続できたり便利です

takashi