Автор Тема: Опорник от Владимир_К  (Прочитано 73628 раз)

0 Пользователей и 7 Гостей просматривают эту тему.

Оффлайн BL68

  • Sr. Member
  • ****
  • Сообщений: 299
Re: Опорник от Владимир_К
« Ответ #420 : Январь 06, 2025, 10:48:19 pm »
Мы берем очередное двоичное число частоты (после преобразования частоты из десятичного значения в двоичный код), этому числу присвоено имя (переменная) led. Мы его значение присваиваем переменной tmp(над tmp мы будем кое-что делать, а led не должно изменяться). И выполняем цикл, восемь раз.
А не проще объявить массив из 10 констант и брать константу согласно числа. "0" с нулевым адресом, "1"  с первым адресом и т.д. Это будет гораздо быстрее чем перемножение в цикле 8 раз.
const __code char digit[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}

Оффлайн Владимир_К

  • Hero Member
  • *****
  • Сообщений: 1211
Re: Опорник от Владимир_К
« Ответ #421 : Январь 07, 2025, 01:15:03 am »
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

  • Sr. Member
  • ****
  • Сообщений: 299
Re: Опорник от Владимир_К
« Ответ #422 : Январь 07, 2025, 02:06:22 am »
Да, можно и так, но тогда мы занимает оперативную память переменной, а то что я написал - статический массив во флешь, оперативка не используется. Разницы нет, просто у меня привычка еще с 80-го семейчтва экономить оперативку lllol
« Последнее редактирование: Январь 07, 2025, 02:11:48 am от BL68 »

Оффлайн Владимир_К

  • Hero Member
  • *****
  • Сообщений: 1211
Re: Опорник от Владимир_К
« Ответ #423 : Январь 07, 2025, 11:58:29 am »
Это будет гораздо быстрее чем перемножение в цикле 8 раз.
Экономить здесь особенно не надо. Весь синтезатор занимает меньше 8 кб. Можно применить даже Atmega8. Меня больше заинтересовало Ваше сообщение насчет перемножения. Как без него, вот это интересно..

Оффлайн BL68

  • Sr. Member
  • ****
  • Сообщений: 299
Re: Опорник от Владимир_К
« Ответ #424 : Январь 07, 2025, 03:43:58 pm »
Мы друг друга не совсем поняли :) Просто ваша запись предполагает расположение переменной типа char в оперативной памяти и, похоже, переменная объявлена глобально , а моя как раз во флешь, которой в избытке, там-же где и код самой программы.
Я обычно последовательный вывод чисел на индикаторы делаю через sprint. Для примера вашего случая (7 знакомест) sprintf(c, "%7d", indikator); Переменная с объявляется прямо в процедуре вывода (char c[7]; ) и по выходу из процедуры оперативка освобождается. А потом в цикле j=0; j<7; j++)  берется значение для индикатора из массива по значению в с[j] (digit[с[j]]) и выводится побитно (сдвигом) в порт. Просто в этом случае не нужно трогать саму программу при смене типа индикатора, а править только массив значений индикатора const __code char digit[].
« Последнее редактирование: Январь 07, 2025, 03:50:24 pm от BL68 »

Оффлайн Владимир_К

  • Hero Member
  • *****
  • Сообщений: 1211
Re: Опорник от Владимир_К
« Ответ #425 : Январь 07, 2025, 06:31:39 pm »
Просто ваша запись предполагает расположение переменной типа char в оперативной памяти и, похоже, переменная объявлена глобально , а моя как раз во флешь, которой в избытке, там-же где и код самой программы.
Если честно, то я толком и не разбирался, где и какая lol22.  EEPROM знаю, а остальное как-то не отложилось.. К тому же, программирование для меня это не самоцель и тонкости этого процесса я постигаю, если есть необходимость.
В свое время были проблемы только с индикаторами 1602 из-за их медлительности. Тогда пришлось изощряться, так как не корректно отрабатывал валкодер. Можно было бы еще позаниматься библиотекой Si5351A. Когда-то анализировал, сколько времени уходит на подсчет и загрузку регистров микросхемы. Вышло где-то около 3 миллисек, хотя некоторые товарищи затрачивают на это дело около 0,5 миллисек. Правда пишут на ассемблере. Но, сейчас вроде особой необходимости не вижу..

Оффлайн ZTM

  • Sr. Member
  • ****
  • Сообщений: 345
Re: Опорник от Владимир_К
« Ответ #426 : Январь 07, 2025, 06:51:57 pm »
Владимир ,подскажите пожалуйста,какую функцию выполняет кнопка *Menu*? не нашел входа/кнопки PTT...Или menu и есть сигнал управления PTT,судя по одноименному выходу с ULN2003 на управление RX\TX?

Оффлайн BL68

  • Sr. Member
  • ****
  • Сообщений: 299
Re: Опорник от Владимир_К
« Ответ #427 : Январь 07, 2025, 07:00:45 pm »
Если честно, то я толком и не разбирался, где и какая lol22.  EEPROM знаю, а остальное как-то не отложилось.. К тому же, программирование для меня это не самоцель и тонкости этого процесса я постигаю, если есть необходимость.
1999 Ну работает программа и ладно rrr7777 Просто когда начинаются блуждающие глюки типа переполнения стека, вот тогда и начинаешь разбираться и экономить оперативку. Просто для информации... Flash память - это куда записывается код программы. И туда-же желательно писать константы типа знакогенератора. Завтра захочется выводить еще десяток символов и оп-па вылезают непонятные глюки с зависанием.

Оффлайн Владимир_К

  • Hero Member
  • *****
  • Сообщений: 1211
Re: Опорник от Владимир_К
« Ответ #428 : Январь 07, 2025, 09:24:41 pm »
Владимир ,подскажите пожалуйста,какую функцию выполняет кнопка *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.
Правда надо будет еще сконфигурировать этот порт на вход. Сейчас они все сконфигурированы как выход. Потом сделаю, когда определитесь к какому выводу будет подключена  кнопка. Кнопка подключается между выходом порта и землей. Но, пока не подключайте, вывод порта сконфигурирован на выход и замкнув его на землю, можно сжечь.
« Последнее редактирование: Январь 07, 2025, 09:28:55 pm от Владимир_К »

Оффлайн BL68

  • Sr. Member
  • ****
  • Сообщений: 299
Re: Опорник от Владимир_К
« Ответ #429 : Январь 08, 2025, 12:13:39 am »
Можно было бы еще позаниматься библиотекой Si5351A. Когда-то анализировал, сколько времени уходит на подсчет и загрузку регистров микросхемы. Вышло где-то около 3 миллисек, хотя некоторые товарищи затрачивают на это дело около 0,5 миллисек. Правда пишут на ассемблере. Но, сейчас вроде особой необходимости не вижу..
Чего-то долго. И почему вы не используете аппаратный I2C Atmega32? Если интересно, сброшу кусок кода для работы с встроенным I2C (ноги PC0 PC1).

Оффлайн ZTM

  • Sr. Member
  • ****
  • Сообщений: 345
Re: Опорник от Владимир_К
« Ответ #430 : Январь 08, 2025, 01:41:25 pm »
Это резервная кнопка, на случай, если что-то еще понадобиться на нее повесить. Но, применение я ей так и не нашел.
Так может ее и задействовать под PTT?А выход PTT вывести на PC1 ,например
« Последнее редактирование: Январь 08, 2025, 02:12:24 pm от ZTM »

Оффлайн Владимир_К

  • Hero Member
  • *****
  • Сообщений: 1211
Re: Опорник от Владимир_К
« Ответ #431 : Январь 08, 2025, 06:40:18 pm »
Так может ее и задействовать под PTT
Кнопки здесь работают от делителя напряжения. В зависимости от того, какая кнопка нажата, напряжение поступающее на вход аналого-цифрового преобразователя разное, таким образом контроллер определяет какая кнопка нажата. Кнопку отпускаем, но режим остается. Для отключения этого режима, кнопку надо нажать повторно. То есть, если использовать кнопку menu для включения передачи, то для перехода на прием ее надо отпустить и нажать еще раз. Я думаю, это неудобно. Поэтому переключение RX/TX надо делать другой кнопкой, которая работает без ADC.
Также ее (кнопку) можно подключить к выводу ADC. Он же у Вас также свободен. Просто его надо сконфигурировать как порт, на вход..
« Последнее редактирование: Январь 08, 2025, 06:49:06 pm от Владимир_К »

Оффлайн ZTM

  • Sr. Member
  • ****
  • Сообщений: 345
Re: Опорник от Владимир_К
« Ответ #432 : Январь 08, 2025, 08:53:37 pm »
Просто его надо сконфигурировать как порт, на вход..
Давайте попробуем  1yep

Оффлайн Владимир_К

  • Hero Member
  • *****
  • Сообщений: 1211
Re: Опорник от Владимир_К
« Ответ #433 : Январь 08, 2025, 11:17:55 pm »
попробуем
Открыл исходник и обнаружил там ошибки и, откуда они взялись, ума не приложу. Вот что имеем:
 // ++++ функция инициализации МК ++++
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

  • Sr. Member
  • ****
  • Сообщений: 345
Re: Опорник от Владимир_К
« Ответ #434 : Январь 10, 2025, 07:47:09 am »
Попробуйте откорректировать все сами, потом я проверю
Такое я не осилю,по всей вероятности.Не знаком с программированием. dontt44