да ерунда эти советыАlex писал(а):ЗЫ: Вообще, как уже говорилось выше, правильным вариантом будет - использование своего отдельного буфера для индикации.
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
да ерунда эти советыАlex писал(а):ЗЫ: Вообще, как уже говорилось выше, правильным вариантом будет - использование своего отдельного буфера для индикации.
Код: Выделить всё
void ind_update (void)
{
static unsigned char count = 0;
PORTB = 0x00;
PORTD = adc_data[count>>1]; // выводим в порт код цифры (сегменты)
if (count == 0) PORTB = (1<<0); // определяем какой разряд должен гореть (ИМХО, тут копать нужно)
if (count == 2) PORTB = (1<<1);
if (count == 4) PORTB = (1<<2);
if (count == 6) PORTB = (1<<3);
if(++count>=8) count=0; // включаем следующий разряд
}
Alex, это совет диверсанта или вы просто поторопились и наделали ошибок?Аlex писал(а):Вот ещё вариант, попробуйте
Первая строчка в функции - объявленная переменная равна 0.ARV писал(а):рассмотрим работу функции:
1. вход в функцию: индикатор отображает 0-й разряд, count = 1.
2. PORTB = 0; - гасим индикатор
3. цепочкой if-ов ВКЛЮЧАЕМ СЛЕДУЮЩИЙ разряд, т.е. зажигаем в 1-ом разряде то, что выводилось ранее в PORTD, т.е. инфу для 0-го разряда!!! это и есть подсветка соседнего знакоместа
4. PORTD = adc_data[count]; - обновляем сегменты, т.е. теперь в 1-ом знакоместе светится то, что и должно
5. вычисляем count для следующего знакоместа.
таким образом в предлагаемом алгоритме ГАРАНТИРУЕТСЯ подсветка сегментов!!!
Код: Выделить всё
void ind_update2 (void)
{
PORTD = 0x00; // гасим все сегменты
PORTB = (1 << count); //выбираем следующий разряд
switch (count)
{
case 0:
PORTD = adc_data[0];
break;
case 1:
PORTD = adc_data[1];
break;
case 2:
PORTD = adc_data[2];
break;
case 3:
PORTD = adc_data[3];
break;
}
count++;
if (count == 4) count = 0;
}
Код: Выделить всё
static char count = 0;
// гасим все
PORTB=0;
// вычисляем следующую позицию
if(++count >= 4) count = 0;
// обновляем сегменты
PORTD = adc_data[count];
// включаем индикацию
PORTB = 1 << count;DataLife, я ж Вам сказал, сделайте прерывание от того же таймера по совпадению. В регистр сравнения внесите значение, к примеру, 0xCFFF. И в прерывании по совпадению выключайте все индикаторыЯ всё больше становлюсь похож на свою аватарку...
Какой конкретно ?DataLife писал(а): PS. Аlex, а Ваш вариант работает. Засветок от соседних разрядов нет.
Код: Выделить всё
volatile unsigned int ADC_volt;
...
ADC_volt=(float)adc_tmp*4645/10000;
...
data_convert(ADC_volt);
Код: Выделить всё
void data_convert(unsigned int value)
где вы ее нашли? неатомарность могла бы визуально проявляться в засветке соседнего знакоместа "иногда"... а тут регулярная засветка - см. отчет о тесте со "счетчиком"Goodefine писал(а):Ого, какой консилиум и все из-за неатомарности доступа
Код: Выделить всё
void data_convert(unsigned int value)
{
unsigned char tmp; // переменная для временного хранения данных преобразования
tmp = value / 1000;
adc_data[0] = SEGMENTE[tmp];
tmp = value % 1000 / 100;
adc_data[1] = SEGMENTE[tmp];
tmp = value % 100 / 10;
adc_data[2] = SEGMENTE[tmp];
tmp = value % 10;
adc_data[3] = SEGMENTE[tmp];
}
Код: Выделить всё
PORTD = adc_data[count];
я имел ввиду не наличие неатомарности доступа, а ее влияние.Goodefine писал(а):А вы не нашли? Подсказываю, что будет, когда в теле функции (места выбрать по желанию, благо их там много)
....
И правда, никакой неатомарности ))) А индикация молотит быстро, и на каком разряде это случится - чистая вероятность. И добавить возможное неявное приведение типов и связанные с этим эффекты. А так, все хорошо... все хорошо
Я бы не стал так уверенно говорить, что там и как будет отображаться - компилятор вполне может использовать элементы массива и под промежуточные вычисления (деление и прочее), выкинув при этом переменную temp вообще. Добавьте неявное приведение типов (бред с флоатом). И не забыли какой компилятор? )) Насчет засветки - "фантомы" уже окончательно перешли в нее?ARV писал(а): допустим, в массив выведено 1234, а новое значение 5678. индикация уже отработала 12, в этот момент выводится новое значение... то есть на один цикл индикации мы увидим 1278, которое уже в следующем цикле сменится на 5678...
Тем не менее, это не дало вам возможности найти проблему здесь, по крайней мере быстро. А в электронике чудес не бывает, хотя в этой дискуссии уже прослеживается оспаривание данного факта.я по необходимости в течение нескольких лет сделал штук 15 проектов с 7-сегментной индикацией...
чудес не бывает, но бывают чудотворцыGoodefine писал(а):Тем не менее, это не дало вам возможности найти проблему здесь, по крайней мере быстро. А в электронике чудес не бывает
А какой средой разработки пользуйтесь под STM32HHIMERA писал(а):ДМА это Прямой Досуп к Памяти...