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

Обсуждаем контроллеры компании Atmel.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

WiseLord писал(а):Вот именно, только если это число - константа. А в этом случае и макрос не нужен, по большому счёту. По крайней мере, я не могу особо придумать, для чего такое действительно может понадобится - именно инверсия константы.

Я похожим образом на STM32 порты конфигурирую. Передаю маску для пинов, но там все несколько сложнее, чем на avr, в разных регистрах поле инициализации может быть длиной 1, 2 или 4 бита, потому исходную маску нужно превратить в двойную и четверную, причем именно из одной константы получить две других. Правда чистый С для этого не подходит, но на С++ можно хоть из массива данные брать и они будут константами.
Аватара пользователя
ptr128
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

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

Сообщение ptr128 »

Z_h_e писал(а):Препроцессор одно число, заменит на другое.


А для Вас есть принципиальная разница, заменит на число препроцессор или компилятор?
Ведь компилятор, обнаружив константное выражение, все равно не будет генерить код для его вычисления, а просто подставит Вам вычисленную по этому выражению константу. Можете проверить.
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

ptr128 писал(а):А для Вас есть принципиальная разница, заменит на число препроцессор или компилятор?
Ведь компилятор, обнаружив константное выражение, все равно не будет генерить код для его вычисления, а просто подставит Вам вычисленную по этому выражению константу. Можете проверить.

После препроцессора компилятор все равно будет выполнять тот же код, что и в случае с inline функцией, только кажется не все это понимают :)
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

как можна упростить этот кусок кода ?

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

   eeprom_update_byte (&cp_alarm_1.turn, alarm_1.turn);
   eeprom_update_byte (&cp_alarm_1.hour, alarm_1.hour);
   eeprom_update_byte (&cp_alarm_1.min,  alarm_1.min);

   eeprom_update_byte (&cp_alarm_2.turn, alarm_2.turn);
   eeprom_update_byte (&cp_alarm_2.hour, alarm_2.hour);
   eeprom_update_byte (&cp_alarm_2.min,  alarm_2.min);

   eeprom_update_byte (&cp_alarm_3.turn, alarm_3.turn);
   eeprom_update_byte (&cp_alarm_3.hour, alarm_3.hour);
   eeprom_update_byte (&cp_alarm_3.min,  alarm_3.min);

   eeprom_update_byte (&cp_alarm_4.turn, alarm_4.turn);
   eeprom_update_byte (&cp_alarm_4.hour, alarm_4.hour);
   eeprom_update_byte (&cp_alarm_4.min,  alarm_4.min);

   eeprom_update_byte (&cp_alarm_5.turn, alarm_5.turn);
   eeprom_update_byte (&cp_alarm_5.hour, alarm_5.hour);
   eeprom_update_byte (&cp_alarm_5.min,  alarm_5.min);

   eeprom_update_byte (&cp_alarm_6.turn, alarm_6.turn);
   eeprom_update_byte (&cp_alarm_6.hour, alarm_6.hour);
   eeprom_update_byte (&cp_alarm_6.min,  alarm_6.min);

   eeprom_update_byte (&cp_alarm_7.turn, alarm_7.turn);
   eeprom_update_byte (&cp_alarm_7.hour, alarm_7.hour);
   eeprom_update_byte (&cp_alarm_7.min,  alarm_7.min);
Tell Me The Truth
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

все алармы объединить в одну структуру (судя по хвостику _0 и т.п. в имени аларма, то логичнее объединить их в массив) и использовать сразу обновление ее при помощи eeprom_update_block :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

изначально задумывался такой формат, поскольку я полагал что будед понятней писать alarm_1.hour = чем alarms.hour_1 =
мне показалось так логичней :roll:

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

struct{
   uint8_t turn; // прем. для вкл/выкл будильника on=1, off=0
   uint8_t hour;
   uint8_t min;
}alarm_1, alarm_2, alarm_3, alarm_4, alarm_5, alarm_6, alarm_7;
Tell Me The Truth
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

судя по всему еще логичнее так:

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

#define ALARM_CNT   7
typedef struct{
   uint8_t turn; // прем. для вкл/выкл будильника on=1, off=0
   uint8_t hour;
   uint8_t min;
}alarm_t;

EEMEM alarm_t alarm[ALARM_CNT];
тогда будет совсем удобно писать alarm[2].hour
не говоря уж о том, что проверять время срабатывания всех алармов можно будет в цикле...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
strengerst
Вымогатель припоя
Сообщения: 516
Зарегистрирован: Пт янв 18, 2013 15:11:02

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

Сообщение strengerst »

Помогите подключить код к Proteusu что бы терминал отображал отправляемые данные. Вот мой код на Си и снимки Proteusa.
Спойлер

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

/*
 * USARTATMEGA8.c
 *
 * Created: 05.12.2016 9:28:13
 *  Author: st
 */


#include <avr/io.h>
#define F_CPU 4000000
unsigned char Danue;
int main(void)

{
   /*Настраиваем соответствующий порт передачи на выход*/
   PORTD|=(1<<PD1);
   /*Устанавливаем бит разрешение передачи*/
   UCSRB|=(1<<TXEN);
   //Переходим в регистр UCSRC
   UCSRC|=(1<<URSEL);
   //Размер передоваемого слова выставляем на 8 бит.*/
   UCSRC|=(1<<UCSZ1)|(1<<UCSZ0);
   //Выбираем режим работы ассинхронный
   UCSRC&=~(1<<UMSEL);
   //Проверка на четность выставляем в ноль
   UCSRC&=~(1<<UPM1)&(1<<UPM0);
   //Количество стоп битов также ставим 1
   UCSRC&=~(1<<USBS);
   //Устанавливают скорость передачи в бодах
   UCSRC&=~(1<<URSEL);//Переходим в регистр UBRR;
   UBRRL=0x34;//Младший бит
   UBRRH=0x00;//Старший бит
   Danue=0;
   
    while(1)
    {
      
      //Проверяем флаг UDRE — флаг опустошения регистра передатчика,
      //устанавливается в 1 при пустом буфере передатчика — UDR =1 значит можно передавать буфер пуст;
        if ((Danue==0)&&(UCSRA|(1<<UDRE)))
        { //Отправляем только один раз
         UDR=0x20;
         Danue++;
         asm("nop");
        }
      asm("nop");
    }
}
Вложения
Atmega8.png
(136.12 КБ) 317 скачиваний
Atmega8.1.png
(169.48 КБ) 326 скачиваний
Аватара пользователя
prinv
Вымогатель припоя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь
Контактная информация:

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

Сообщение prinv »

Ещё один проводок rxd-txd проложите :))
Никакая контра не уйдёт от нас
Аватара пользователя
strengerst
Вымогатель припоя
Сообщения: 516
Зарегистрирован: Пт янв 18, 2013 15:11:02

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

Сообщение strengerst »

Положил но он все ровно не показывает , пустое черное окно терминала. Может проблема в терминале? Вот скрин его настроек.
Вложения
Atmega8.3.png
(156.99 КБ) 234 скачивания
Atmega8.2.png
(105.34 КБ) 312 скачиваний
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

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

Сообщение Vov123 »

В проте надо указать частоту процессора.
Аватара пользователя
strengerst
Вымогатель припоя
Сообщения: 516
Зарегистрирован: Пт янв 18, 2013 15:11:02

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

Сообщение strengerst »

Указал но не понимая почему Proteusне видит код. Вот что видит только Proteus

СпойлерИзображение
Вложения
Atmega8.4.png
(56.4 КБ) 458 скачиваний
Аватара пользователя
ptr128
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

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

Сообщение ptr128 »

ARV писал(а):судя по всему еще логичнее так:

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

#define ALARM_CNT   7
typedef struct{
   uint8_t turn; // прем. для вкл/выкл будильника on=1, off=0
   uint8_t hour;
   uint8_t min;
}alarm_t;

EEMEM alarm_t alarm[ALARM_CNT];
тогда будет совсем удобно писать alarm[2].hour

ARV абсолютно прав. И теперь весь процесс можно записать еще проще:

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

for (uint8_t i=0, uint8_t *from=(uint8_t *)alarm, uint8_t *to=(uint8_t *)cp_alarm; i<(ALARM_CNT*sizeof(alarm_t)); i++)
  eeprom_update_byte (to++, from++);

или

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

for (uint8_t i=0, uint8_t *from=(uint8_t *)alarm, uint8_t *to=(uint8_t *)cp_alarm; i<(ALARM_CNT*sizeof(alarm_t)); i++)
  eeprom_update_byte (to+i, from+i);
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

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

Сообщение Vov123 »

Ну значит надо указать на код.
Аватара пользователя
strengerst
Вымогатель припоя
Сообщения: 516
Зарегистрирован: Пт янв 18, 2013 15:11:02

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

Сообщение strengerst »

А как это сделать правильно? Я ведь код выбираю hex - файл
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

ptr128 писал(а):И теперь весь процесс можно записать еще проще
проще воспользоваться eeprom_update_block
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

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

Сообщение Vov123 »

Чего стесняешься, выкладывай свой "труд".
Аватара пользователя
ptr128
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

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

Сообщение ptr128 »

ARV писал(а):проще воспользоваться eeprom_update_block

Тоже верно. Совсем вылетело из головы его существование.
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

ARV писал(а):судя по всему еще логичнее так:

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

#define ALARM_CNT   7
typedef struct{
   uint8_t turn; // прем. для вкл/выкл будильника on=1, off=0
   uint8_t hour;
   uint8_t min;
}alarm_t;

EEMEM alarm_t alarm[ALARM_CNT];

спасибо :)

но..., меня смущает одна деталь
насколько является быстрым доступ к переменной которая дислоцируется в eeprom ?
суть вопроса вот в чем
7 будильников
проверка которых происходит в каждую минуту
раньше я дублировал два блока

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

struct{
   uint8_t turn; // прем. для вкл/выкл будильника on=1, off=0
   uint8_t hour;
   uint8_t min;
}alarm_1, alarm_2, alarm_3, alarm_4, alarm_5, alarm_6, alarm_7;


EEMEM struct{
   uint8_t turn; // прем. для вкл/выкл будильника on=1, off=0
   uint8_t hour;
   uint8_t min;
}cp_alarm_1, cp_alarm_2, cp_alarm_3, cp_alarm_4, cp_alarm_5, cp_alarm_6, cp_alarm_7;


при загрузке мк данные будильников из eeprom копируются в такойже блок в оперативке
тот который находится в оперативке я использовал в ф-ции check_alarms(); которая вызывается каждую минуту
не является ли это излишеством ?
Tell Me The Truth
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

вам никто не запретит хранить рабочую копию массива алармов в ОЗУ, обновляя EEPROM только в случае внесения изменений.
чтение EEPROM раза в 2-3 (на глазок) медленнее, чем чтение ячеек ОЗУ, так что проблем не вижу.
я вообще делал попытку сделать нечто вроде PLC, интерпретируемая программа которого хранилась во внешней i2c микросхеме - и ничего, работало...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Ответить

Вернуться в «AVR»