2017-05-13 6 views
0

私は現在、PORTD入力をリッスンし、その値に基づいて出力を変更するPCINT2外部割り込みを持つATMega48エミュレータ用の簡単なプログラムを作成しようとしています。ここでATMega48 - 外部PCINT2割り込みを登録するには?

はインタラプタのコードです:

unsigned int d; // a variable that has to change based on the input 

ISR(PCINT2_vect) { 
    if (PORTD % 2 == 0) { 
    if (d <= 8000) { 
     d += 500; 
    } 
    } else { 
    if (d >= 1000) { 
     d -= 500; 
    } 
    } 
} 

main()関数:

int main(void) 
{ 
    DDRD = 0x00; // set PORTC for input 
    DDRB = 0xFF; // set PORTB for output 
    PORTB = 0x00; // Initial value is 0 
    PCMSK0 = 0b00000100; 
    d = 4000; 
    sei(); 

    while (1) { 
    // Enable\Disable the LED with an initial delay 
    if (PIND == 0b00000000) { 
     PORTB = 0b00100000; 
    } else { 
     PORTB = 0b00000000; 
    } 

    // Delay for N seconds (determined by interrupt) 
    delay_stuff(d); 
    } 

    return 1; 
} 

現在、それは関係なく、任意のポートに何が起こるかインタラプタを呼び出していないいない、私の仮定は、Iであります割り込みの呼び出しに魔法のATMegaリスナを登録していません。 割り込みを登録するにはどうすればよいですか?

答えて

1

datasheetページ75-76によると、あなたはPCICRレジスタにピン変化割り込みを有効にして(PCMSK0PINBすなわち、PCINT0ためのものです)PCINT2ためPCMSK2に対応するIO上で有効にされるピン選択する必要があります。

int main(void) 
{ 
    DDRD = 0x00; // set PORTC for input 
    DDRB = 0xFF; // set PORTB for output 
    PORTB = 0x00; // Initial value is 0 

    PCICR |= _BV(PCIE2); //or, PCICR |= 0x04; 
    PCMSK2 |= 0xFF;  //any changes in PIND will trigger interrupt 
    d = 4000; 
    sei(); 

    //other codes... 
} 
関連する問題