Пишу программу на С для AVR. Cуть - плавный пуск.
Проблемный кусок:
Цитата
int n=0;
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
n=n+1;
if (0<n<11) {
TCNT0=0x83;
TCCR0=0x03;
}
if (10<n<21) {
TCNT0=0x91;
TCCR0=0x03;
}
if (20<n<31) {
TCNT0=0x9D;
TCCR0=0x03;
}
}
Объявил глобальную переменную. Присвоил ей нулевое значение. При каждом внешнем прерывании переменная инкрементируется. В зависимости от количества прерываний запускается таймер с разной константой.
То есть первых 10 прерываний - константа будет 0x83
Следующий 10 - 0x91 и т.д.
Но на асемблере получилось не так, как планировалось. Программа проверяет каждое условие и всё равно выполняет все подряд операторы. Например в начале, когда n=1, она проверяет не меньше ли оно 10. Оно меньше. Значит выполняются операторы. Потом идёт вторая проверка.
Тут условие не выполняется, но всё равно операторы выполняются.Программа на асемблере:
Цитата
; 44 // Place your code here
; 45 n=n+1;
MOVW R30,R4
ADIW R30,1
MOVW R4,R30
; 46 second=0;
CLR R6
CLR R7
; 47
; 48 if (0<n<11) {
MOVW R30,R4
LDI R26,LOW(0)
LDI R27,HIGH(0)
CALL __LTW12
CPI R30,LOW(0xB)
BRSH _0x3
; 49 TCNT0=0x83;
LDI R30,LOW(131)
OUT 0x32,R30
; 50 TCCR0=0x03;
LDI R30,LOW(3)
OUT 0x33,R30
; 51 }
; 52
; 53 if (10<n<21) {
_0x3:
MOVW R30,R4
LDI R26,LOW(10)
LDI R27,HIGH(10)
CALL __LTW12
CPI R30,LOW(0x15)
BRSH _0x4
; 54 TCNT0=0x91;
LDI R30,LOW(145)
OUT 0x32,R30
; 55 TCCR0=0x03;
LDI R30,LOW(3)
OUT 0x33,R30
...................................
__LTW12:
CP R26,R30
CPC R27,R31
LDI R30,1
BRLT __LTW12T
CLR R30
__LTW12T:
RET
То что подчеркнул красным проблемные места. Получается R30 всегда либо 1, ли бо 0.
Подскажите, в чём ошибка.
Сообщение отредактировал Владимир_КПИ - Feb 13 2008, 20:21