Awazaru's Blog

筆者の覚え書きです。内容は電子工作とかその他いろいろ。

ラーメンタイマー初号機

マイコンの基本的な機能の勉強のためにラーメンタイマーつくりました。

時間はLED3つで示します。スイッチは2つ用意し1つはスタート用、もう1つはリセット用になっています。まだまだ未完成なところがあり(例えばリセット後勝手にスタートしてしまう)改良の余地はかなり残ってます。進化系としては7セグメントLEDで秒数まで表示することを考えていますが実際に作るかはわかりません。習得したスキルとしては割り込み及びタイマー割り込みです。割り込み制御すばらしいです、強すぎです。

参考にさせていただいたサイトです。
今から始めるAVR
一応コード載せて置きます。

int main(void)
{   //初期化
    //タイマー割り込み
    TCCR1A = 0b00000000;//CTC動作 タイマー1
    TCCR1B = 0b00001011;//64分周動作
    TCCR1C = 0b00000000;
    OCR1AH = 61;
    OCR1AL = 8;//Ca=15624,1秒で割り込み
    TIMSK1  = 0b00000010;//タイマー1A割り込み許可
    
    //割り込み スイッチ用
    EICRA=0b00000010;//INT0がhighからlowに変わると割り込み
    EIMSK=0b00000001;//INT0割り込み許可
    
    //ポート設定
    DDRD  = 0b00000000;//D2を入力にセット
    PORTD = 0b00000100;//D2をプルアップ
    DDRB  = 0b00000000;//B0をスイッチに使用
    PORTB = 0b00000001;//B0をプルアップ
    DDRC = 0b00001111;//C0~2をLEDに、C3をブザーに
    PORTC = 0b0000111;
    
    
    
    //ループ
    for(;;)
    {
        
        sw = PINB;//スイッチ監視
        
        
        if(sw & _BV(PB0))//スイッチ1が押された
        {
            _delay_ms(10);//10ms待つ
            
            sei();//割り込み許可
            
        }
        
        if(count<=60)//1分未満
        {
            PORTC = ff;
            
        }else if(count<=120&&count>60)//2分未満
        {
            PORTC = 0b00000011^(ff<<1);
            
        }else if(count<=180&&count>120)//3分未満
        {
            PORTC = 0b00000111^(ff<<2);
            
        }else if(count<=185&&count>180)//3分以上
        {
            PORTC = 0b00001111;//ブザーを5秒鳴らす
        }
        sw=PINB;
        
    }
    
    
    return 0;
}