Обсуждаем контроллеры компании Atmel.
Ответить

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт апр 11, 2019 02:30:59

Простой вопрос - могу ли я сдвинуть регистр (допустим порта вывода) какой то одной командой сдвига?

Или я сначала должен прочесть содержимое регистра, потом произвести модификацию содержимого, а потом записать регистр обратно?

PORTB=PORTB<<1;


Если ваш вопрос о том, можно ли записать это через составное присваивание `PORTB <<= 1`, то ответ - да можно. В собственных заголовочных файлах Arduino IDE синтаксис составного присваивания широко используется. Avr-gcc сам разберется, в какую последовательность машинных команд необходимо странслировать такое присваивание для того, чтобы оно работало правильно.

Re: Нескольно простых вопросов о программировании AVR на Си.

Вт апр 16, 2019 08:36:29

Нет, вопрос у меня был про то, можно ли сдвиг регистра порта вывода осуществить одной командой типа LSL. Но, похоже это невозможно.

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт апр 18, 2019 13:17:48

Для дальнейшего сравнения в eeprom записывается значение переменной.
Код:
// Atmel Studio 6
#define F_CPU 8000000UL // 8MHz
uint16_t foo_prev EEMEM;
while(1){
      int foo_current;
//...
      //запись текущего давления в eeprom
      eeprom_update_word(&foo_prev, foo_current);
      _delay_ms(2000);
   }
   return(0);
}
Как записывать в eeprom значение переменной не при каждом изменении переменной, а каждые 6 часов?
Последний раз редактировалось webtime Чт апр 18, 2019 13:28:45, всего редактировалось 2 раз(а).

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт апр 18, 2019 13:26:28

Ну так надо и делать это не чаще 6 часов.

Завести, например таймер, в прерывании которого декрементировать некую переменную. При достижении ею нуля - разрешать обновление переменной в eeprom, а при обновлении - снова сбрасывать эту переменную в начальное значение, обеспечивающее 6 часов декремента до 0.

Последний раз редактировалось WiseLord Чт апр 18, 2019 13:30:46, всего редактировалось 1 раз.

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт апр 18, 2019 13:29:36

Поиск находит только timer с выводом в порт, в данном случае это не надо, только отсчет времени и запись значения переменной.
Нуждаюсь в примере кода :) .

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт апр 18, 2019 13:33:01

Пример см. выше. Возможно, понадобится завести "теневую" (shadow) копию переменной foo_prev. То есть, обновлять её всегда, а значение в eeprom - только раз в 6 часов. При старте программы считывать в эту теневую переменную ячейку eeprom и пользоваться именно ею в качестве _prev значения.

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт апр 18, 2019 13:42:34

Спасибо.
Как завести "теневую" (shadow) копию переменной foo_prev и сделать остальное?
И как задать время 2 минуты, для моделирования в протеусе?
Извините за глупые вопросы.

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт апр 18, 2019 13:48:08

uint16_t foo_prev_shadow;

И использовать именно её там, где сейчас, возможно, используется foo_prev. То есть это "как бы" переменная в eeprom, но на самом деле - нет. То, что в eeprom, обновляется раз в 6 часов.

Или как-то так:
Последний раз редактировалось WiseLord Чт апр 18, 2019 13:57:30, всего редактировалось 2 раз(а).

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт апр 18, 2019 13:52:24

Спасибо.
Код:
ISR ... { // every 1 second
// Error   2   expected '=', ',', ';', 'asm' or '__attribute__' before '...' token
Вместо троеточия должно быть некоторое значение?
1 минута - 21600/360 ?
Последний раз редактировалось webtime Чт апр 18, 2019 14:35:09, всего редактировалось 1 раз.

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт апр 18, 2019 13:56:57

Там должно быть правильное описание прерывания выбранного Вами таймера, настроенного на, например, 1 секунду.

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт апр 18, 2019 14:05:49

Код:
ISR(TIMER0_OVF_vect) { // every 1 second
   if (update_timer) {
      update_timer--;
   }
}
?

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт апр 18, 2019 14:18:19

Ну да. Настраиваете его на то, чтобы срабатывал раз в секунду (зависит от делителей и частоты МК) и всё будет работать как задумано. Не получается ровно раз в секунду - подойдёт любое другое значение, просто пересчитать 6 часов в нужное значение (для 1 сек интервала 6 часов - это 21600 срабатываний, для другой частоты прерываний будет другое значение)

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт апр 18, 2019 14:22:21

Не подскажете в коде, как настроить? Atmega8, частота 8MHz, остальные фюзы заводские (HIGH - D9, LOW - E4).
Код:
#define F_CPU 8000000UL //

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт апр 18, 2019 14:47:46

Пример с делителем 64:
https://github.com/WiseLord/pcm2705/blo ... .c#L66-L67
Прерывание (срабатывает 8000000 / 64 / 256 = 488 раз в секунду) - чуть ниже

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт апр 18, 2019 14:53:15

:shock: и как это применить в нашем случае?

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт апр 18, 2019 14:56:35

Я уже ВСЁ выше написал.

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт апр 18, 2019 16:32:56

Спасибо :( .

Добавлено after 1 hour 15 minutes 49 seconds:
Поискал, почитал, понятнее не стало.

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт апр 18, 2019 17:07:09

:facepalm: вот у тебя была переменная "Х", она быля объявлена в еепром, ты её объяви в ОЗУ, как обычную переменную
а в еепром объяви для хранения значения ещё одну переменную "У".
1) при включении питания (в начале MAIN) делай Х=У; (забираем из еепром значение переменной для дальнейшей с ним работы)
2) при работе программы взаимодействуй с переменной Х (как и раньше)
3) возьми любой периодический процесс или (при отсутствии такогО сделай) подойдет прерывание от любого таймера, посчитай, сколько раз оно вызовется за требуемые 6 часов, вот до стольки и считай, как досчитал - запускай счет сначала и обновляй значение в еепром У=Х...
всё...

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт апр 18, 2019 17:21:12

Понятнее не стало не то, как оно должно работать, оно работает в железе именно так, как вы излагаете. Я никогда не писал для мк, поэтому затруднение вызывает именно реализация инициализация таймера в коде.
Код:
void init(void)
{
   foo_prev = foo_prev_ee;
   //.. init timer to interrupt every 1 sec
   TCCR0 |= (0<<CS02) | (1<<CS01) | (1<<CS00);   /* Prescaler = 64, 125kHz */
   TIMSK |= (1<<TOIE0);                     /* Enable timer compare match interrupt */
}

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт апр 18, 2019 19:53:45

скачай алгоритм билдер - из него получается хорошая шпаргалка по периферии АВРок.
Ответить