AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
07.08.2023, 14:51
|
|
Вид на жительство
Регистрация: 21.10.2009
Сообщений: 343
Сказал спасибо: 181
Сказали Спасибо 64 раз(а) в 56 сообщении(ях)
|
Сообщение от Devil Byte
|
Нулю, я же ее инициализирую нулем.
|
Я вам указал в каком месте смотреть, если после выполнения chislo(1987);
она не поменялась, то тут надо и искать.
Сообщение от Devil Byte
|
А вот потом почему после того как в в функцию число ввожу значение, то разряд на сегменте не отображается
|
Ну пишите уже совсем другое, ранее вы писали:
Код:
|
//razr1 = 1987/1000; //но если сделать руками операцию, то еденичка выводится нормально |
Проще всего использовать Fuses как придумал производитель проца.
Полезней разобраться какое значение бита включает, а какое отключает заданную функцию, нп. тот же JTAG.
Использование режима "без инверсии", только внесет еще больше путаницы.
Кстати программатор у вас какой, часом не через JTAG?
Последний раз редактировалось mike-y-k; 07.08.2023 в 23:21.
Причина: 6.6
|
|
|
|
07.08.2023, 14:56
|
|
Временная регистрация
Регистрация: 07.03.2019
Сообщений: 87
Сказал спасибо: 11
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Динамическая индикация на 4-разрядном индикаторе
j-Roger
Капец поставил биты, которые Вы Указали.
И все заработало! Спасибо огромное, по поводу алгоритма я примерно так и представлял себе, просто решил попробовать на одном разряде и споткнулся об то что он выводил мусор. Но теперь все работает! Спасибо!!
Последний раз редактировалось mike-y-k; 07.08.2023 в 23:24.
Причина: 7.15
|
|
|
|
07.08.2023, 16:42
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
|
Re: Динамическая индикация на 4-разрядном индикаторе
Причина - в использовании транслита razbivka_chisla, chislo - ну это нисирьозна какта. Number, Digit, BinToBCD - это уже по-взрослому.
Во-вторых, следует понимать саму суть преобразования в десятичное поразрядное представление. Кстати, есть алгоритмы, основанные не на делении, а на сдвигах и сложениях - так мы делали в эпоху ассемблера.
Ну а если речь о делениях, то... Просто подумайте, как из числа в диапазоне 0...9999 получить разряд тысяч? Правильно, разделить (целочисленно без округления) на 1000. При этом, остаток от этого деления будет трехзначным, а значит, его можно поделить на 100 и получить разряд сотен. Затем, аналогично получается разряд десятков и разряд единиц.
Код:
|
thou = num / 1000;
hund = num % 1000 / 100;
tens = num % 100 / 10;
unit = num % 10; |
неэкономично по числу операций деления на микроконтроллере, не поддерживающем аппаратное деление, но в принципе, "и так сайдьёт".
После того, как была произведена конвертация в десятичный позиционный код, нужно этим числам от 0 до 9 поставить в соответствие карту сегментов индикатора. Делается это табличным методом. Есть несколько способов, но самый примитивный и простой - закидываем в таблицу непосредственно 16-ричный код, соответствующий включаемым сегментам на порту. Все сегменты индикатора должны быть заведены на один порт.
Например,
PA0 - сегмент A
PA1 - сегмент B
PA2 - сегмент C
PA3 - сегмент D
PA4 - сегмент E
PA5 - сегмент F
PA6 - сегмент G
Проходя все отображаемые цифры от 0 до 9, получаем список включаемых сегментов.
Для индикатора с ОК для зажигания нужно подать на сегмент высокий уровень.
цифра 0 - 0x3F
цифра 1 - 0x06
цифра 2 - 0x59
... и так далее. Из этих цифр составляется таблица сегментов, индекс которой равен отображаемой цифре, а элемент таблицы по индексу передается прямо на порт.
Ну и чтобы сделать динамическую индикацию, нужно соблюдать определенный порядок, о котором уже немало написано было за два десятка лет
|
|
|
|
07.08.2023, 22:24
|
|
Гражданин KAZUS.RU
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 748
Сказал спасибо: 365
Сказали Спасибо 821 раз(а) в 385 сообщении(ях)
|
Re: Динамическая индикация на 4-разрядном индикаторе
Как вариант, преобразование 16-битного беззнакового числа в 5-разрядный неупакованный BCD можно сделать так:
PHP код:
|
// Входные параметры:
// buffer - адрес буфера результата длиной не менее 5 байт
// value - преобразуемое значение
//
// Результат:
// 5 байт в буфере
void UInt16ToBCD(uint8_t *buffer, uint16_t value) {
uint8_t i = 5;
buffer += 4;
while (i--) {
*(buffer--) = value % 10; // + '0'; // если требуется ASCII
if (i) value /= 10;
};
}
|
Листинг:
|
|
|
|
08.08.2023, 10:20
|
|
Прописка
Регистрация: 05.12.2008
Адрес: Россия, Омск
Сообщений: 145
Сказал спасибо: 39
Сказали Спасибо 29 раз(а) в 22 сообщении(ях)
|
Re: Динамическая индикация на 4-разрядном индикаторе
1. Где в коде управление транзисторами катодов?
Подозреваю, что закомментированые дефайны (которые, между прочим, неправильно описаны).
Раз уж транзисторы подтягиваются вниз, то должно быть так:
Код:
|
#define seg1 PORTA= 0xFE;
#define seg2 PORTA= 0xFD;
#define seg3 PORTA= 0xFB;
#define seg4 PORTA= 0xF7; |
2. Нет самой инициализации порта:
А сам алгоритм динамической индикации должен постоянно перебирать разряды (впрочем, это должно быть и так понятно).
Рекомендую использовать таймер и его прерывания, настроив на период где-нибудь в 1мс.
Обработчик можно сделать таким (исходя из вашего кода и ваших переменных)
Код:
|
unsigned char razryad[4] = {0, 0, 0, 0}; // Разряды не горят
volatile unsigned char current_sym = 0;
void НАЗВАНИЕ_ОБРАБОТЧИКА (void) {
PORTA |= 0x0F; // Отключаем аноды
if (++current_sym ›= 4) {
current_sym = 0;
}
SEG7_PORT = numbers[razryad[current_sym]]; // Выводим на порт значение. Его берём исходя из значения текущего разряда
PORTA &= ~(1 ‹‹ current_sym); // Включаем соответствующий анод.
// Либо PORTA = (0xFF ^ (1 ‹‹ current_sym));
// Либо через ассемблерную инструкцию "CBI PORTA, current_sym", в которую по идее должна обратиться строка выше (не закомментированная)
} |
Для примера можно вывести "1234" подобным образом:
Код:
|
razryad[0] = numbers[1];
razryad[1] = numbers[2];
razryad[2] = numbers[3];
razryad[3] = numbers[4]; |
Последний раз редактировалось -Alan-; 08.08.2023 в 10:36.
|
|
|
|
08.08.2023, 10:54
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,731
Сказал спасибо: 2,454
Сказали Спасибо 893 раз(а) в 580 сообщении(ях)
|
Re: Динамическая индикация на 4-разрядном индикаторе
Сообщение от Devil Byte
|
razr1 = razbivka_chisla/1000; // тысячи
razr2 = razbivka_chisla%1000/100; // сотни
razr3 = razbivka_chisla%100/10; // десятки
razr4 = razbivka_chisla%10; // единицы
|
Ну да?
razr4 = razbivka_chisla%1000%100%10; // единицы
|
|
|
|
08.08.2023, 12:37
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
|
Re: Динамическая индикация на 4-разрядном индикаторе
Ну как бы да:
Код:
|
int thou, hund, tens, unit;
void BinToBCD(int num)
{
thou = num / 1000;
hund = num % 1000 / 100;
tens = num % 100 / 10;
unit = num % 10;
}
int main()
{
BinToBCD(0);
cout ‹‹ "Число " ‹‹ 0 ‹‹ ": \t" ‹‹ thou ‹‹ " | " ‹‹ hund ‹‹ " | " ‹‹ tens ‹‹ " | " ‹‹ unit ‹‹ endl;
for(int i = 1; i ‹ 9999;)
{
BinToBCD(i);
cout ‹‹ "Число " ‹‹ i ‹‹ ": \t" ‹‹ thou ‹‹ " | " ‹‹ hund ‹‹ " | " ‹‹ tens ‹‹ " | " ‹‹ unit ‹‹ endl;
if(i ‹ 100) i +=37;
else if(i ‹ 1000) i += 432;
else i += 3196;
}
BinToBCD(9999);
cout ‹‹ "Число " ‹‹ 9999 ‹‹ ": \t" ‹‹ thou ‹‹ " | " ‹‹ hund ‹‹ " | " ‹‹ tens ‹‹ " | " ‹‹ unit ‹‹ endl; |
Код:
|
Число 0: 0 | 0 | 0 | 0
Число 1: 0 | 0 | 0 | 1
Число 38: 0 | 0 | 3 | 8
Число 75: 0 | 0 | 7 | 5
Число 112: 0 | 1 | 1 | 2
Число 544: 0 | 5 | 4 | 4
Число 976: 0 | 9 | 7 | 6
Число 1408: 1 | 4 | 0 | 8
Число 4604: 4 | 6 | 0 | 4
Число 7800: 7 | 8 | 0 | 0
Число 9999: 9 | 9 | 9 | 9 |
Можно еще добавить гашение незначащих (передних) нулей, добавив при выводе проверку старших (левых) трех разрядов на =0 и заменяя на выключенные все сегменты. Младший (правый) разряд при = 0 гасить конечно не нужно. Там тоже есть тонкость "для подумать", чтобы сделать правильно.
Конечно, вся эта вещь уже реализована в стандартной функции sprintf(). Однако, для простого числового индикатора она будет тяжеловата, поэтому не возбраняется написать собственный функциональный аналог.
|
|
|
|
11.08.2023, 06:29
|
|
Временная регистрация
Регистрация: 07.03.2019
Сообщений: 87
Сказал спасибо: 11
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от CodeNameHawk
|
Я вам указал в каком месте смотреть,
Кстати программатор у вас какой, часом не через JTAG?
|
У меня usbasp.
Знаете проблема в том что ни один из людей рассказывающих о мк на видео не говорит что лучше начать с фьюзов.
Я хотел прошить его на внешнее тактирование 16 мгц, но для меня все это в новинку и по калькулятору вообще не нашел как включить 16 мгц внешний резонатор
Сообщение от NewWriter
|
немало написано было за два десятка лет
|
Я выбрал для себя определённый ряд роликов и начал учится по ним, имена переменных и функции оттуда, я бы тоже сделал их на английском и короче. Но так как я только учусь - проще именно повторять и разбираться. Я в курсе сто нет аппаратной поддержки деления и так далее, но это же урок, понятно что в дальнейшем и дилеи использовать не гуд, а нужны прерывания, но я же только начал). Главное что то что я написал своими руками работает, появятся первичные знания, научусь писать более чистый код. Но за совет спасибо) это всегда полезно, так как ваш совет конструктивен
Последний раз редактировалось mike-y-k; 25.10.2023 в 11:44.
Причина: 6.6
|
|
|
|
11.08.2023, 06:36
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
|
Re: Динамическая индикация на 4-разрядном индикаторе
А мануалы почитать - никак, да? Только по видосикам обучаемся?
Фьюзы - это просто конфигурационные биты, в этом микроконтроллере именно так решен вопрос базовых настроек микроконтроллера. В мануале (даташите) это всё описано. Надо просто захотеть видеть. И никаких проблем!
|
|
|
|
11.08.2023, 06:38
|
|
Временная регистрация
Регистрация: 07.03.2019
Сообщений: 87
Сказал спасибо: 11
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от j-Roger
|
Как вариант, преобразование 16-битного беззнакового числа в 5-разрядный неупакованный BCD можно сделать ]
|
Циклы это интересная штука но я до них пока не обрался, кога начну их юзать то попробую, я понимаю что способов много, но надо начать с чего то простого
Сообщение от NewWriter
|
Ну как бы да:
Код:
|
int thou, hund, tens, unit;
void BinToBCD(int num) |
|
Код:
|
Спасибо за интересный пример, буду пробовать
Сообщение от -Alan-
|
1. Где в коде управление транзисторами катодов?
Подозреваю, что закомментированные дефайны (которые, между прочим, неправильно описаны).
|
|
Но работало же, вопрос был в том что у меня на разряд выводился мусор.
Проблема для меня во фьзбитах, я пытался заставить мк работать от внешнего резонатора на 16mhz
я понимаю что вариантов написать такой простой софт уйма, но начал как смог. Спасибо за пример
Сообщение от NewWriter
|
А мануалы почитать - никак, да? Только по видосикам обучаемся?
Фьюзы - это просто конфигурационные биты, в этом микроконтроллере именно так решен вопрос базовых настроек микроконтроллера. В мануале (даташите) это всё описано. Надо просто захотеть видеть. И никаких проблем!
|
Ну хорошо написано External Crystal/Ceramic Resonator 1111 - 1010(CKSEL3:0)
Как мне понять что проставить? это указано в даташите. Какая комбинация верная? и почему их три а не одна?
СKOPT0
CKSEL3:0
101, 110, 111
я видел описание фьюзов, но не видел подробных мануалов о том как их ставить. И ще скажите пожалуйста какой программатор купить, если вдруг не те фьюзы поставлю и будет сверхнизкое тактирование
Последний раз редактировалось Falconist; 24.10.2023 в 15:49.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:33.
|
|