Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //MIERUNDES AVRそのまま版 (PCINT0使用 attachInterrupt(INT0)不使用)
- //LED抜きパワーオン時0.68mA
- //200mAh/(320+0.68)mA=37.4204815min.
- #include <avr/io.h>
- #include <avr/interrupt.h>
- #include <avr/sleep.h>
- #include <util/delay.h>
- #include <stdlib.h>
- #define sbi(addr,bit) addr|=(1<<bit)
- #define cbi(addr,bit) addr&=~(1<<bit)
- #define ibi(addr,bit) (bit_is_set(addr,bit)?1:0)
- int main(void)
- {
- /* クロック */
- CCP = 0xD8; //形態設定変更保護レジスタ設定(分周変更時の保護)
- CLKMSR = 0b00000000; //主クロックはデフォルトの8Mhz
- CCP = 0xD8; //形態設定変更保護レジスタ設定(分周変更時の保護)
- CLKPSR = 0b00000000; //分周比を1:1(8Mhz)に変更
- /* PWM */
- OCR0AL = 0; //最初はduty0% (LED側でショートしたときに出力0%でリセットされ回路が保護される)
- TCCR0A = 0b10000001; //OCR0A:8ビット位相基準PWM動作(比較一致でLOW) / OCR0Bは切断
- TCCR0B = 0b00000001; //8ビット位相基準PWM動作 / 8分周(8MHz/8=1MHz)
- /* ピン設定 PB3:RESET / PB2:PCINT2,INT0(SW_UP) / PB1:PCINT1(SW_DW) / PB0:OC0A(FETゲート用PWM) */
- /* ^^^^^^^^^^^^INT0はPB2 */
- DDRB = 0b00000001; //PB0(OC0A)のみを出力に
- DIDR0 = 0b00000001; //PB0のデジタル入力を禁止
- /* 割り込み */
- PUEB = 0b00000110; //PB2(PCINT2),PB1(PCINT1)タクトスイッチをプルアップ
- PCMSK = 0b00000110; //PB2(PCINT2),PB1(PCINT1)のピン変化割り込み許可
- PCICR = 0b00000001; //PCINT0割り込み許可
- cli(); //割り込みを禁止
- /* 節電 */
- PRR = 0b00000010; //ADC停止(節電) / TCNT0は温存
- ACSR = 0b10000000; //アナログ比較器動作停止
- while(1){ //基本的にスリープさせておいて、ボタン押下で割り込み発生させ調光したあと、またスリープ
- if(OCR0AL==0){ //OCR0AL==0の場合、パワーダウンさせる。PCINT0で復帰。
- sei(); //割り込みを許可
- set_sleep_mode(SLEEP_MODE_PWR_DOWN); //パワーダウン休止状態に設定
- sleep_mode(); //スリープさせる。INT0割り込みでここから再開
- }
- else{ //OCR0AL>0の場合、pwmを維持したままのスリープ。PCINT0で復帰
- sei(); //割り込みを許可
- set_sleep_mode(SLEEP_MODE_IDLE); //アイドル休止状態に設定
- sleep_mode(); //スリープさせる。INT0割り込みでここから再開
- }
- }
- }
- void dimmer(){
- _delay_ms(50); //スイッチ押下時のチャタリング除去
- while(!ibi(PINB,PB1)){ //SW_DW(PB1)がLOWに落ちている間
- if(OCR0AL>0) OCR0AL--; //OCR0ALを減らす
- _delay_ms(4); //ディレイ
- }
- while(!ibi(PINB,PB2)){ //SW_UP(PB2)がLOWに落ちている間
- if(OCR0AL<255) OCR0AL++; //OCR0ALを増やす
- _delay_ms(4); //ディレイ
- }
- _delay_ms(50); //スイッチ開放時のチャタリング除去
- }
- ISR(PCINT0_vect){ //ISR(PCINT0_vect)が一括でPCINT0~3ピンの割り込みハンドラとなっている
- cli(); //割り込みを禁止(多重割り込みを防止するため)
- dimmer(); //割り込みによる復帰後、ボタンの状態から調光を開始
- }
- ISR(INT0_vect){ //INT0の割り込みハンドラ
- cli(); //割り込みを禁止(多重割り込みを防止するため)
- dimmer(); //割り込みによる復帰後、ボタンの状態から調光を開始
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement