Например TDA7294

Форум РадиоКот • Просмотр темы - Нескольно простых вопросов о программировании AVR на Си.
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Ср дек 03, 2025 01:17:02

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 1499 ]     ... , , , 25, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Сб дек 03, 2016 23:29:16 
Поставщик валерьянки для Кота

Карма: 20
Рейтинг сообщений: 256
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 2089
Рейтинг сообщения: 0
WiseLord писал(а):
Вот именно, только если это число - константа. А в этом случае и макрос не нужен, по большому счёту. По крайней мере, я не могу особо придумать, для чего такое действительно может понадобится - именно инверсия константы.

Я похожим образом на STM32 порты конфигурирую. Передаю маску для пинов, но там все несколько сложнее, чем на avr, в разных регистрах поле инициализации может быть длиной 1, 2 или 4 бита, потому исходную маску нужно превратить в двойную и четверную, причем именно из одной константы получить две других. Правда чистый С для этого не подходит, но на С++ можно хоть из массива данные брать и они будут константами.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Сб дек 03, 2016 23:44:09 
Вымогатель припоя
Аватар пользователя

Карма: 19
Рейтинг сообщений: 230
Зарегистрирован: Чт окт 06, 2016 21:12:07
Сообщений: 606
Откуда: Южное Бутово
Рейтинг сообщения: 0
Z_h_e писал(а):
Препроцессор одно число, заменит на другое.


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

_________________
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Сб дек 03, 2016 23:59:19 
Поставщик валерьянки для Кота

Карма: 20
Рейтинг сообщений: 256
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 2089
Рейтинг сообщения: 0
ptr128 писал(а):
А для Вас есть принципиальная разница, заменит на число препроцессор или компилятор?
Ведь компилятор, обнаружив константное выражение, все равно не будет генерить код для его вычисления, а просто подставит Вам вычисленную по этому выражению константу. Можете проверить.

После препроцессора компилятор все равно будет выполнять тот же код, что и в случае с inline функцией, только кажется не все это понимают :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Пн дек 05, 2016 09:54:48 
Друг Кота
Аватар пользователя

Карма: 27
Рейтинг сообщений: 33
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Сообщений: 6296
Откуда: Ukraine
Рейтинг сообщения: 0
как можна упростить этот кусок кода ?
Код:
   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


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Пн дек 05, 2016 10:19:44 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2135
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18436
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
все алармы объединить в одну структуру (судя по хвостику _0 и т.п. в имени аларма, то логичнее объединить их в массив) и использовать сразу обновление ее при помощи eeprom_update_block :)

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Пн дек 05, 2016 10:26:27 
Друг Кота
Аватар пользователя

Карма: 27
Рейтинг сообщений: 33
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Сообщений: 6296
Откуда: Ukraine
Рейтинг сообщения: 0
изначально задумывался такой формат, поскольку я полагал что будед понятней писать 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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Пн дек 05, 2016 10:44:22 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2135
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18436
Откуда: Новочеркасск
Рейтинг сообщения: 1
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
судя по всему еще логичнее так:
Код:
#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
не говоря уж о том, что проверять время срабатывания всех алармов можно будет в цикле...

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Пн дек 05, 2016 11:00:23 
Вымогатель припоя
Аватар пользователя

Зарегистрирован: Пт янв 18, 2013 15:11:02
Сообщений: 516
Рейтинг сообщения: 0
Помогите подключить код к 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 KiB]
Скачиваний: 310
Atmega8.1.png [169.48 KiB]
Скачиваний: 321
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Пн дек 05, 2016 11:19:53 
Вымогатель припоя
Аватар пользователя

Карма: 7
Рейтинг сообщений: 58
Зарегистрирован: Чт янв 20, 2011 09:07:08
Сообщений: 677
Откуда: Пермь
Рейтинг сообщения: 0
Ещё один проводок rxd-txd проложите :))

_________________
Никакая контра не уйдёт от нас


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Пн дек 05, 2016 11:46:49 
Вымогатель припоя
Аватар пользователя

Зарегистрирован: Пт янв 18, 2013 15:11:02
Сообщений: 516
Рейтинг сообщения: 0
Положил но он все ровно не показывает , пустое черное окно терминала. Может проблема в терминале? Вот скрин его настроек.


Вложения:
Atmega8.3.png [156.99 KiB]
Скачиваний: 230
Atmega8.2.png [105.34 KiB]
Скачиваний: 308
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Пн дек 05, 2016 11:57:33 
Опытный кот

Карма: 1
Рейтинг сообщений: 52
Зарегистрирован: Чт мар 12, 2009 16:31:05
Сообщений: 804
Рейтинг сообщения: 0
В проте надо указать частоту процессора.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Пн дек 05, 2016 12:51:27 
Вымогатель припоя
Аватар пользователя

Зарегистрирован: Пт янв 18, 2013 15:11:02
Сообщений: 516
Рейтинг сообщения: 0
Указал но не понимая почему Proteusне видит код. Вот что видит только Proteus

СпойлерИзображение


Вложения:
Atmega8.4.png [56.4 KiB]
Скачиваний: 451
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Пн дек 05, 2016 13:00:16 
Вымогатель припоя
Аватар пользователя

Карма: 19
Рейтинг сообщений: 230
Зарегистрирован: Чт окт 06, 2016 21:12:07
Сообщений: 606
Откуда: Южное Бутово
Рейтинг сообщения: 0
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);

_________________
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Пн дек 05, 2016 13:14:35 
Опытный кот

Карма: 1
Рейтинг сообщений: 52
Зарегистрирован: Чт мар 12, 2009 16:31:05
Сообщений: 804
Рейтинг сообщения: 0
Ну значит надо указать на код.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Пн дек 05, 2016 13:16:55 
Вымогатель припоя
Аватар пользователя

Зарегистрирован: Пт янв 18, 2013 15:11:02
Сообщений: 516
Рейтинг сообщения: 0
А как это сделать правильно? Я ведь код выбираю hex - файл


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Пн дек 05, 2016 13:20:36 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2135
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18436
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
ptr128 писал(а):
И теперь весь процесс можно записать еще проще
проще воспользоваться eeprom_update_block

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Пн дек 05, 2016 13:27:32 
Опытный кот

Карма: 1
Рейтинг сообщений: 52
Зарегистрирован: Чт мар 12, 2009 16:31:05
Сообщений: 804
Рейтинг сообщения: 0
Чего стесняешься, выкладывай свой "труд".


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Пн дек 05, 2016 13:37:56 
Вымогатель припоя
Аватар пользователя

Карма: 19
Рейтинг сообщений: 230
Зарегистрирован: Чт окт 06, 2016 21:12:07
Сообщений: 606
Откуда: Южное Бутово
Рейтинг сообщения: 0
ARV писал(а):
проще воспользоваться eeprom_update_block

Тоже верно. Совсем вылетело из головы его существование.

_________________
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Пн дек 05, 2016 13:47:04 
Друг Кота
Аватар пользователя

Карма: 27
Рейтинг сообщений: 33
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Сообщений: 6296
Откуда: Ukraine
Рейтинг сообщения: 0
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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
СообщениеДобавлено: Пн дек 05, 2016 14:26:24 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2135
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18436
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
вам никто не запретит хранить рабочую копию массива алармов в ОЗУ, обновляя EEPROM только в случае внесения изменений.
чтение EEPROM раза в 2-3 (на глазок) медленнее, чем чтение ячеек ОЗУ, так что проблем не вижу.
я вообще делал попытку сделать нечто вроде PLC, интерпретируемая программа которого хранилась во внешней i2c микросхеме - и ничего, работало...

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 1499 ]     ... , , , 25, , , ...  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y