Форум Радиолюбителей

Опорник от Владимир_К

415285 просмотров, 466 ответов — стр. 29 из 32

BL68
Сообщений: 455
6 января 2025 г. в 10:48#421
Мы берем очередное двоичное число частоты (после преобразования частоты из десятичного значения в двоичный код), этому числу присвоено имя (переменная) led. Мы его значение присваиваем переменной tmp(над tmp мы будем кое-что делать, а led не должно изменяться). И выполняем цикл, восемь раз.
А не проще объявить массив из 10 констант и брать константу согласно числа. "0" с нулевым адресом, "1" с первым адресом и т.д. Это будет гораздо быстрее чем перемножение в цикле 8 раз.
const __code char digit[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}
Владимир_К
Сообщений: 1245
7 января 2025 г. в 01:15#422
const __code char digit[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}
Чем Ваш массив отличается от фрагмента исходника. выложенного коллегой выше, вот оно:
char Numbers[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
BL68
Сообщений: 455
7 января 2025 г. в 02:06#423
Да, можно и так, но тогда мы занимает оперативную память переменной, а то что я написал - статический массив во флешь, оперативка не используется. Разницы нет, просто у меня привычка еще с 80-го семейчтва экономить оперативку
Владимир_К
Сообщений: 1245
7 января 2025 г. в 11:58#424
Это будет гораздо быстрее чем перемножение в цикле 8 раз.
Экономить здесь особенно не надо. Весь синтезатор занимает меньше 8 кб. Можно применить даже Atmega8. Меня больше заинтересовало Ваше сообщение насчет перемножения. Как без него, вот это интересно..
BL68
Сообщений: 455
7 января 2025 г. в 03:43#425
Мы друг друга не совсем поняли Просто ваша запись предполагает расположение переменной типа char в оперативной памяти и, похоже, переменная объявлена глобально , а моя как раз во флешь, которой в избытке, там-же где и код самой программы.
Я обычно последовательный вывод чисел на индикаторы делаю через sprint. Для примера вашего случая (7 знакомест) sprintf(c, "%7d", indikator); Переменная с объявляется прямо в процедуре вывода (char c[7]; ) и по выходу из процедуры оперативка освобождается. А потом в цикле j=0; j<7; j++) берется значение для индикатора из массива по значению в с[j] (digit[с[j]]) и выводится побитно (сдвигом) в порт. Просто в этом случае не нужно трогать саму программу при смене типа индикатора, а править только массив значений индикатора const __code char digit[].
Владимир_К
Сообщений: 1245
7 января 2025 г. в 06:31#426
Просто ваша запись предполагает расположение переменной типа char в оперативной памяти и, похоже, переменная объявлена глобально , а моя как раз во флешь, которой в избытке, там-же где и код самой программы.
Если честно, то я толком и не разбирался, где и какая . EEPROM знаю, а остальное как-то не отложилось.. К тому же, программирование для меня это не самоцель и тонкости этого процесса я постигаю, если есть необходимость.
В свое время были проблемы только с индикаторами 1602 из-за их медлительности. Тогда пришлось изощряться, так как не корректно отрабатывал валкодер. Можно было бы еще позаниматься библиотекой Si5351A. Когда-то анализировал, сколько времени уходит на подсчет и загрузку регистров микросхемы. Вышло где-то около 3 миллисек, хотя некоторые товарищи затрачивают на это дело около 0,5 миллисек. Правда пишут на ассемблере. Но, сейчас вроде особой необходимости не вижу..
ZTM
Сообщений: 362
7 января 2025 г. в 06:51#427
Владимир ,подскажите пожалуйста,какую функцию выполняет кнопка *Menu*? не нашел входа/кнопки PTT...Или menu и есть сигнал управления PTT,судя по одноименному выходу с ULN2003 на управление RX\TX?
BL68
Сообщений: 455
7 января 2025 г. в 07:00#428
Если честно, то я толком и не разбирался, где и какая . EEPROM знаю, а остальное как-то не отложилось.. К тому же, программирование для меня это не самоцель и тонкости этого процесса я постигаю, если есть необходимость.
Ну работает программа и ладно Просто когда начинаются блуждающие глюки типа переполнения стека, вот тогда и начинаешь разбираться и экономить оперативку. Просто для информации... Flash память - это куда записывается код программы. И туда-же желательно писать константы типа знакогенератора. Завтра захочется выводить еще десяток символов и оп-па вылезают непонятные глюки с зависанием.
Владимир_К
Сообщений: 1245
7 января 2025 г. в 09:24#429
Владимир ,подскажите пожалуйста,какую функцию выполняет кнопка *Menu*?
Это резервная кнопка, на случай, если что-то еще понадобиться на нее повесить. Но, применение я ей так и не нашел.
Или menu и есть сигнал управления PTT,судя по одноименному выходу с ULN2003 на управление RX\TX?
Что-то не помню уже.. Трансивера того давно нет, а судя по программе, управление RX/TX производится кнопкой подключенной к порту PD6.
Вот строка:
if (bit_is_clear(PIND, 6)) tx();
Но, этот порт подключен к разънму, который идет на плату переключения диапазонов.. В общем, я затрудняюсь что-то внятно объяснить. Поэтому, лучше повесить эту кнопку на свободные выводы порта PC1, PC2 или PC3(если индикатор стрелочный). Соответственно перепишите строку, которую я выше указал:
if (bit_is_clear(PINС, 1)) tx(); То есть в данном случае используется порт PC1.
Правда надо будет еще сконфигурировать этот порт на вход. Сейчас они все сконфигурированы как выход. Потом сделаю, когда определитесь к какому выводу будет подключена кнопка. Кнопка подключается между выходом порта и землей. Но, пока не подключайте, вывод порта сконфигурирован на выход и замкнув его на землю, можно сжечь.
BL68
Сообщений: 455
8 января 2025 г. в 12:13#430
Можно было бы еще позаниматься библиотекой Si5351A. Когда-то анализировал, сколько времени уходит на подсчет и загрузку регистров микросхемы. Вышло где-то около 3 миллисек, хотя некоторые товарищи затрачивают на это дело около 0,5 миллисек. Правда пишут на ассемблере. Но, сейчас вроде особой необходимости не вижу..
Чего-то долго. И почему вы не используете аппаратный I2C Atmega32? Если интересно, сброшу кусок кода для работы с встроенным I2C (ноги PC0 PC1).
ZTM
Сообщений: 362
8 января 2025 г. в 01:41#431
Это резервная кнопка, на случай, если что-то еще понадобиться на нее повесить. Но, применение я ей так и не нашел.
Так может ее и задействовать под PTT?А выход PTT вывести на PC1 ,например
Владимир_К
Сообщений: 1245
8 января 2025 г. в 06:40#432
Так может ее и задействовать под PTT
Кнопки здесь работают от делителя напряжения. В зависимости от того, какая кнопка нажата, напряжение поступающее на вход аналого-цифрового преобразователя разное, таким образом контроллер определяет какая кнопка нажата. Кнопку отпускаем, но режим остается. Для отключения этого режима, кнопку надо нажать повторно. То есть, если использовать кнопку menu для включения передачи, то для перехода на прием ее надо отпустить и нажать еще раз. Я думаю, это неудобно. Поэтому переключение RX/TX надо делать другой кнопкой, которая работает без ADC.
Также ее (кнопку) можно подключить к выводу ADC. Он же у Вас также свободен. Просто его надо сконфигурировать как порт, на вход..
ZTM
Сообщений: 362
8 января 2025 г. в 08:53#433
Просто его надо сконфигурировать как порт, на вход..
Давайте попробуем
Владимир_К
Сообщений: 1245
8 января 2025 г. в 11:17#434
попробуем
Открыл исходник и обнаружил там ошибки и, откуда они взялись, ума не приложу. Вот что имеем:
// ++++ функция инициализации МК ++++
void initialization(void)

{
PORTB=0xE7;
DDRB=0x00;
PORTC=0x3E;
DDRC=0x00;
PORTD=0x7C;
DDRD=0x80;
Ну это чепуха... Теперь по порядку. DDRB=0x00; //или в двоичном виде 00000000, что означает, что все порты настроены как вход. Если на каком-то месте записана 1, значит это выход. У нас все линии порта В должны работать как выходы, кроме 3 и 4 пина, к которым подключен валкодер. Поэтому должно быть 11100111.Окончательно строка будет выглядеть так (превращаем число в шестнадцатиричное):
DDRB=0xe7;
Строка:
PORTB=0xE7; // определяет на какие пины порта подается напряжение от плюча питания через внутренний резистор, так называемая подтяжка.
Для пинов порта В она не нужна, так как только 3 и 4 пины являются входами, а они подключены к схеме валкодера на выходе которого триггеры.
Поэтому, тут должно быть:
PORTB=0x00;
Глядя на строки настройки порта В, видим, что они перепутаны местами.
Аналогично, проверьте все остальные порт D и порт C. Загляните в исходник тестовой программы, у Вас же индикатор работает, следовательно там по порту В вопросов быть не должно.
Попробуйте откорректировать все сами, потом я проверю, сейчас есть некоторые проблемы, которые надо решить..

ZTM
Сообщений: 362
10 января 2025 г. в 07:47#435
Попробуйте откорректировать все сами, потом я проверю
Такое я не осилю,по всей вероятности.Не знаком с программированием.