Не могу считать значение из массива в FLASH памяти

Здесь принимаются все самые невообразимые вопросы... Главное - не стесняйтесь. Поверьте, у нас поначалу вопросы были еще глупее :)
Ответить
Открыл глаза
Сообщения: 44
Зарегистрирован: Чт фев 21, 2013 20:31:33

Сообщение Valer5 »

При измерении напряжения на терморезисторе вольтметром на Atmega8 записал в флешь память с применением PROGMEM два массива (напряжения и температуры) соответствующими парами.
Включил #include <pgmspace.h>
После считывания результата измерения в прерывании АЦП в регистр привожу код

Код: Выделить всё

 while(1)
{
    if (ACSR&(1<<5))     Для поддержания температуры на заданном 
    {PORTC|=(1<<4); }    
   else
   { PORTC&=~(1<<4); }    значении
   if(adc_counter==64)  // Если количество измерений равно 60
      {
       adc_buffer1=adc_buffer;
       display1=adc_buffer1/10;
       ADCSRA |=(1<<ADEN)|(1<<ADSC); //запуск АЦП
       adc_counter=0;  adc_buffer= 0; //Обнуляем счетчик измерений
       }
          }
  ADCSRA |=(1<<ADEN)|(1<<ADSC);
 // while(adc_buffer1 <pgm_read_word(NAPR[0]))
     k = pgm_read_byte(TEMP[0]);
  }

Пытаюсь прочесть TEMP[0]- наименьшее значение в массиве температур.
Массив температур определён как " char PROGMEM TEMP[]"
Получаю "0". В чём дело?
Реклама
VNS
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1635
Зарегистрирован: Пт дек 10, 2021 12:48:46
Откуда: Тюмень

Сообщение VNS »

Даже я не зная языка Си, скорее всего не ошибусь сказав, что АЦП не настроено должным образом… ну и самого чтения АЦП не наблюдается… :dont_know:
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 352
Зарегистрирован: Ср дек 30, 2020 23:05:29

Сообщение ddr4 »

А как вы узнаёте что получаете "0", у вас в коде нет printf("%d\n", k);.
Вы говорите что записали во флеш массив значений, а вы проверили после записи эти значения?
Вы уверены что флеш доступна для чтения когда вы её читаете?

А с чтением АЦП я так понял это следующий вопрос.
Открыл глаза
Сообщения: 44
Зарегистрирован: Чт фев 21, 2013 20:31:33

Сообщение Valer5 »

[uquote="ddr4",url="/forum/viewtopic.php?p=4169272#p4169272"]А как вы узнаёте что получаете "0", у вас в коде нет printf("%d\n", k);.
Я специально и ввожу переменную "к" и в протеусе в переменных вижу её значение "0".
с настройках АЦП тоже всё в порядке, АЦП читается и результат его виден по величинам adc_buffer в том же протеусе.
Ошибка была, видимо, в наличии промежутка после "if".
А "к" не читалась, т.к. в выражении

Код: Выделить всё

k = pgm_read_byte(TEMP[0]);
надо было указать принадлежность к адресу

Код: Выделить всё

k = pgm_read_byte(&TEMP[0]);
Теперь другие вопросы, но о них попозже. Надеюсь разобраться сам.
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

Вернуться в «Теория»