Digits - количество цифр после запятой. Может иметь значение от 1 до 7.
P.S. Вообще любыми путями старайтесь избегать работы с типом Single, он съедает безумно много места. Есть масса вариантов, при помощи которых можно решить задачу и без использования этого типа. Тем более касаемо вывода на LCD. Это не дело, что "программа" с инкрементом двух переменных и выводом на LCD забивает 2313 под завязку.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
vanyap1 писал(а):Опрашивать клавиатуру я умею. Кажись уже писал это.
Меня интересует конкретно - сложение нескольких последовательных результатов опроса нажатых кнопок в число.
Ну вроде как форум для вопросов & ответов и нужен.
P.S. Только пожалуйста, никогда и нигде больше не говорите, что эти вопросы - глупые, и что Вы новичок, и только начали разбираться. Вопрос сам по себе способен рассказать о Вашем уровне знаний, и в пояснениях не нуждается. А глупым он не может быть хотя бы потому, что Вы пытаетесь разобраться в этой теме. Что уже само по себе достойно уважения. Нет в этом мире ни одного человека, который бы родился сразу со знаниями.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
edm2007 писал(а):Ну вроде как форум для вопросов & ответов и нужен.
Пользуясь случаем задам и я ряд вопросов:
Вернулся к вопросу совместного вывода информации на LED и ЖК индикатор. На LED индикаторы выводится, но стоит включить в основной цикл подпрограмму вывода на ЖК и все виснет со страшной силой, неужели вывод на LED столь ресурсоемкий ?
По отдельности работает, либо вывод на ЖК, либо вывод на LED.
Второе смущает вопрос линейности АЦП при выводе на LED, на входе АЦП 1.409 на экран выводится 14.43 (должно 14.09 как я полагаю), неужели что то при переводе АЦП в цифры?
дабы не засорять? весь код не привожу ибо всё есть в архиве?
Старался комментировать как можно понятнее.
Наверчено непонятного конечно, куча. Из одной индикации столько лишних прыжков... Ну и не компилируется. Ругается, что имена переменных совпадают с метками из библиотеки. А так оно и есть... Разнос по разрядам вообще удивителен. Любое число можно разнести в цикле всего двумя командами, без всяких промежуточных вычислений:
Dim Value As Word ' переменная для разноса
Dim I(4) As Word ' разряды
Dim Temp As Byte ' вспомогательная переменная
Value = 1234
......
For Temp = 4 To 1 Step -1 ' в цикле разбиваем переменную по разрядам
I(temp) = Value Mod 10
Value = Value / 10
Next
Тут остается только разрядность задавать. И не забывать, что тип массива должен соответствовать типу переменной. А еще лучше создать переменную дя копии значения, и работать уже с ней. Так разнос еще на одну операцию увеличится, но зато массив не нужно будет избыточным по типу делать. Да и само значение будет целым, а иначе при выходе оно будет равно нулю, о чем можно забыть, и долго искать ошибку.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
edm2007 писал(а):Ну и не компилируется. Ругается, что имена переменных совпадают с метками из библиотеки. А так оно и есть...
Ну да как и говорил люблю имена переменных одинаковые Т.е вся это абракадабра таится где то в закоулках моего (извините за выражение КОДА)
У меня кстати всё компилируется в версии 1.11.9.8, ну это так отступление.
'************************ [прерывание таймера Т0] ******************************
Refresh:
'=============== Разряды ===================
Incr Count : If Count > 4 Then Count = 1 ' увеличиваем значение счетчика на 4 разряда
Ledout = Lookup(count , Razr) ' забираем номер разряда
'Gosub Mig_razr ' подпрограмма мигания разряда
Gosub Registr
'========== Второй индикатор ===============
Ledout = Lookup(number(count + 4) , Digits) ' забираем код цифры для ВТОРОГО индикатора
Gosub Tochka2 : Gosub Registr 'зажигаем точку, закидываем в регистр
'========== Первый индикатор ===============
Ledout = Lookup(number(count) , Digits) ' забираем код цифры для ПЕРВОГО индикатора
Gosub Tochka1 : Gosub Registr 'зажигаем точку, закидываем в регистр
Pulseout Portc , 2 , 20 ' защелкиваем данные (для 4МГц импульс 5мкс)
Return
'<----------------- подпрограмма отправки данных в регистр
Registr:
Shiftout 595data , 595clock , Ledout , 1 'задвигаем данные
Return
'<------------------ управление точками ПЕРВОГО индикатора
Tochka1:
If H_flag1(count) = 1 Then ' если установлен флаг
Ledout = Ledout Xor &B10000000 ' зажигаем точку
End If
Return
'<------------------ управление точками ВТОРОГО индикатора
Tochka2:
If H_flag2(count) = 1 Then ' если установлен флаг
Ledout = Ledout Xor &B10000000 ' зажигаем точку
End If
Return
'<-------------------------- Мигаем разрядами
Mig_razr:
Incr Blink_count : If Blink_count > 400 Then Blink_count = 1 ' длительность мигания
If Blink_flag(count) = 1 And Blink_count > 200 Then ' если флаг мигания выставлен и счетчик > 200
Ledout = Lookup(0 , Razr) ' выключаем разряд
Else ' иначе (флаг не выставлен, либо счетчик < 200)
Ledout = Lookup(count , Razr) ' забираем в переменную номер разряда
End If
Return
Если за него, то как не странно таким образом код стал немного меньше, принимал во внимание совет
- похожие программы оформлять в подпрограммы. Различия формировать ветвлением и дроблением участков;
Да это понятно, но например откуда еще у Вас вызываются Tochka1 и Tochka2? Я еще бы понял, если бы это был вызов для обеих индикаторов (как с Registr).
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Ну да с точками согласен, (вызывается командой Gosub Tochka2, Gosub Tochka1) пока не придумал как в одной подпрограмме опрашивать, поэтому оставил пока так... Это сильно тормозит выполнение кода, или просто вносит не понятки и сумятицу (читаемость кода)?
В принципе можно включить в общий код прерывания Refresh:
Дело тут даже не в торможении, просто Bascom по своей милой привычке и так все регистры сохраняет в стек без разбора, а тут еще вызовы CALL, где адрес возврата тоже в стеке сохраняется... Да еще библиотека дисплея... Это та же история повторяется, что и с термометром в этой теме. Там по всей видимости стек переполняло и вылазили разные нехорошие вещи. Собственно, тут Proteus и пишет в логах, о выходе за пределы памяти.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Если Вы укажете NOSAVE, то он сам вообще ничего сохранять не будет. Представьте, выполняется любая процедура LCD индикатора, и тут вызывается прерывание, в котором РОН всяко-разно крутятся и изменяются, а потом мы возвращаемся к выполнению прерванной процедуры. С непонятно какими значениями в регистрах...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Да я примерно понял про директиву, не понятно как в ручную сохранять? Только вставкой на ассемблере или есть свои команды...... или выигрыша нет и не стоит заморачиваться?
'************************ [прерывание таймера Т0] ******************************
Refresh:
'=============== Разряды ===================
Incr Count : If Count > 4 Then Count = 1 ' увеличиваем значение счетчика на 4 разряда
Ledout = Lookup(count , Razr) ' забираем номер разряда
'Gosub Mig_razr ' подпрограмма мигания разряда
Gosub Registr
'========== Второй индикатор ===============
Call Uimetr
Value = I * 3 ' переменная для разноса
For Temp = 8 To 4 Step -1 ' в цикле разбиваем переменную по разрядам
Number(temp) = Value Mod 10
Value = Value / 10
Next
Ledout = Lookup(number(count + 4) , Digits) ' забираем код цифры для ВТОРОГО индикатора
Gosub Tochka2 : Gosub Registr 'зажигаем точку, закидываем в регистр
'========== Первый индикатор ===============
Call Uimetr
Value = V * 3 ' переменная для разноса
For Temp = 4 To 1 Step -1 ' в цикле разбиваем переменную по разрядам
Number(temp) = Value Mod 10
Value = Value / 10
Next
Ledout = Lookup(number(count) , Digits) ' забираем код цифры для ПЕРВОГО индикатора
Gosub Tochka1 : Gosub Registr 'зажигаем точку, закидываем в регистр
Pulseout Portc , 2 , 20 ' защелкиваем данные (для 4МГц импульс 5мкс)
Return
'<----------------- подпрограмма отправки данных в регистр
Registr:
Shiftout 595data , 595clock , Ledout , 1 'задвигаем данные
Return
'<------------------ управление точками ПЕРВОГО индикатора
Tochka1:
If H_flag1(count) = 1 Then ' если установлен флаг
Ledout = Ledout Xor &B10000000 ' зажигаем точку
End If
Return
'<------------------ управление точками ВТОРОГО индикатора
Tochka2:
If H_flag2(count) = 1 Then ' если установлен флаг
Ledout = Ledout Xor &B10000000 ' зажигаем точку
End If
Return
Вроде советуют в обработке прерываний ставить только флаги и не каких вычислений. Код работает, но ситуация прежняя если включить в основном цикле опрос ЖК дисплея, все тормозит.
amv2000 писал(а):Вроде советуют в обработке прерываний ставить только флаги и не каких вычислений.
Ну вообще правильно советуют. Не так категорично, конечно. Просто любое прерывание, как не сложно догадаться, прерывает выполнение программы. И очень нежелательно, чтобы это длилось долго. Например на Си я в прерывание индикации вообще прихожу не просто с разбитой по разрядам переменной, а с уже готовыми для индикатора цифрами. Остается только загнать значение в порт и зажечь его.
Но тут опять же от самой реализации кода тоже все зависит. Например, у меня есть конструкции, в которых вся работа выполняется именно в прерывании, а основной цикл вообще пустой.
У Вас же получается, что все друг другу мешают.
P.S. А вообще такая индикация выполняется очень быстро. Можете сами проверить в протеусе, это буквально каких-то 60 - 70 микросекунд.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Добрый день,
Пытаюсь сделать драйвер мощного светодиода
С ШИМом разобрался, но вот возник вопрос измерить ток на этом самом светодиоде.
Как это правильно сделать.
Спасибо.