Неверно
#define TOIE2 0x06;
#define OCIE2 0x07;
#define AS2 0x08;
Нельзя в дефайнах в Си ставить точку с запятой,
потому, что они затем будут поставлены вместо определяемого значения.
Посмотрите например тут:
http://www.citforum.ru/programming/c/h18.shtml#182
Надо
#define TOIE2 6
#define OCIE2 7
#define AS2 3
А затем подставлять так:
TIMSK |= (1‹‹TOIE2);
ASSR |= (1‹‹AS2);
Можно вообще-то сразу в дефайне записать
#define TOIE2 (1‹‹6)
Но, по моему, это хуже.
__________________________________________________ _____________
//TIMSK |= TOIE2
TIMSK |= 0xC0; // Зараз и ТОИЕ и ОСИЕ
А зачем ОСИЕ?
Ведь у Вас нет обработчика прерывания для него.
А по адресу этого прерывания стоит:
+00000003: CFFC RJMP PC-0x0003
@00000000: .text
+00000000: C011 RJMP PC+0x0012 Relative jump
+00000001: CFFE RJMP PC-0x0001 Relative jump
+00000002: CFFD RJMP PC-0x0002 Relative jump
+00000003: CFFC RJMP PC-0x0003 Relative jump
+00000004: C05E RJMP PC+0x005F Relative jump
+00000005: CFFA RJMP PC-0x0005 Relative jump
// Interrupt vectors definitions
#define EXT_INT0 2
#define EXT_INT1 3
#define TIM2_COMP 4
#define TIM2_OVF 5
То есть при появлении флага по сравнению таймера2,
будет програмный РЕСЕТ. А флаг появится сразу, так как при инициализации
КодеВижин обнулит регистр сравнения.
То есть, вместо:
TIMSK |= 0xC0;
надо:
TIMSK |= (1‹‹TOIE2);
______________
Александр
2006 11 09
PS
Это не относится к Вашему вопросу но здесь у Вас еще ошибка:
if (segment==0x03) {
PORTD=0b00010000;
segment=0x00;};
segment++;
У Вас при работе программы segment никогда не будет нулем,
так как после обнуления сразу инкрементируется и становится единицей.