一つ前エントリに合うようレジスタ設定を考える。
OC1A(PB1)あるいはOC1B(PB4)端子を使う。xはAorB
COM1x1 COM1x0=10: タイマリセットでHIGH、OCR1AあるいはOCR1B(xによる)との比較一致でLOW
- TCCR1 = 0b1???1000; // CTC1 PWM1A COM1A1 COM1A0 CS13 CS12 CS11 CS10
CTC1=1: OCR1Cとの比較一致でタイマ1クリア
PWM1A=?(xとしてAを使うなら1)
COM1A1 COM1A0: 上記参照、xとしてAを使うなら10、そうでなければ00
CS13 CS12 CS11 CS10=1000: 128分周
- GTCCR = 0b0???0000; // TSM PWM1B COM1B1 COM1B0 FOC1B FOC1A PSR1 PSR0
TSM = 0 // あまり重要でない
PWM1B=?(xとしてBを使うなら)
COM1B1 COM1B0: 上記参照、xとしてBを使うなら10、そうでなければ00
PSR0 = 0: 1にするとタイマーリセットされる
FOC1B FOC1A = 00: 強制コンペアマッチ、1をセットするとマッチ状態になる。今回使わない。
PSR1 PSR0 = 00: 1をセットすると分周がリセットされるらしい。今回使わない
- TIMSK = 0b00000010; // – OCIE1A OCIE1B OCIE0A OCIE0B TOIE1 TOIE0 –
OCIE1A, OCIE1B=00: OCR1A, OCR1Bマッチによる割り込み許可。割り込みでなくPWM使うので0
OCIE0A, OCIE0B=00: OCR0A, OCR0Bマッチによる割り込み許可。タイマ0は関係ないし、delay()でも使ってないので0
TOIE1=0: タイマ1オーバーフローによる割り込み許可。割り込みでなくPWM使うので0
TOIE0=1: delay()を使いたいので1
こーどはこんなの。長くなったので結果は次のエントリで。
# define INV_PWM_PIN 0 # define PWM_PIN 1 void setup() { pinMode(PWM_PIN, OUTPUT); pinMode(INV_PWM_PIN, OUTPUT); // 端子とレジスタ設定。OC1A(PB1)端子を使う。データシートでOC1Xと書かれていた場合のx=A。 // PB1と反転出力PB0の動作を確認する。 TCCR1 = 0b11101000; // CTC1 PWM1A COM1A1 COM1A0 CS13 CS12 CS11 CS10 // CTC1=1: OCR1Cとの比較一致でタイマ1クリア // PWM1A=1: OC1A(PB1)端子を使うので1 // COM1A1 COM1A0=10: PWMのモード。タイマリセットでHIGH、OCR1Aとの比較一致でLOWという設定 // CS13 CS12 CS11 CS10=1000: 128分周 GTCCR = 0b00000000; // TSM PWM1B COM1B1 COM1B0 FOC1B FOC1A PSR1 PSR0 // TSM = 0: あまり重要でない // PWM1B: xとしてBを使わないので0 // COM1B1 COM1B0=00: PWMのモード。OC1B(PB4)端子を使わないので00 // PSR0=0: 1にするとタイマーリセットされる。関係ない // FOC1B FOC1A=00: 強制コンペアマッチ、1をセットするとマッチ状態になる。関係ない。 // PSR1 PSR0=00: 1をセットすると分周がリセットされるらしい。関係ない TIMSK = 0b00000010; // – OCIE1A OCIE1B OCIE0A OCIE0B TOIE1 TOIE0 – // OCIE1A, OCIE1B=00: OCR1A, OCR1Bマッチによる割り込み許可。割り込みでなくPWM使うので0 // OCIE0A, OCIE0B=00: OCR0A, OCR0Bマッチによる割り込み許可。タイマ0は関係ないし、delay()でも使ってないので0 // TOIE1=0: タイマ1オーバーフローによる割り込み許可。割り込みでなくPWM使うので0 // TOIE0=1: delay()を使いたいので1 OCR1C=156-1; // OCR1Cは比較マッチレジスタ, 156カウントでタイマ1クリア // OCR1A, OCR1Bは比較マッチレジスタ, 4~18の値(サーボ角度0度~180度コントロール)。今回OCR1Aを使う OCR1A= 8; } void loop() { for(int i = 4; i <= 18; ++i) { OCR1A= i; delay(1000); digitalWrite(INV_PWM_PIN, !digitalRead(INV_PWM_PIN)); } }