Энкодер + Программный шим + atmega8

Всем привет.
Собрал я регулятор тремя светодиодами по схеме:

Только подключена лента светодиодная на 12В через ULN2003.
Частота 8МГц внутренняя.
Программа:

  1. // Принцип работы энкодера. Управляем RGB светодиодом с помощью энкодера
  2. #include <avr/io.h>
  3. #include <avr/interrupt.h>
  4. #include <util/delay.h>
  5.  
  6. volatile char pwm_counter,pwm_r,pwm_g,pwm_b, button = 0;
  7.  
  8. // Обработчик прерывания int0
  9. ISR(SIG_INTERRUPT0)
  10. {_delay_us(50);
  11. if((PIND & (1 << PD2))==0)
  12. {_delay_us(50);
  13. if((PIND & (1 << PD0))==0)
  14. {
  15.  
  16. if(button == 0) // уменьшаем красный цвет
  17. { pwm_r--; if(pwm_r < 1) pwm_r = 1; }
  18.  
  19. if(button == 1) // уменьшаем зеленый цвет
  20. { pwm_g--; if(pwm_g < 1) pwm_g = 1;}
  21.  
  22. if(button == 2) // уменьшаем синий цвет
  23. { pwm_b--; if(pwm_b < 1) pwm_b = 1; }
  24. }
  25.  
  26. else
  27. {
  28. if(button == 0) // увеличиваем красный цвет
  29. { pwm_r++; if(pwm_r > 64) pwm_r = 64; }
  30.  
  31. if(button == 1) // увеличиваем зеленый цвет
  32. { pwm_g++; if(pwm_g > 64) pwm_g = 64; }
  33.  
  34. if(button == 2) // увеличиваем синий цвет
  35. { pwm_b++; if(pwm_b > 64) pwm_b = 64; }
  36.  
  37. }
  38. }
  39. GIFR = (1< 63)
  40. {
  41. PORTB = 0x00;
  42. pwm_counter = 0;
  43. }
  44. if (pwm_counter > pwm_r) PORTB |= (1 << PB0);
  45. if (pwm_counter > pwm_g) PORTB |= (1 << PB1);
  46. if (pwm_counter > pwm_b) PORTB |= (1 << PB2);
  47. }
  48.  
  49. // Главная функция
  50.  
  51. int main (void)
  52. {
  53. DDRB |= (1 << PB5)|(1 << PB4)|(1 << PB3)|(1 << PB2)|(1 << PB1)|(1 << PB0); // выходы
  54. PORTB = 0x00;
  55. DDRD |= (0 << PD2)|(0 << PD1)|(0 << PD0); // входы
  56. PORTD |= (1 << PD2)|(1 << PD1)|(1 << PD0); // подключаем подтягивающие резисторы
  57.  
  58. TIMSK |= (1 << TOIE0); // разрешение прерывания по таймеру0
  59. TCCR0 |= (1 << CS00);
  60.  
  61. MCUCR |= (0 << ISC00)|(1 << ISC01); // прерывание по заднему фронту INT0(по спаду импульса)
  62.  
  63. GIFR |= (1 << INTF0); // очищаем флаг внешнего прерывания
  64. GICR |= (1 << INT0); // разрешаем внешние прерывания INT0
  65.  
  66. sei(); //глобально разрешаем прерывания
  67.  
  68. pwm_r = 64; // начальные установки цветов, min яркость
  69. pwm_g = 64;
  70. pwm_b = 64;
  71.  
  72. while(1)
  73. {
  74. if((PIND & (1 << PD1))==0) // если нажата кнопка
  75. {
  76. while((PIND & (1 << PD1))==0){} // ждем отпускания кнопки
  77. button++;
  78. _delay_ms(100);
  79. if(button == 3)
  80. button = 0;
  81. }
  82. if(button == 0)
  83. PORTB |= (1 << PB3);
  84. if(button == 1)
  85. PORTB |= (1 << PB4);
  86. if(button == 2)
  87. PORTB |= (1 << PB5);
  88. }
  89. }

Сразу скажу что код не мой и не могу разобратса почему не работает.
Устройство собрано и замыканий и непропая нигде нету.

Так а что программа должна

Так а что программа должна делать? зачем два 3х цветных светодиода?
И что именно происходит когда включаешь устройство?

Управление тремя независимыми

Управление тремя независимыми светодиодными лентами. При включении загораются на максимум. Крутишь энкодер - меняется яркость 1 ленты. Нажимаешь на энкодер - включается другой светодиод (сигнализирует о ленте номер два) и меняется яркость другой ленты. Ну и так 3 раза и дальше по кругу.

Ты контроллер какой брал? Тот

Ты контроллер какой брал? Тот что в схеме? Просто иногда люди полагают что если ATmega8 и ATmega88 в одном и том же корпусе то и в средине все одинаково. Бывают различия в регистрах, и все что касается прерываний и тд тп может меняться от МК к МК. И для старта советую все-таки собрать как и на схеме, без лент. Что бы исключить вероятность того, что ты сделал ошибки при подключении лент.

Контроллер atmega8A. Все

Контроллер atmega8A. Все собрал по схеме и понимаю различия между двумя этими контроллерами. Пробовал с простыми светодиодами бел uln-ки - пока глухо. Ищу :(