Например TDA7294

 Форум РадиоКот • Просмотр темы - Вопросы по С/С++ (СИ)
Форум РадиоКот
Здесь можно немножко помяукать :)



Текущее время: Вт окт 16, 2018 12:45:34



Часовой пояс: UTC + 3 часа [ Летнее время ]


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



Начать новую тему Ответить на тему  [ Сообщений: 5654 ]  На страницу Пред.  1 ... 275, 276, 277, 278, 279, 280, 281 ... 283  След.
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт апр 20, 2018 22:08:14 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 26
Зарегистрирован: Сб май 14, 2011 22:16:04
Сообщений: 2417
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Перечеркнутый ноль мудрые люди давно придумали.

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт апр 20, 2018 22:36:58 
Друг Кота
Аватар пользователя

Карма: 71
Зарегистрирован: Чт апр 11, 2013 12:19:59
Сообщений: 3432
Откуда: Минск
Рейтинг сообщения: 0
На смартфоне разница была почти незаметна:

Изображение


Вернуться наверх
 Профиль WWW  
 
JLCPCB, 10 прототипов ПП всего за $2 и 2 дня доставка!

Крупнейший производитель печатных плат в Китае, 300,000+ заказчиков, 10,000+ он-лайн заказов в день.

Рассчитайте цену онлайн:https://jlcpcb.com/quote

Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вт апр 24, 2018 17:52:50 
Друг Кота
Аватар пользователя

Карма: 42
Зарегистрирован: Пт авг 28, 2009 22:34:30
Сообщений: 6243
Откуда: 845-й км.
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Снова подниму тему глобальных переменых... Прочитал я в этой теме, что это зло, но от него не могу отказаться. Тут один проектик разросся до того, что стал трудно "сопровождаемым" и я решил его побить по модулям. Вот с одной проблемой не знаю как справиться. Выделил в отдельный модуль обработчик клавиш - всё вроде внятно, но есть одна переменная у неё kbddelay - таймер задержки, которая декрементируется в таймерном прерывании. Пока оно было в одном файле - проблем не было. А теперь обработчик прерываний находится в главном файле проекта, а обработчик кнопок в другом. Где эту переменную объявить, описать итд.

Есть еще одна - буфер "видеоозу". Используется в главном модуле и в модуле конфигурации. Конечно, я могу в каждом модуле выделить свой буфер - на функционал не влияет, но прамяти жалко. Пока объявил в main.c а в configure.c написал как extern.

_________________
А люди посмотрят и скажут: "Собаки летят. Вот и осень."


Вернуться наверх
 Профиль  
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $88 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Второй конкурс по дизайну печатных плат от PCBWay!
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вт апр 24, 2018 18:55:11 
Ум, честь и совесть. И скромность.
Аватар пользователя

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

а правильный способ - это изолировать сущности друг от друга. с видеоозу, по правильному, не должны работать модули напрямую, как с массивом - только через предназначенные для этого функции. в этом случае и видеоозу, и функции для работы с ним будут в одном модуле, а для других модулей видеоозу существовать не будет - только функции, которые чтото там выводят/рисуют.

с обработчиками прерываний все похуже, т.к. у них особый статус "невидимок для всех". поэтому, с моей точки зрения, идеальным был бы вариант, когда прерывание для работы с клавиатурой определено в модуле работы с клавиатурой. но если одно прерывание занимается обслуживанием интересов нескольких модулей - так не выйдет. и тут городить излишние "изолирующие прокладки" в виде промежуточных модулей, не очень хорошая идея: попрёт оверхед памяти, снизится производительность... тут нужно искать компромиссы, например, по типу, как у вас
uldemir писал(а):
объявил в main.c а в configure.c написал как extern

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


Вернуться наверх
 Профиль WWW  
 
Более 10 000 000 оригинальных новых компонентов

Поставка электронных компонентов под ваш проект

Комплексные решения поставки электронных компонентов

Сэкономьте $30 при первом заказе на сумму боле $200 (только для посетителей нашего форума)
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вт апр 24, 2018 19:41:53 
Друг Кота
Аватар пользователя

Карма: 21
Зарегистрирован: Пн июл 28, 2008 23:12:01
Сообщений: 3210
Рейтинг сообщения: 0
ARV, у тебя с uldemir одна общая проблема - вы мыслите на уровне avr ...


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вт апр 24, 2018 21:41:23 
Поставщик валерьянки для Кота

Карма: 44
Зарегистрирован: Пн апр 06, 2015 12:01:53
Сообщений: 2170
Откуда: москва, уфа
Рейтинг сообщения: 0
есть одна переменная у неё kbddelay - таймер задержки, которая декрементируется в таймерном прерывании. Пока оно было в одном файле - проблем не было. А теперь обработчик прерываний находится в главном файле проекта, а обработчик кнопок в другом. Где эту переменную объявить, описать итд.

объявлять там, где непосредственно используется. Так же иметь в "модуле" функцию, декрементирующую сию переменную, и дергать ее из прерывания или откуда угодно еще.
Есть еще одна - буфер "видеоозу". Используется в главном модуле и в модуле конфигурации. Конечно, я могу в каждом модуле выделить свой буфер - на функционал не влияет, но прамяти жалко

храните и используйте указатели на буфер, заносите в них актуальный адрес при инициализации.

с видеоозу, по правильному, не должны работать модули напрямую, как с массивом - только через предназначенные для этого функции. в этом случае и видеоозу, и функции для работы с ним будут в одном модуле, а для других модулей видеоозу существовать не будет - только функции, которые чтото там выводят/рисуют

это даже на "больших" компах далеко не всегда проканывает. Зачастую вывод чего-нибудь графического начинается с обращения к вышележащей софтине (драйверу/интерфейсу/части тулкита) типа "дай мне буфер для непосредственных манипуляций".


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Сб апр 28, 2018 16:29:31 
Сверлит текстолит когтями
Аватар пользователя

Карма: 5
Зарегистрирован: Пт фев 16, 2007 15:18:20
Сообщений: 1124
Откуда: Новосибирск
Рейтинг сообщения: 0
Всем привет!
Пытаюсь написать алгоритм работы с SPI EEPROM, но из-за недостатка опыта сомневаюсь в правильности алгоритмов, потому требуется помощь.
Контроллер STM32F103C8 (Reference manual)
Память M95M01 (pdf)
В общем, начал с низкоуровневых функций. Настройка SPI2, поднятие преываний на прием и окончание передачи.
Как я понимаю передача и приём идет одновременно. В интернете полно примеров, но там используются всякие костыли типа
Код:
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) == RESET);
что, откровенно, вызывает кровь из глаз. Хотя мой быдлокодинг еще больше кровоточит. Ну да ладно, ближе к теме.

В общем, функция для отправки байта
Код:
typedef enum
{
  SPI_EEPROM_STATUS_BSY,    // Spi is busy
  SPI_EEPROM_STATUS_RDY
} SpiEepromStatus;

typedef struct
{
  unsigned spiByteReseived: 1;
  unsigned spiByteTransmited: 1;
} SpiState_TypeDef;

SpiEepromStatus ui8EepromSendByte(uint8_t byte)
{
  SpiEepromStatus Status = SPI_EEPROM_STATUS_BSY;
 
  if (SPI2->SR & SPI_SR_TXE)
  {
    SPI2->DR = byte;
    Status = SPI_EEPROM_STATUS_RDY;
  }
  else   
    Status = SPI_EEPROM_STATUS_BSY;
 
  return Status;
}


Смысл такой, что если циклически вызывать
Код:
ui8EepromSendByte
и чекать что вернула функция, то можно рулить тем, что бы данные отправлялись тогда, когда предыдущие гарантированно уйдут. Такая конструкция приемлема или есть более интересная реализация?

Функция прерывания
Код:
void SPI2_IRQHandler (void)
{
   if (SPI2->SR & SPI_SR_RXNE)
     {
           ui8ByteFromSpiEeprom = SPI2->DR;
           vSetSpiEepromFlag (&SpiState, SPI_BYTE_RECEIVED);
    }
   
   if (SPI2->SR & SPI_SR_TXE)
     {
           SPI2->SR &= ~SPI_SR_TXE;
     }
}


vSetSpiEepromFlag взводит флаг в битовом поле (через битбанд). Таким образом происходит обмен мессаджами между функциями.
Реализованное битовое поле
Код:
typedef struct
{
  unsigned spiByteReseived: 1;
  unsigned spiByteTransmited: 1;
} SpiState_TypeDef;


В целом, цель поднять FAT на SPI EEPROM и определить её как USB, потому в этом контексте, подобная реализация низкоуровневых функций норм? Или же мне отправляемые/принимаемые данные через кольцевой буфер гонять? Или исходящий поток нет смысла через кольцевой буфер гнать? Вообще, общение с EEPROM постраничное? т.е. прежде чем изменить байт (-ты), я должен прочитать всю страницу, изменить нужную информацию и записать вновь?

_________________
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Сб апр 28, 2018 16:43:40 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 26
Зарегистрирован: Сб май 14, 2011 22:16:04
Сообщений: 2417
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Вопрос то не по Сям.
Надо было здесь топик создавать, сразу бы про DMA разговор бы пошел :).

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Сб апр 28, 2018 16:47:05 
Поставщик валерьянки для Кота

Карма: 44
Зарегистрирован: Пн апр 06, 2015 12:01:53
Сообщений: 2170
Откуда: москва, уфа
Рейтинг сообщения: 0
В интернете полно примеров, но там используются всякие костыли типа
Код:
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) == RESET);
что, откровенно, вызывает кровь из глаз.

вполне нормальная конструкция :dont_know:

Смысл такой, что если циклически вызывать
Код:
ui8EepromSendByte
и чекать что вернула функция, то можно рулить тем, что бы данные отправлялись тогда, когда предыдущие гарантированно уйдут. Такая конструкция приемлема или есть более интересная реализация?

каноничный подход - сначала дождаться взведения флага TXE, потом чего-то пытаться отправить
Код:
void ui8EepromSendByte(uint8_t byte)
{
  while (!(SPI2->SR & SPI_SR_TXE)); // ждем
  SPI2->DR = byte;
}


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Сб апр 28, 2018 16:59:14 
Сверлит текстолит когтями
Аватар пользователя

Карма: 5
Зарегистрирован: Пт фев 16, 2007 15:18:20
Сообщений: 1124
Откуда: Новосибирск
Рейтинг сообщения: 0
Вопрос то не по Сям.
Надо было здесь топик создавать, сразу бы про DMA разговор бы пошел :).

Точно. Виноват. Подумал что алгоритмические вопросы тоже сюда )) Наверное передислацируюсь туда. Если есть возможноть, то удалите, пожалуйста, мой пост, что бы не захламлять.

_________________
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Сб апр 28, 2018 17:04:08 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 26
Зарегистрирован: Сб май 14, 2011 22:16:04
Сообщений: 2417
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Chip115 писал(а):
SPI2->SR &= ~SPI_SR_TXE;
Так не сработает. Бит только для чтения.

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вс апр 29, 2018 03:39:44 
Сверлит текстолит когтями
Аватар пользователя

Карма: 5
Зарегистрирован: Пт фев 16, 2007 15:18:20
Сообщений: 1124
Откуда: Новосибирск
Рейтинг сообщения: 0
Понял, спасибо.
Еще вопрос.
Что значит эта запись?
Код:
#define SPI_SendData8(SPIx, data)   *(__IO uint8_t *)&SPIx->DR = data

Интересует правая запись

_________________
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вс апр 29, 2018 10:01:31 
Поставщик валерьянки для Кота

Карма: 71
Зарегистрирован: Вт ноя 27, 2007 12:32:06
Сообщений: 2157
Откуда: Tashkent
Рейтинг сообщения: 0
Это значит запись байта data по адресу SPIx->DR


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вс апр 29, 2018 11:35:29 
Сверлит текстолит когтями
Аватар пользователя

Карма: 5
Зарегистрирован: Пт фев 16, 2007 15:18:20
Сообщений: 1124
Откуда: Новосибирск
Рейтинг сообщения: 0
А что за магия с указателями? Почему нельзя написать SPIx->DR = data и зачем нужна операция И?

_________________
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вс апр 29, 2018 11:37:58 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 26
Зарегистрирован: Сб май 14, 2011 22:16:04
Сообщений: 2417
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Chip115 писал(а):
зачем нужна операция И
Почитайте про указатели.
Chip115 писал(а):
Почему нельзя написать SPIx->DR = data
Кто сказал что нельзя?

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вс апр 29, 2018 12:55:52 
Сверлит текстолит когтями
Аватар пользователя

Карма: 5
Зарегистрирован: Пт фев 16, 2007 15:18:20
Сообщений: 1124
Откуда: Новосибирск
Рейтинг сообщения: 0
Ну так если можно, то зачем пляска с указателями?

_________________
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вс апр 29, 2018 14:53:40 
Поставщик валерьянки для Кота

Карма: 44
Зарегистрирован: Пн апр 06, 2015 12:01:53
Сообщений: 2170
Откуда: москва, уфа
Рейтинг сообщения: 0
ну программист немного заработался. DR там уже должен быть __IO, просто лишний каст.


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вс апр 29, 2018 15:19:30 
Вымогатель припоя

Карма: 8
Зарегистрирован: Вс июн 19, 2016 10:32:03
Сообщений: 608
Рейтинг сообщения: 4
Ну так если можно, то зачем пляска с указателями?

В старой реализации SPI, как у F1, достаточно было выбрать 8-ми битный формат в CR1 и тогда при записи байта в DR байт и оправлялся, а в новом SPI все иначе, там чтобы ушел байт нужно привести 16-ти битный DR к указателю на байт, иначе отправятся сразу два байта.


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вс апр 29, 2018 16:18:18 
Сверлит текстолит когтями
Аватар пользователя

Карма: 5
Зарегистрирован: Пт фев 16, 2007 15:18:20
Сообщений: 1124
Откуда: Новосибирск
Рейтинг сообщения: 0
Спасибо! Это и хотел узнать.

_________________
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вс апр 29, 2018 22:13:21 
Встал на лапы
Аватар пользователя

Зарегистрирован: Пт фев 14, 2014 21:45:33
Сообщений: 94
Откуда: Северный Кавказ
Рейтинг сообщения: 0
Пытаюсь изучить работу таймера и прерываний. MK AT89C2051, кварц 4 МГц. Компилятор языка Си ICC8051. По задумке таймер должен перезагружаться каждые 0,05 с (предустановка таймера 0xBEE5 - 48869). Для визуализации на портах P3.7 и P1.3 подвешены светодиоды. По поему (вероятно ошибочному мнению) HG2 на P3.7 должен одну сек. гореть, одну сек. быть потушенным. А HG1 на P1.3 мигать с частотой около 20 Гц. Но что-то пошло не так... Не могу разобраться сам в чём косяк.

Практическая работа программы: https://yadi.sk/i/gbIkzjEZ3Uw8Bv


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 5654 ]  На страницу Пред.  1 ... 275, 276, 277, 278, 279, 280, 281 ... 283  След.



Часовой пояс: UTC + 3 часа [ Летнее время ]


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

Сейчас этот форум просматривают: Мурик и гости: 8


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

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


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