Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы
Непрочитано 07.08.2023, 14:51  
CodeNameHawk
Вид на жительство
 
Регистрация: 21.10.2009
Сообщений: 343
Сказал спасибо: 181
Сказали Спасибо 64 раз(а) в 56 сообщении(ях)
CodeNameHawk на пути к лучшему
По умолчанию

Сообщение от Devil Byte Посмотреть сообщение
Нулю, я же ее инициализирую нулем.
Я вам указал в каком месте смотреть, если после выполнения chislo(1987);
она не поменялась, то тут надо и искать.

Сообщение от Devil Byte Посмотреть сообщение
А вот потом почему после того как в в функцию число ввожу значение, то разряд на сегменте не отображается
Ну пишите уже совсем другое, ранее вы писали:
Код:
		//razr1 = 1987/1000;          //но если сделать руками операцию, то еденичка выводится нормально
Проще всего использовать Fuses как придумал производитель проца.
Полезней разобраться какое значение бита включает, а какое отключает заданную функцию, нп. тот же JTAG.
Использование режима "без инверсии", только внесет еще больше путаницы.
Кстати программатор у вас какой, часом не через JTAG?
Реклама:

Последний раз редактировалось mike-y-k; 07.08.2023 в 23:21. Причина: 6.6
CodeNameHawk вне форума  
Непрочитано 07.08.2023, 14:56  
Devil Byte
Временная регистрация
 
Регистрация: 07.03.2019
Сообщений: 87
Сказал спасибо: 11
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Devil Byte на пути к лучшему
По умолчанию Re: Динамическая индикация на 4-разрядном индикаторе

j-Roger
Капец поставил биты, которые Вы Указали.
И все заработало! Спасибо огромное, по поводу алгоритма я примерно так и представлял себе, просто решил попробовать на одном разряде и споткнулся об то что он выводил мусор. Но теперь все работает! Спасибо!!

Последний раз редактировалось mike-y-k; 07.08.2023 в 23:24. Причина: 7.15
Devil Byte вне форума  
Непрочитано 07.08.2023, 16:42  
NewWriter
Заблокирован
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию 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

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

Ну и чтобы сделать динамическую индикацию, нужно соблюдать определенный порядок, о котором уже немало написано было за два десятка лет
NewWriter вне форума  
Непрочитано 07.08.2023, 22:24  
j-Roger
Гражданин KAZUS.RU
 
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 748
Сказал спасибо: 365
Сказали Спасибо 821 раз(а) в 385 сообщении(ях)
j-Roger на пути к лучшему
По умолчанию Re: Динамическая индикация на 4-разрядном индикаторе

Как вариант, преобразование 16-битного беззнакового числа в 5-разрядный неупакованный BCD можно сделать так:
PHP код:

// Входные параметры:
// buffer - адрес буфера результата длиной не менее 5 байт
// value - преобразуемое значение
//
// Результат:
// 5 байт в буфере
void UInt16ToBCD(uint8_t *bufferuint16_t value) {
    
uint8_t i 5;

    
buffer += 4;
    while (
i--) {
        *(
buffer--) = value 10// + '0'; // если требуется ASCII
        
if (ivalue /= 10;
    };

Листинг:
Нажмите на изображение для увеличения
Название: to_bcd.png
Просмотров: 0
Размер:	54.1 Кб
ID:	177714
j-Roger вне форума  
Непрочитано 08.08.2023, 10:20  
-Alan-
Прописка
 
Аватар для -Alan-
 
Регистрация: 05.12.2008
Адрес: Россия, Омск
Сообщений: 145
Сказал спасибо: 39
Сказали Спасибо 29 раз(а) в 22 сообщении(ях)
-Alan- на пути к лучшему
По умолчанию Re: Динамическая индикация на 4-разрядном индикаторе

1. Где в коде управление транзисторами катодов?
Подозреваю, что закомментированые дефайны (которые, между прочим, неправильно описаны).
Раз уж транзисторы подтягиваются вниз, то должно быть так:
Код:
#define seg1 PORTA= 0xFE;
#define seg2 PORTA= 0xFD;
#define seg3 PORTA= 0xFB;
#define seg4 PORTA= 0xF7;
2. Нет самой инициализации порта:
Код:
DDRA = 0x0F;
А сам алгоритм динамической индикации должен постоянно перебирать разряды (впрочем, это должно быть и так понятно).

Рекомендую использовать таймер и его прерывания, настроив на период где-нибудь в 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.
-Alan- вне форума  
Непрочитано 08.08.2023, 10:54  
baiderin
Почётный гражданин KAZUS.RU
 
Аватар для baiderin
 
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,731
Сказал спасибо: 2,454
Сказали Спасибо 893 раз(а) в 580 сообщении(ях)
baiderin на пути к лучшему
По умолчанию 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; // единицы
baiderin на форуме  
Непрочитано 08.08.2023, 12:37  
NewWriter
Заблокирован
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию 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(). Однако, для простого числового индикатора она будет тяжеловата, поэтому не возбраняется написать собственный функциональный аналог.
NewWriter вне форума  
Непрочитано 11.08.2023, 06:29  
Devil Byte
Временная регистрация
 
Регистрация: 07.03.2019
Сообщений: 87
Сказал спасибо: 11
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Devil Byte на пути к лучшему
По умолчанию

Сообщение от CodeNameHawk Посмотреть сообщение
Я вам указал в каком месте смотреть,
Кстати программатор у вас какой, часом не через JTAG?
У меня usbasp.
Знаете проблема в том что ни один из людей рассказывающих о мк на видео не говорит что лучше начать с фьюзов.
Я хотел прошить его на внешнее тактирование 16 мгц, но для меня все это в новинку и по калькулятору вообще не нашел как включить 16 мгц внешний резонатор

Сообщение от NewWriter Посмотреть сообщение
немало написано было за два десятка лет
Я выбрал для себя определённый ряд роликов и начал учится по ним, имена переменных и функции оттуда, я бы тоже сделал их на английском и короче. Но так как я только учусь - проще именно повторять и разбираться. Я в курсе сто нет аппаратной поддержки деления и так далее, но это же урок, понятно что в дальнейшем и дилеи использовать не гуд, а нужны прерывания, но я же только начал). Главное что то что я написал своими руками работает, появятся первичные знания, научусь писать более чистый код. Но за совет спасибо) это всегда полезно, так как ваш совет конструктивен

Последний раз редактировалось mike-y-k; 25.10.2023 в 11:44. Причина: 6.6
Devil Byte вне форума  
Непрочитано 11.08.2023, 06:36  
NewWriter
Заблокирован
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: Динамическая индикация на 4-разрядном индикаторе

А мануалы почитать - никак, да? Только по видосикам обучаемся?
Фьюзы - это просто конфигурационные биты, в этом микроконтроллере именно так решен вопрос базовых настроек микроконтроллера. В мануале (даташите) это всё описано. Надо просто захотеть видеть. И никаких проблем!
NewWriter вне форума  
Непрочитано 11.08.2023, 06:38  
Devil Byte
Временная регистрация
 
Регистрация: 07.03.2019
Сообщений: 87
Сказал спасибо: 11
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Devil Byte на пути к лучшему
По умолчанию

Сообщение от 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.
Devil Byte вне форума  
 

Закладки
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Продаю 2-х разрядный 7-сегментный индикатор KEM-3261AG (зеленый ) GFIRSOFF Барахолка электронных компонентов 0 19.04.2017 08:24
Индикатор для китайского приёмника radiolubitel 512 Автоматика и аппаратура связи 6 17.06.2015 13:32
Статическая индикация текста на многосегментном индикаторе Vigvam13 TTL и CMOS логика 33 05.06.2014 07:02
7-ми сегментный индикатор, atmega и динамическая индикация ollycat Микроконтроллеры, АЦП, память и т.д 38 09.07.2011 19:09
Динамическая индикация mironov Микроконтроллеры, АЦП, память и т.д 4 02.07.2010 17:37


Часовой пояс GMT +4, время: 15:33.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot