Код: Выделить всё
if((tmp_red & 1)==1)
PORTD |= (1<<PD3);
if((tmp_green & 1)==1)
PORTD |= (1<<PD4);
--задержка 20мс--
PORTD &= ~((1<<PD3) | (1<<PD4));
Код: Выделить всё
if((tmp_red & 1)==1)
PORTD |= (1<<PD3);
if((tmp_green & 1)==1)
PORTD |= (1<<PD4);
--задержка 20мс--
PORTD &= ~((1<<PD3) | (1<<PD4));
если я верно понял, то это ужас какой-то...ksv82 писал(а):динамическая индикация - в главном цикле
очевидно, что проблема не в этом куске кода, а в прерываниях: явно где-то в прерываниях происходит запись в PORTD.ksv82 писал(а):Если перед выполнением этих команд запретить прерывания, то все работает нормально.
Код: Выделить всё
PORTD &= ~(1<<PD5)
9c: 82 e3 ldi r24, 0x32 ; 50
9e: 90 e0 ldi r25, 0x00 ; 0
a0: 22 e3 ldi r18, 0x32 ; 50
a2: 30 e0 ldi r19, 0x00 ; 0
a4: f9 01 movw r30, r18
a6: 20 81 ld r18, Z
a8: 2f 7d andi r18, 0xDF ; 223
aa: fc 01 movw r30, r24
ac: 20 83 st Z, r18
Код: Выделить всё
PORTD &= ~(1<<PD5)
94: 95 98 cbi 0x12, 5 ; 18
Зато я вижу ld и st.ksv82 писал(а): Тут даже команд out или cbi я не наблюдаю... и как оно работает?
Код: Выделить всё
9c: 82 e3 ldi r24, 0x32 ; 50
9e: 90 e0 ldi r25, 0x00 ; 0
a0: 22 e3 ldi r18, 0x32 ; 50 0x32 - адрес в памяти на который отражается порт D
a2: 30 e0 ldi r19, 0x00 ; 0
a4: f9 01 movw r30, r18 Загружаем в младшую половину регистра Z смещение на адрес порта в памяти
a6: 20 81 ld r18, Z Загружаем из порта D его значение
a8: 2f 7d andi r18, 0xDF ; 223 Изменяем нужный бит...
aa: fc 01 movw r30, r24 А вот тут как раз подходящее время для появления прерывания:))
Оно как раз с этим портом тоже работает.
ac: 20 83 st Z, r18 Пишем значение порта с измененным битом обратно ... ну и иногда затираем то что сделало прерывание:)