Мигание светодиодом с заданным периодом

Пишу программу и столкнулся с проблемой. Не могу заставить мигать светодиодом заданное время (3 секунды горит/ 3 не горит) не использую delay_ms т.к. контроллер что и делает, только занимается отсчетом задержки. А в данном случае, он промигивает и ждет 2 секунды. Как можно обойти, что бы не загружать контроллер. Вот кусочек кода:

  1. static unsigned char e=0;
  2. e++;
  3. if (e > 31*2) {
  4. e=0;
  5. if (GetLevelDOLIV()==1) {
  6. SIGNAL_PORT =! SIGNAL_PORT;
  7. }
  8. }
  9. else SIGNAL_PORT = 0;

Если можно с примерчиком. Часто упоминается про nop но пока не понимаю как его использовать

1. Какой МК используешь? 2.

1. Какой МК используешь?
2. Что еще кроме мигалки будет делать МК?
3. В Какой программе пишешь код? (AVR Studio или CV AVR)

Че такой код странный? )))

Зачем такое условие ставить? "e > 31*2"
Расскажи что еще будет МК едлать а то похоже на кусок кода вырванного из чужой программы с сложной архитектурой.

1. Atmega8 2. Эта программа

1. Atmega8
2. Эта программа для автодолива. Принцип такой, при замыкании нужного электрода, будет происходить включение/отключение помпы и подаваться сигнал(пищалка. вместо пищалки сейчас светодиод)
3. CV AVR
4. Программу мне помогли написать. Все рабочее, только не могу заставить мигать светодиод заданное время (2 секунды горит/ 2 секунды не горит) получается промигивание каждые 2 секунды. Естественно, пищалка не будет работать должным образом.

Вот кусочек кода по больше:

  1. // Timer 0 overflow interrupt service routine
  2. interrupt [TIM0_OVF] void timer0_ovf_isr(void){
  3. static unsigned int i=0;
  4. i++;
  5. if (i > 30*60*10) { //30 раз в секунду х 60 секунд х 10 раз итого 15 минут
  6.  
  7. i=0; // сюда попадаем 1 раз в 10 минут
  8. if (GetLevel()) PUMP_ON(); // если вода ушла - включить помпу
  9. }
  10.  
  11. if (i > 30*60*5) { // 5 минут от начала отсчета
  12. PUMP_OFF(); // через 5 минут от начала отсчета 15-минутного
  13.  
  14. //интервала выключаем помпу в безусловном порядке
  15. }
  16.  
  17. //----------------------------
  18. static unsigned int d=0;d++;if (d > 30*60*1) {
  19. if (GetLevelDOLIV()==1) {
  20. PUMP_OFF();
  21. }
  22. d=0;
  23. }
  24. //-------------------------------------------------------------
  25. static unsigned int e=0;e++;
  26. if (e > 30*2) {
  27. e=0;
  28. if (GetLevelDOLIV()==1) {
  29. SIGNAL_PORT =! SIGNAL_PORT;
  30. }
  31. }
  32. else SIGNAL_PORT = 0;
  33.  
  34. //---------------------------------------------------------------------

Для светодиода заводи

Для светодиода заводи переменную int, завай ей начальное значение 0 (светодиод не горит), в теле программы, когда выполняется работа долива/отлива каждые 2 секунды надо менять эту переменную на 1 и наоборот. Ставишь проверку на простой конструкции

  1. (if a==0;) {a=1;}
  2. else {a=0;}

Две секунды можно отсчитывать внутернним таймером.

Не очень разбираюсь в

Не очень разбираюсь в программировании. Если можно на моем примерчике. Куда что вставить, для наглядности

Так код же не полный, не

Так код же не полный, не видно всей его структуры. И еще момет, я просто пишу под AVR Studio уних с CV AVR синтаксис немного разный. Для понимания работы программы со структурой прийдется разобраться, без этого ну совсем никак.