Я похожим образом на STM32 порты конфигурирую. Передаю маску для пинов, но там все несколько сложнее, чем на avr, в разных регистрах поле инициализации может быть длиной 1, 2 или 4 бита, потому исходную маску нужно превратить в двойную и четверную, причем именно из одной константы получить две других. Правда чистый С для этого не подходит, но на С++ можно хоть из массива данные брать и они будут константами.WiseLord писал(а):Вот именно, только если это число - константа. А в этом случае и макрос не нужен, по большому счёту. По крайней мере, я не могу особо придумать, для чего такое действительно может понадобится - именно инверсия константы.
Нескольно простых вопросов о программировании AVR на Си.
Re: Нескольно простых вопросов о программировании AVR на Си.
- ptr128
- Вымогатель припоя
- Сообщения: 606
- Зарегистрирован: Чт окт 06, 2016 21:12:07
- Откуда: Южное Бутово
Re: Нескольно простых вопросов о программировании AVR на Си.
А для Вас есть принципиальная разница, заменит на число препроцессор или компилятор?Z_h_e писал(а):Препроцессор одно число, заменит на другое.
Ведь компилятор, обнаружив константное выражение, все равно не будет генерить код для его вычисления, а просто подставит Вам вычисленную по этому выражению константу. Можете проверить.
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Re: Нескольно простых вопросов о программировании AVR на Си.
После препроцессора компилятор все равно будет выполнять тот же код, что и в случае с inline функцией, только кажется не все это понимаютptr128 писал(а):А для Вас есть принципиальная разница, заменит на число препроцессор или компилятор?
Ведь компилятор, обнаружив константное выражение, все равно не будет генерить код для его вычисления, а просто подставит Вам вычисленную по этому выражению константу. Можете проверить.
Re: Нескольно простых вопросов о программировании AVR на Си.
как можна упростить этот кусок кода ?
Код: Выделить всё
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 на Си.
все алармы объединить в одну структуру (судя по хвостику _0 и т.п. в имени аларма, то логичнее объединить их в массив) и использовать сразу обновление ее при помощи eeprom_update_block 
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Нескольно простых вопросов о программировании AVR на Си.
изначально задумывался такой формат, поскольку я полагал что будед понятней писать alarm_1.hour = чем alarms.hour_1 =
мне показалось так логичней
мне показалось так логичней
Код: Выделить всё
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 на Си.
судя по всему еще логичнее так:тогда будет совсем удобно писать alarm[2].hour
не говоря уж о том, что проверять время срабатывания всех алармов можно будет в цикле...
Код: Выделить всё
#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];не говоря уж о том, что проверять время срабатывания всех алармов можно будет в цикле...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- strengerst
- Вымогатель припоя
- Сообщения: 516
- Зарегистрирован: Пт янв 18, 2013 15:11:02
Re: Нескольно простых вопросов о программировании AVR на Си.
Помогите подключить код к 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 на Си.
Ещё один проводок rxd-txd проложите 
Никакая контра не уйдёт от нас
- strengerst
- Вымогатель припоя
- Сообщения: 516
- Зарегистрирован: Пт янв 18, 2013 15:11:02
Re: Нескольно простых вопросов о программировании AVR на Си.
Положил но он все ровно не показывает , пустое черное окно терминала. Может проблема в терминале? Вот скрин его настроек.
- Вложения
-
- Atmega8.3.png
- (156.99 КБ) 236 скачиваний
-
- Atmega8.2.png
- (105.34 КБ) 313 скачиваний
Re: Нескольно простых вопросов о программировании AVR на Си.
В проте надо указать частоту процессора.
- strengerst
- Вымогатель припоя
- Сообщения: 516
- Зарегистрирован: Пт янв 18, 2013 15:11:02
Re: Нескольно простых вопросов о программировании AVR на Си.
Указал но не понимая почему Proteusне видит код. Вот что видит только Proteus

Спойлер
- Вложения
-
- Atmega8.4.png
- (56.4 КБ) 458 скачиваний
- ptr128
- Вымогатель припоя
- Сообщения: 606
- Зарегистрирован: Чт окт 06, 2016 21:12:07
- Откуда: Южное Бутово
Re: Нескольно простых вопросов о программировании AVR на Си.
ARV абсолютно прав. И теперь весь процесс можно записать еще проще:ARV писал(а):судя по всему еще логичнее так:тогда будет совсем удобно писать alarm[2].hourКод: Выделить всё
#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];
Код: Выделить всё
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);
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Re: Нескольно простых вопросов о программировании AVR на Си.
Ну значит надо указать на код.
- strengerst
- Вымогатель припоя
- Сообщения: 516
- Зарегистрирован: Пт янв 18, 2013 15:11:02
Re: Нескольно простых вопросов о программировании AVR на Си.
А как это сделать правильно? Я ведь код выбираю hex - файл
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
проще воспользоваться eeprom_update_blockptr128 писал(а):И теперь весь процесс можно записать еще проще
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Нескольно простых вопросов о программировании AVR на Си.
Чего стесняешься, выкладывай свой "труд".
- ptr128
- Вымогатель припоя
- Сообщения: 606
- Зарегистрирован: Чт окт 06, 2016 21:12:07
- Откуда: Южное Бутово
Re: Нескольно простых вопросов о программировании AVR на Си.
Тоже верно. Совсем вылетело из головы его существование.ARV писал(а):проще воспользоваться eeprom_update_block
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
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];
но..., меня смущает одна деталь
насколько является быстрым доступ к переменной которая дислоцируется в 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;
тот который находится в оперативке я использовал в ф-ции check_alarms(); которая вызывается каждую минуту
не является ли это излишеством ?
Tell Me The Truth
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
вам никто не запретит хранить рабочую копию массива алармов в ОЗУ, обновляя EEPROM только в случае внесения изменений.
чтение EEPROM раза в 2-3 (на глазок) медленнее, чем чтение ячеек ОЗУ, так что проблем не вижу.
я вообще делал попытку сделать нечто вроде PLC, интерпретируемая программа которого хранилась во внешней i2c микросхеме - и ничего, работало...
чтение EEPROM раза в 2-3 (на глазок) медленнее, чем чтение ячеек ОЗУ, так что проблем не вижу.
я вообще делал попытку сделать нечто вроде PLC, интерпретируемая программа которого хранилась во внешней i2c микросхеме - и ничего, работало...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!