maxik_k > задал вопрос по ICC, 09.08.2003 21:47:39
Пытаюсь разобраться в AVR, в частности в компиляторе ICC. У меня вопрос:
как обратиться непосредственно к биту регистра в/в, например разрешить все прерывания (средствами С). Через ассемблерную вставку работает.
Ответ: К отдельным битам можно обращться побитовыми операциями - см. Хелп компилятора - см. "Bit Twiddling" - очень подробно описано с примерами.
maxik_k > И второй вопрос.
В нижеприведенном участке проги сразу после установки бита I регистра GIMSK происходит переход на вектор прерывания int0. Причина - установлены флаги внешних прерываний (устанавливаются сразу же после первого перехода, расположенного по 00h). Это ошибка отладчика (AVR Studio3.55) или так и есть в железе? Как от этого избавиться? Как сбросить бит в регистре в/в?
#include
#pragma interrupt_handler inttimer_handler:6
void inttimer_handler()
{
PORTB=0xff;//не важно что
}
void inicialization (void)
{
ACSR=0b10000000; //disable comparator
DDRB=0xff; //port B - in out
GIMSK=0x40; //enable int0
TIMSK=0b10000010; //timer's interrupt - from overflow
MCUCR=0b00001010; //int0, int1 - from falling edge
WDTCR=0b00011111; //watchdog timer - 1,9s end run
TCCR0=0b00000110; //counter (from falling overflow)
TCNT1H=0xfe;
TCNT1L=0xf0;
TCCR1B=0x01;
TCNT0=0xf0;
asm("sei");
}
void main (void)
{
inicialization ();
}
\\\\\
maxik_k > Это ошибка отладчика (AVR Studio3.55) или так и есть в железе? Как от этого избавиться?
перед GIMSK=0x40; //enable int0
нужно запретить все прерывания строкой:
CLI();
\\\\\
AVR Studio3.55 не использую - применяю VMLAB и тебе советую.
... а если хочешь то скачай студию 4.07
http://www.atmel.ru/Binary/ASTUDIO4.EXE \\\\\
Прерывания вкл. и выкл. в компиляторах разных производителей по разному (нужно читать доки), но в ImageCraft см. задачу 4 курса:
CLI(); // запретить все прерывания
SEI(); // разрешить прерывания