Advertisement
INOUETAICHI

New MIERUNDES

Aug 6th, 2016
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.69 KB | None | 0 0
  1. //MIERUNDES AVRそのまま版 (PCINT0使用 attachInterrupt(INT0)不使用)
  2. //LED抜きパワーオン時0.68mA
  3. //200mAh/(320+0.68)mA=37.4204815min.
  4.  
  5. #include <avr/io.h>
  6. #include <avr/interrupt.h>
  7. #include <avr/sleep.h>
  8. #include <util/delay.h>
  9. #include <stdlib.h>
  10. #define sbi(addr,bit) addr|=(1<<bit)
  11. #define cbi(addr,bit) addr&=~(1<<bit)
  12. #define ibi(addr,bit) (bit_is_set(addr,bit)?1:0)
  13.  
  14. int main(void)
  15. {
  16.     /* クロック */
  17.     CCP    = 0xD8;                                  //形態設定変更保護レジスタ設定(分周変更時の保護)
  18.     CLKMSR = 0b00000000;                            //主クロックはデフォルトの8Mhz
  19.     CCP    = 0xD8;                                  //形態設定変更保護レジスタ設定(分周変更時の保護)
  20.     CLKPSR = 0b00000000;                            //分周比を1:1(8Mhz)に変更
  21.  
  22.     /* PWM */
  23.     OCR0AL = 0;                                     //最初はduty0% (LED側でショートしたときに出力0%でリセットされ回路が保護される)
  24.     TCCR0A = 0b10000001;                            //OCR0A:8ビット位相基準PWM動作(比較一致でLOW) / OCR0Bは切断
  25.     TCCR0B = 0b00000001;                            //8ビット位相基準PWM動作 / 8分周(8MHz/8=1MHz)
  26.    
  27.     /* ピン設定 PB3:RESET / PB2:PCINT2,INT0(SW_UP) / PB1:PCINT1(SW_DW) / PB0:OC0A(FETゲート用PWM) */
  28.     /*                               ^^^^^^^^^^^^INT0はPB2                                     */
  29.     DDRB   = 0b00000001;                            //PB0(OC0A)のみを出力に
  30.     DIDR0  = 0b00000001;                            //PB0のデジタル入力を禁止
  31.  
  32.     /* 割り込み */
  33.     PUEB   = 0b00000110;                            //PB2(PCINT2),PB1(PCINT1)タクトスイッチをプルアップ
  34.     PCMSK  = 0b00000110;                            //PB2(PCINT2),PB1(PCINT1)のピン変化割り込み許可
  35.     PCICR  = 0b00000001;                            //PCINT0割り込み許可
  36.     cli();                                          //割り込みを禁止
  37.    
  38.     /* 節電 */
  39.     PRR    = 0b00000010;                            //ADC停止(節電) / TCNT0は温存
  40.     ACSR   = 0b10000000;                            //アナログ比較器動作停止
  41.  
  42.     while(1){                                       //基本的にスリープさせておいて、ボタン押下で割り込み発生させ調光したあと、またスリープ
  43.         if(OCR0AL==0){                              //OCR0AL==0の場合、パワーダウンさせる。PCINT0で復帰。
  44.             sei();                                  //割り込みを許可
  45.             set_sleep_mode(SLEEP_MODE_PWR_DOWN);    //パワーダウン休止状態に設定
  46.             sleep_mode();                           //スリープさせる。INT0割り込みでここから再開
  47.         }
  48.         else{                                       //OCR0AL>0の場合、pwmを維持したままのスリープ。PCINT0で復帰
  49.             sei();                                  //割り込みを許可
  50.             set_sleep_mode(SLEEP_MODE_IDLE);        //アイドル休止状態に設定
  51.             sleep_mode();                           //スリープさせる。INT0割り込みでここから再開
  52.         }
  53.     }
  54. }
  55.  
  56. void dimmer(){
  57.     _delay_ms(50);                                  //スイッチ押下時のチャタリング除去
  58.    
  59.     while(!ibi(PINB,PB1)){                          //SW_DW(PB1)がLOWに落ちている間
  60.         if(OCR0AL>0) OCR0AL--;                      //OCR0ALを減らす
  61.         _delay_ms(4);                               //ディレイ
  62.     }
  63.     while(!ibi(PINB,PB2)){                          //SW_UP(PB2)がLOWに落ちている間
  64.         if(OCR0AL<255) OCR0AL++;                    //OCR0ALを増やす
  65.         _delay_ms(4);                               //ディレイ
  66.     }
  67.    
  68.     _delay_ms(50);                                  //スイッチ開放時のチャタリング除去
  69. }
  70.  
  71. ISR(PCINT0_vect){                                   //ISR(PCINT0_vect)が一括でPCINT0~3ピンの割り込みハンドラとなっている
  72.     cli();                                          //割り込みを禁止(多重割り込みを防止するため)
  73.     dimmer();                                       //割り込みによる復帰後、ボタンの状態から調光を開始
  74. }
  75.  
  76. ISR(INT0_vect){                                     //INT0の割り込みハンドラ
  77.     cli();                                          //割り込みを禁止(多重割り込みを防止するため)
  78.     dimmer();                                       //割り込みによる復帰後、ボタンの状態から調光を開始
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement