Здесь принимаются все самые невообразимые вопросы... Главное - не стесняйтесь. Поверьте, у нас поначалу вопросы были еще глупее :)
Ответить

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

Чт янв 20, 2022 18:06:10

При измерении напряжения на терморезисторе вольтметром на 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". В чём дело?

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

Сб янв 22, 2022 03:41:05

Даже я не зная языка Си, скорее всего не ошибусь сказав, что АЦП не настроено должным образом… ну и самого чтения АЦП не наблюдается… :dont_know:

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

Чт янв 27, 2022 17:52:27

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

А с чтением АЦП я так понял это следующий вопрос.

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

Чт фев 03, 2022 17:06:57

[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]);

Теперь другие вопросы, но о них попозже. Надеюсь разобраться сам.
Ответить