Например TDA7294

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

Текущее время: Пн ноя 10, 2025 17:04:48

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


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



Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: написать в Си
СообщениеДобавлено: Пн сен 29, 2025 22:01:08 
Родился
Рейтинг продавца: нет оценок
[Всего оценок: 0]
Зарегистрирован: Пн сен 29, 2025 21:34:07
Сообщений: 4
Рейтинг сообщения: 0
Здравствуйте!
Прошу помощи у спецов!
Я программирую недавно и потихоньку перехожу из Ардуино платформы в Avr Studio

Есть такой кусок кода написанный в Дуне:

int8_t iteration = 0;
int8_t z[] = {1, 8, 9, 10, 5};
for (int8_t i(0); i <= 4; i++)digitalWrite(z[i], bitRead(bit(iteration), i));
iteration++;
if (iteration > 4)iteration = 0;

Задача:
написать это в Си


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: написать в Си
СообщениеДобавлено: Вт сен 30, 2025 08:21:15 
Открыл глаза
Рейтинг продавца: нет оценок
[Всего оценок: 0]
Карма: 3
Рейтинг сообщений: 9
Зарегистрирован: Чт ноя 26, 2020 13:19:49
Сообщений: 75
Рейтинг сообщения: 0
Так уже написал :shock:
только за что отвечают функции
digitalWrite(z[i], bitRead(bit(iteration), i)), bitRead(bit(iteration), i) и bit(iteration) непонятно.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: написать в Си
СообщениеДобавлено: Вт сен 30, 2025 10:20:24 
Сверлит текстолит когтями
Рейтинг продавца: нет оценок
[Всего оценок: 0]
Карма: 12
Рейтинг сообщений: 134
Зарегистрирован: Вт июн 07, 2011 08:03:18
Сообщений: 1296
Рейтинг сообщения: 0
Перевести то можно. И тут есть несколько вариантов. Но, для того что бы было понятно самому, лучше сформулировать что именно ты хочешь от этого фрагмента получить. Это будет лучше для тебя самого, потому что ты будешь понимать как это работает.
Код вставляй с тегом Code.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: написать в Си
СообщениеДобавлено: Вт сен 30, 2025 12:19:24 
Друг Кота
Аватар пользователя
Рейтинг продавца:
[Всего оценок: 203]
Карма: 59
Рейтинг сообщений: 1571
Зарегистрирован: Вт окт 22, 2013 04:37:23
Сообщений: 3405
Откуда: Казань
Рейтинг сообщения: 0
Чего тут непонятного - ТС нужна запись в GPIO не через магическую функцию Ардуино, а напрямую. И прямое же чтение/установка отдельных битов битовыми операциями Си.

_________________
Платы для HLDI - установки лазерной засветки фоторезиста.
Фоторезисты Ordyl Alpha 350 и AM 140.
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльная маска XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: написать в Си
СообщениеДобавлено: Вт сен 30, 2025 14:01:10 
Сверлит текстолит когтями
Рейтинг продавца: нет оценок
[Всего оценок: 0]
Карма: 12
Рейтинг сообщений: 134
Зарегистрирован: Вт июн 07, 2011 08:03:18
Сообщений: 1296
Рейтинг сообщения: 0
Конечно понятно. Только сделать это можно по разному - по красивому и тяп-ляп.)
Можно же тупо втулить функции Ардуино и определения. Разве это будет нормально? Не думаю.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: написать в Си
СообщениеДобавлено: Вт сен 30, 2025 14:29:06 
Родился
Рейтинг продавца: нет оценок
[Всего оценок: 0]
Зарегистрирован: Пн сен 29, 2025 21:34:07
Сообщений: 4
Рейтинг сообщения: 0
Так уже написал :shock:
только за что отвечают функции
digitalWrite(z[i], bitRead(bit(iteration), i)), bitRead(bit(iteration), i) и bit(iteration) непонятно.

Переключают общие аноды пятиразрядного семисегментного индикатора:
1, 8, 9, 10, 5 - это порты ардуино к которым подключены аноды
Вобщем смысл такой:
if (iteration == 0){
digitalWrite(1,HIGH) остальные( 8, 9, 10, 5) LOW}
if (iteration==1)digitalWrite(8,HIGH) остальные( 1, 9, 10, 5)LOW
и так далее....

Всё это работает в прерываниях и поэтому надо написать это покороче

Добавлено after 4 minutes 27 seconds:
Чего тут непонятного - ТС нужна запись в GPIO не через магическую функцию Ардуино, а напрямую. И прямое же чтение/установка отдельных битов битовыми операциями Си.

Здравствуйте! Можете направить как нибудь примером?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: написать в Си
СообщениеДобавлено: Вт сен 30, 2025 16:11:14 
Мудрый кот
Рейтинг продавца: нет оценок
[Всего оценок: 0]
Карма: 25
Рейтинг сообщений: 467
Зарегистрирован: Сб май 05, 2012 20:24:52
Сообщений: 1726
Откуда: KN34PC, Болгария
Рейтинг сообщения: 0
См. iteration -> чат-бот дал код? Мне тоже дал код с iteration :).
Кажется рабочий код, попробуйте. (В лучшем случае может потребоваться небольшая коррекция).

Спойлер
Код:
// Номера битов в регистрах
#define ANODE0_BIT PD1  // pin 1
#define ANODE1_BIT PB0  // pin 8
#define ANODE2_BIT PB1  // pin 9
#define ANODE3_BIT PB2  // pin 10
#define ANODE4_BIT PD5  // pin 5

void setup() {
  // Настройка пинов как выходы
  DDRD |= (1 << ANODE0_BIT) | (1 << ANODE4_BIT);
  DDRB |= (1 << ANODE1_BIT) | (1 << ANODE2_BIT) | (1 << ANODE3_BIT);
}

void switchAnode(uint8_t iteration) {
  // Сброс всех анодов
  PORTD &= ~((1 << ANODE0_BIT) | (1 << ANODE4_BIT));
  PORTB &= ~((1 << ANODE1_BIT) | (1 << ANODE2_BIT) | (1 << ANODE3_BIT));

  // Включение нужного анода
  switch (iteration) {
    case 0: PORTD |= (1 << ANODE0_BIT); break;
    case 1: PORTB |= (1 << ANODE1_BIT); break;
    case 2: PORTB |= (1 << ANODE2_BIT); break;
    case 3: PORTB |= (1 << ANODE3_BIT); break;
    case 4: PORTD |= (1 << ANODE4_BIT); break;
  }
}

void loop() {
  static uint8_t iteration = 0;

  switchAnode(iteration);
  iteration = (iteration + 1) % 5;

  delay(2); // Имитация мультиплексирования
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: написать в Си
СообщениеДобавлено: Вт сен 30, 2025 16:18:51 
Сверлит текстолит когтями
Рейтинг продавца: нет оценок
[Всего оценок: 0]
Карма: 12
Рейтинг сообщений: 134
Зарегистрирован: Вт июн 07, 2011 08:03:18
Сообщений: 1296
Рейтинг сообщения: 0
Переключают общие аноды пятиразрядного семисегментного индикатора:
1, 8, 9, 10, 5 - это порты ардуино к которым подключены аноды

Это делается не так. Описываете общие, описываете сегменты и вперёд, ни о чём не думаешь.
Код:
#define COM1              D,6,H         //CA
#define COM2              D,5,H
#define COM3              B,7,H
#define COM4              B,6,H

#define _A                D,0,L
#define _B                D,1,L
#define _C                C,3,L
#define _D                D,2,L
#define _E                D,3,L
#define _F                D,4,L
#define _G                D,7,L
#define _H                B,0,L

И у тебя получается законченный модуль, с которым ты осуществляешь взаимодействие с помощь нескольких функций. Всё. И забываешь напрочь.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: написать в Си
СообщениеДобавлено: Вт сен 30, 2025 17:18:40 
Друг Кота
Аватар пользователя
Рейтинг продавца:
[Всего оценок: 203]
Карма: 59
Рейтинг сообщений: 1571
Зарегистрирован: Вт окт 22, 2013 04:37:23
Сообщений: 3405
Откуда: Казань
Рейтинг сообщения: 0
НДФ, вот хорошая статься по Вашей теме - подробнее некуда - https://ph0en1x.net/81-howto-work-with- ... oller.html

_________________
Платы для HLDI - установки лазерной засветки фоторезиста.
Фоторезисты Ordyl Alpha 350 и AM 140.
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльная маска XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: написать в Си
СообщениеДобавлено: Вт сен 30, 2025 19:39:16 
Сверлит текстолит когтями
Рейтинг продавца: нет оценок
[Всего оценок: 0]
Карма: 12
Рейтинг сообщений: 134
Зарегистрирован: Вт июн 07, 2011 08:03:18
Сообщений: 1296
Рейтинг сообщения: 0
У него же куча Ардуино функций: digitalWrite например, которая включает в себя трансляцию пинов в порты, bit, bitRead и т.п. Всё это для Ардуино кухни, но для людей не способствуют пониманию.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: написать в Си
СообщениеДобавлено: Вт сен 30, 2025 20:12:20 
Родился
Рейтинг продавца: нет оценок
[Всего оценок: 0]
Зарегистрирован: Пн сен 29, 2025 21:34:07
Сообщений: 4
Рейтинг сообщения: 0
НДФ, вот хорошая статься по Вашей теме - подробнее некуда - https://ph0en1x.net/81-howto-work-with- ... oller.html
Спасибо!
//----------
я вот только не понял эту строку...
iteration = (iteration + 1) % 5;

в моём случае iteration++
и как только она достигает 5ти - сбрасывается в 0
if(iteration>4)iteration=0;
или это какое то мне не известное выражение Си ?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: написать в Си
СообщениеДобавлено: Вт сен 30, 2025 21:22:16 
Друг Кота
Аватар пользователя
Рейтинг продавца:
[Всего оценок: 203]
Карма: 59
Рейтинг сообщений: 1571
Зарегистрирован: Вт окт 22, 2013 04:37:23
Сообщений: 3405
Откуда: Казань
Рейтинг сообщения: 0
я вот только не понял эту строку...
iteration = (iteration + 1) % 5;

% это получение остатка от деления.

А в целом функция loop это такой способ организации цикла. На мой взгляд извратный и неочевидный (особенно для новичков), но кто я такой, чтобы спорить с ИИ.

Работает это так:

1. Переменная iteration объявлена как локальная статическая. При первом вызове функции iteration присваивается 0, но при последующих вызовах сохраняется старое значение этой переменной;
2. Вызывается функция switchAnode с значением из iteration;
3. К переменной iteration прибавляется 1, а потом ей же присвается остаток от деления на 5. На первой итерации это будет 1%5=1, потом 2%5=2 и т.д. Вот калькулятор, поэкспериментируйте - https://skysmart.ru/articles/calculator ... s-ostatkom
4. Задержка 2 миллисекунды. Почему так мало - хрен его знает, ИИ виднее.
5. Переход к п.1 - значение iteration уже 1.
.... И так далее до iteration = 5. Тогда остаток от деления 5 на 5 будет 0, iteration обнуляется, и всё начинается по новой.

_________________
Платы для HLDI - установки лазерной засветки фоторезиста.
Фоторезисты Ordyl Alpha 350 и AM 140.
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльная маска XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: написать в Си
СообщениеДобавлено: Ср окт 01, 2025 04:58:11 
Родился
Рейтинг продавца: нет оценок
[Всего оценок: 0]
Зарегистрирован: Пн сен 29, 2025 21:34:07
Сообщений: 4
Рейтинг сообщения: 0
я вот только не понял эту строку...
iteration = (iteration + 1) % 5;

% это получение остатка от деления.

А в целом функция loop это такой способ организации цикла. На мой взгляд извратный и неочевидный (особенно для новичков), но кто я такой, чтобы спорить с ИИ.

Работает это так:

1. Переменная iteration объявлена как локальная статическая. При первом вызове функции iteration присваивается 0, но при последующих вызовах сохраняется старое значение этой переменной;
2. Вызывается функция switchAnode с значением из iteration;
3. К переменной iteration прибавляется 1, а потом ей же присвается остаток от деления на 5. На первой итерации это будет 1%5=1, потом 2%5=2 и т.д. Вот калькулятор, поэкспериментируйте - https://skysmart.ru/articles/calculator ... s-ostatkom
4. Задержка 2 миллисекунды. Почему так мало - хрен его знает, ИИ виднее.
5. Переход к п.1 - значение iteration уже 1.
.... И так далее до iteration = 5. Тогда остаток от деления 5 на 5 будет 0, iteration обнуляется, и всё начинается по новой.


не плохо! и без никаких ifов
одна строка заменяет две:
iteration++;
if (iteration > 4)iteration = 0;


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: написать в Си
СообщениеДобавлено: Ср окт 01, 2025 11:29:48 
Держит паяльник хвостом
Рейтинг продавца:
[Всего оценок: 6]
Карма: 16
Рейтинг сообщений: 135
Зарегистрирован: Сб мар 07, 2015 20:48:22
Сообщений: 900
Откуда: Московская область
Рейтинг сообщения: 0
Интересно узнать как компилятор оптимизирует эти варианты. Хотя бы по размеру кода. Возможно на выходе будет одинаковый. Остаток от деления насколько затратная функция?


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

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


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

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


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

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


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