割り込みをアクティブにせずに、割り込みの動作を模倣することは可能ですか?
私が尋ねる理由は、私が使用しているマイクロコントローラーは、常に1つの割り込みしかアクティブにできないためです。タイムトリガーシステムを作成しているので、タイマー用に割り込みが設定されています。
基本的に、関数が定期的にデプロイされるように、TTシステム(時間トリガー)を作成する必要があります。私はデータロギングシステムを作成しているので、文字はUARTから入力され、保存および記録されます。シリアルポートの割り込みが必要です。これは、ユーザーからキャラクターが入ってくるときに発生します。したがって、タイマー用とシリアルポート用の2つの割り込みを持つシステムを設計する必要があります。ただし、コントローラは2つの割り込みを同時にアクティブにすることを許可しません。
これが混乱している場合は本当に申し訳ありません。データシートへのリンクをコントローラーに投稿しました。これがインターフェースのコードです。
void Menu_Update(void)
{
uint8_t x=010;
char i;
i= (char)x;
// Perform an appropriate action based on the current state.
//Disable_Interrupt();
//Enable_System_Interrupt(UART1);
timer_count++;
switch (menu_state)
{
case MAIN_MENU :
// Output the initial menu choices and move to the wait state.
Serial_UART_Write_String("Waiting for character input.......\r\n");
Serial_UART_Write_String("To view data, enter 'a' \r\n");
menu_state = MENU_WAIT ;
break;
case MENU_2:
Serial_UART_Write_String("\r\nWould you also like to store this character as well?\r\n");
Serial_UART_Write_String("Yes Enter 'y' \r\n");
Serial_UART_Write_String("No Enter 'n' \r\n");
menu_state = MENU_WAIT ;
break;
case MENU_WAIT :
// Do nothing unless user input was detected.
default:
if (Serial_UART_Received_Data())
{
const char value = Serial_UART_Read();
temp = value;
Serial_UART_Write_String("\r\n***Character: ");
Serial_UART_Write_Char(value);
Serial_UART_Write_String(" has been received***\r\n");
if (value == 'a'||menu_check==1)
{
menu_check =1;
if (value == 'y')
{
menu_check =0;
menu_state = WRITE_CHAR;
}
if (value == 'n')
{
Serial_UART_Write_String("\r\nSegment format -> ");
Serial_UART_Write_String("Character count.Time\r\n");
menu_check =0;
menu_state = DISPLAY;
}
if (menu_check==1)
{
menu_state = MENU_2;
}
}
else
{
menu_state = WRITE_CHAR;
}
}
break;
case WRITE_CHAR:
character_array_storage[character_count]=temp;
charac_time = timer_count - ref_timer;
timer_interval_array[character_count]=charac_time;
character_count++;
Serial_UART_Write_String("\r\n***Character Stored***\r\n");
menu_state = MAIN_MENU;
break;
case DISPLAY:
assign_value(character_count,charac_time);
Serial_UART_Write_String("\r\n***Segments Updated***\r\n");
menu_state = MAIN_MENU;
break;
}
//Disable_Interrupt();
//Enable_System_Interrupt(TIMER0);
}
void Enable_System_Interrupt(const uint32_t int_source)
{
Status_Reg_Set((Status_Reg_Get()& 0xFFFFF8FF) | (int_source << 8));
}
void Status_Reg_Set(uint32_t value)
{
__asm volatile("mtc0 %0, $12" :: "d" ((unsigned long)(value)));
}
データセット ありがとうございます