Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > Не изменяется ли переменная?


Автор: Коляй 16.8.2006, 12:51
 Ребята, СИ недавно начал изучать. Можно ли так писать? Не изменяется ли переменная Т во время проверки условия?
Код

int T // глобальная переменная.
// прерывание от таймера 2(по переполнению).
 #pragma vector=TIMER2_OVF_vect
__interrupt void org(void){
  T++;}

main(){
  TIMSK=0x10;
  TCCR2=0x07;// Start timer2 /1024
  while(1){
    //....
    //....
    if(!(T%16))
      {
       //вывод значения тока на жки
      }
    if(!(T%32))
      {
      //вывод значения напряжения на жки
      }
   }
}

 Вот не изменяется ли сама Т? А то неровно как то работает - то два раза за секунду выведет, то через две секунды. Что неправильно? (В условиях это я кратность проверяю)

Автор: ManiaK 16.8.2006, 17:23
Цитата(Коляй @  16.8.2006,  12:51 Найти цитируемый пост)
(В условиях это я кратность проверяю)

Мой метод smile  Я так на первых порах тоже делал...

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

Надо, как это ни накладно, на каждый временной цикл свою переменную-счётчик выделять и в прерывании от таймера только декрементировать эти счётчики и ставить флаги, мол, отсчитали своё. А в main::while(1) уже смотреть флаги. Так более надёжно, хотя тоже не лишено проблем...

Надёжней всего разбивать все процедуры так, что они за один раз будут выполняться не дольше, чем период таймера.

Автор: Коляй 17.8.2006, 20:13
 Спасибо. Именно не успевает. Кроме этого, ещё два прерывания работают, одно из них через 6 мс и занимает само 3,5мс (когда по максимуму всё), а на саму программу и не остаётся почти ничего. Придётся переделывать и программу и аналоговую часть! Поспешил однако...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)