как включить внешнее прерывание 8051?
8051 внешнее прерывание
- Возможно, вам больше повезет с этим на chiphacker.com. 30.04.2010
Ответы:
Каждое прерывание 8051 имеет свой собственный бит в регистре специальной функции (SFR) разрешения прерывания (IE
) и разрешается установкой соответствующего бита. Приведенные ниже примеры кода написаны на ассемблере 8051, а также на C, чтобы дать общее представление о том, что происходит.
Чтобы включить внешнее прерывание 0 (EX0
), вам нужно установить бит 0 в IE
.
SETB EX0
or ORL IE,#01
or MOV IE,#01
Чтобы включить внешнее прерывание 1 (EX1
), вам нужно установить бит 3 в IE
.
SETB EX1
or ORL IE,#08
or MOV IE,#08
Затем прерывания должны быть глобально разрешены установкой бита 7 в IE
, который является глобальным битом включения/выключения прерывания (EA
). При необходимости вы можете установить высокий приоритет внешних прерываний с помощью SFR приоритета прерывания (IP
).
SETB EA
or ORL IE,#80
Пример на С:
#define IE (*(volatile unsigned char *)0xA8)
#define BIT(x) (1 << (x))
...
IE &= ~BIT(7); /* clear bit 7 of IE (EA) to disable interrupts */
...
IE |= BIT(0); /* set bit 0 of IE (EX0) to enable external interrupt 0 */
...
IE |= BIT(1); /* set bit 3 of IE (EX1) to enable external interrupt 1 */
...
IE ^= BIT(7) /* toggle bit 7 of IE (EA) to re-enable interrupts */
or
IE = 0x89; /* enable both external interrupts and globally enable interrupts */
Различные производители компиляторов 8051 C часто определяют свои собственные методы настройки функций прерывания. Возможно, вам придется обратиться к документации для вашего конкретного компилятора.
Чтобы определить функцию прерывания с помощью компилятора Keil C51 (ссылка в формате pdf на приложение) , указывается номер прерывания и банк регистров, где номер прерывания соответствует определенному адресу вектора прерывания.
void my_external_interrupt_0_routine(void) interrupt 0 using 2
{
/* do something */
}
Чтобы определить функцию прерывания с помощью компилятора 8051 IAR C/C++ (icc8051) (ссылка в формате pdf к справочному руководству), можно использовать ключевое слово __interrupt
и директиву #pragma vector
.
#pragma vector=0x03
__interrupt void my_external_interrupt_0_routine(void)
{
/* do something */
}
Если вы не знакомы с 8051, на www.8052.com можно найти массу информации. Я бы также рекомендовал Микроконтроллер 8051/8052: архитектура, язык ассемблера и аппаратное взаимодействие< /a> написано Крейгом Штайнером, веб-мастером и автором 8052.com.
очень хороший урок, мне очень помог. http://www.8052.com/tutint.phtml
Включите соответствующий бит внешнего прерывания в регистре IE. Если это запуск по уровню, просто напишите подпрограмму, соответствующую этому прерыванию, или активируйте бит регистра TCON, соответствующий прерыванию, запускаемому фронтом, будь то INT0 или INT1.