0

私はAVRMCUをプログラミングしています。

アナログピンを読み取るPOTがあります。割り込みは常に呼び出されているようですが、LCDが混乱しているため、LCD_displayメソッドの実行中に呼び出す必要があります。

ブロックが実行されるまで、中断を停止する方法はありますか?

int main(void)
{
/*Turn on ADC Interrupt */
ADCSRA |= (1 << ADIE); 

/*Turn On GLobal Interrupts*/
sei();


/* Intalise LCD */
lcd_init(LCD_DISP_ON);                /* initialize display, cursor off */
lcd_clrscr();
lcd_puts("READY");

DDRB &= ~(1 << PINB5);   //set input direction
ADC_Init(128, 0); //initalize ADC


while (1)                         
{

if (!bit_is_clear(PINB, 5))
{
_delay_ms(500);

if (!pressed)
{           
lcd_gotoxy(0,0);
lcd_clrscr();
lcd_puts("test");  //Doesnt work unless I dont comment out the last line of interrupt
pressed = 1;
}

}

/* INTERRUPTS */

//ADC INTERRUPT
ISR(ADC_vect) 
{ 

char adcResult[4];

uint8_t theLowADC = ADCL;
uint16_t theTenBitResults = ADCH<<8 | theLowADC;
itoa(theTenBitResults, adcResult, 10);
ADCSRA |= (1 << ADSC);  //next conversion  *if i comment out this line it works*


} 
4

3 に答える 3

3

割り込みハンドラーがコードに対して正しく動作しない場合、その理由は、割り込みハンドラーに多くの時間を費やしていることが原因である可能性があります。割り込みハンドラーで重要な作業のみを行い、アプリケーションコードで重要性の低い作業を延期する必要があります。ハンドラーとアプリケーションコード間で共有されるフラグを使用してvolatile、アプリケーションコードに実行する必要があるかどうかを通知します。あなたの例でitoaは、アプリケーションコードで呼び出しを延期する必要があります。

于 2012-02-13T10:10:27.033 に答える
0

cli();を使用します。割り込みとsei()を無効にします。表示ルーチンを終了した後、それらを再度有効にします。どのMCUを使用していますか?500msの遅延ではなく、タイマーを適切に使用する必要があります。

于 2012-02-15T10:17:40.107 に答える
0

私は少し遅れていると思いますが、それでも同じ問題があり、次の方法で解決しました。

割り込みは、2つのフラグを使用して有効になります1.グローバル割り込みフラグ2.モジュール関連の割り込みフラグ(この場合はADC)

モジュール関連のフラグを制御できます。この場合、ADCSRA制御レジスタには、ADIE-ADC割り込みイネーブルフラグという名前のフラグがあり、これを使用して割り込みを制御できます。

たとえば、main関数ではフラグを有効にし、ISRではフラグを無効にすることができます。

main()
{
    //enable global flag and ADC flag
    while(1)
    {
        //your logic
        // enable ADC flag
    }
}

ISR()
{
   //disable the ADC flag
}

これで問題が解決することを願っています。

于 2018-03-08T12:41:22.380 に答える