вывод progress bar-a - Форум Picbasic.ru
Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 212»
Модератор форума: ivan_fd 
Форум Picbasic.ru » Программирование МК » PicBasicPro » вывод progress bar-a (что-то в алгоритме этом есть...)
вывод progress bar-a
timerlan Дата: Вс, 24.01.2016, 16:52  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 88
Репутация: 0   ±
Замечания:   ±
На сайте с 18.03.2012

Статус: Offline

Всем здравствуйте! помогите, пожалуйста, разобраться с такой ситуёвиной: пытаюсь, в качестве эксперимента, вывести на стандартный LCD прогресбар, который меняется от потенциометра, вот код:

DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 3
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 0
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
DEFINE LCD_COMMANDUS 2000
DEFINE LCD_DATAUS 50

Define ADC_BITS 8
Define ADC_CLOCK 3
Define ADC_SAMPLEUS 50
adval var byte

Init:
PortB = $00
TrisB = %00000000
TRISA = %11111111
ADCON1 = %00000010

lcdout $FE,1

main:

ADCIN 0, adval

lcdout $FE,1

if adval < 75 then
lcdout $fe, $80,"0"
endif

if adval > 100 then
lcdout $fe, $80,$ff
endif

if adval > 120 then
lcdout $fe, $80,$ff,$ff
endif

if adval > 140 then
lcdout $fe, $80,$ff,$ff,$ff
endif

if adval > 160 then
lcdout $fe, $80,$ff,$ff,$ff,$ff
endif

if adval > 180 then
lcdout $fe, $80,$ff,$ff,$ff,$ff,$ff
endif

if adval > 200 then
lcdout $fe, $80,$ff,$ff,$ff,$ff,$ff,$ff
endif

if adval > 210 then
lcdout $fe, $80,$ff,$ff,$ff,$ff,$ff,$ff,$ff
endif

if adval > 220 then
lcdout $fe, $80,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
endif
pause 300
goto main

работает, только странно как-то, все время дергается, моргает, изображение на экране, как только не перепробовал, не могу догнать, из-за чего происходит это, как в железе, так и в протеусе ведет себя одинаково. МК 16F72, 4MHz
Прикрепления: 3984656.jpg(203Kb) · 5029535.pbp(2Kb)
ЯНДЕКС Дата: 24.01.2016
xvovanx Дата: Вс, 24.01.2016, 19:39  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 247
Репутация: 12   ±
Замечания:   ±
На сайте с 02.05.2013

Статус: Offline

Дергается потому, что в цикле вы постоянно очищаете экран и потом выводите инфо снова, поэтому и возникают моргания. Вы не очищайте экран вообще, а выводите целыми строками с пустыми знакоместами справа и ими будете стирать старую инфу справа, типа

if adval > 140 then
lcdout $fe, $80,$ff,$ff,$ff ," "," "," "," "," "," "
endif
.......
if adval > 220 then
lcdout $fe, $80,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
endif

Сообщение отредактировал xvovanx - Вс, 24.01.2016, 19:44
timerlan Дата: Пн, 25.01.2016, 12:29  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 88
Репутация: 0   ±
Замечания:   ±
На сайте с 18.03.2012

Статус: Offline

xvovanx, спасибо, сейчас попробую, но что-то мне кажется, как-то очищать экран надо будет все равно...и неужели 4 MHz недостаточно для визуальной "стабильности" изображения?...

Добавлено (25.01.2016, 12:29)
---------------------------------------------
сделал вот так:

 DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 3
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 0
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
DEFINE LCD_COMMANDUS 2000
DEFINE LCD_DATAUS 50

Define ADC_BITS 8
Define ADC_CLOCK 3
Define ADC_SAMPLEUS 50
adval var byte

Init:
PortB = $00
TrisB = %00000000
TRISA = %11111111
ADCON1 = %00000010

lcdout $FE,1

main:
adcin 0, adval

if adval < 75 then
lcdout $fe, $80,"0"
endif

if adval > 100 then
lcdout $fe, $80,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10
endif

if adval > 120 then
lcdout $fe, $80,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10
endif

if adval > 140 then
lcdout $fe, $80,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10
endif

if adval > 160 then
lcdout $fe, $80,$ff,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10
endif

if adval > 180 then
lcdout $fe, $80,$ff,$ff,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10
endif

if adval > 200 then
lcdout $fe, $80,$ff,$ff,$ff,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10
endif

if adval > 210 then
lcdout $fe, $80,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10
endif

if adval > 220 then
lcdout $fe, $80,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10
endif
pause 500
goto main

чуть лучше, при повороте ручки назад "ненужные" элементы гаснут, но мерцание все равно очень заметное...

Matrix252005 Дата: Пн, 25.01.2016, 12:38  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 672
Репутация: 20   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

Приятного времени суток!!!

timerlan, попробуйте поиграться с задержкой: pause 500...
Для начала уберите ее полностью, потом подбирайте до норм результата...


THE TRUTH IS OUT THERE.

С уважением, Николай.
timerlan Дата: Пн, 25.01.2016, 12:57  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 88
Репутация: 0   ±
Замечания:   ±
На сайте с 18.03.2012

Статус: Offline

Matrix252005, я тоже грешил на неё, варьировал от нуля до 1000 с шагом в 10, не добился нужного, либо очень быстро, либо очень медленно, но моргает...мне кажется, что где-то всамом алгоритме сравнения и вывода на дисплей затык, который я не вижу...при выводе на светодиоды(по всему В порту) все отлично работает...
Matrix252005 Дата: Пн, 25.01.2016, 13:12  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 672
Репутация: 20   ±
Замечания:   ±
На сайте с 12.10.2007

Статус: Offline

Что еще мне не сильно нравится в Вашем коде, так это сами условия...

Взять например:

if adval > 100 then 
lcdout $fe, $80,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10
endif

if adval > 120 then 
lcdout $fe, $80,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10
endif

Например adval = 130, смотрим по условиям
if adval > 100... 130 больше 100... Условие выполняется...

if adval > 120... тоже самое...

Попробуйте сделать так:

if adval > 100 and adval < 119 then...

И так далее ко всем условиям...


THE TRUTH IS OUT THERE.

С уважением, Николай.
timerlan Дата: Вт, 26.01.2016, 17:56  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 88
Репутация: 0   ±
Замечания:   ±
На сайте с 18.03.2012

Статус: Offline

ага, спасибо, хорошая мысль, сейчас попробую!..

Добавлено (26.01.2016, 17:16)
---------------------------------------------
попробовал вот так:

main:
adcin 0, adval

if adval < 75 then
lcdout $fe, $80,"0"
endif

if adval > 100 and adval < 120 then
lcdout $fe, $80,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10
endif

if adval > 120 and adval < 140 then
lcdout $fe, $80,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10
endif

if adval > 140 and adval < 160 then
lcdout $fe, $80,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10
endif

if adval > 160 and adval < 180 then
lcdout $fe, $80,$ff,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10
endif

if adval > 180 and adval < 200 then
lcdout $fe, $80,$ff,$ff,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10
endif

if adval > 200 and adval < 210 then
lcdout $fe, $80,$ff,$ff,$ff,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10
endif

if adval > 210 and adval < 220 then
lcdout $fe, $80,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10
endif

if adval > 220 then
lcdout $fe, $80,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10
endif
pause 500
goto main

без дерганий/морганий, но при возврате(уменьшении) не гаснет часть клеток, т.е. экран надо как-то очищать...

Добавлено (26.01.2016, 17:56)
---------------------------------------------
пиз;де#!!!!
а ларчик просто открывался:

я забыл на первом условии выставить пустые места на незадействованых полях!!..

main:
adcin 0, adval

if adval < 75 then
lcdout $fe, $80,"0",$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10
endif

if adval > 100 and adval < 120 then
lcdout $fe, $80,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10
endif

if adval > 120 and adval < 140 then
lcdout $fe, $80,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10
endif

if adval > 140 and adval < 160 then
lcdout $fe, $80,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10
endif

if adval > 160 and adval < 180 then
lcdout $fe, $80,$ff,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10
endif

if adval > 180 and adval < 200 then
lcdout $fe, $80,$ff,$ff,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10
endif

if adval > 200 and adval < 210 then
lcdout $fe, $80,$ff,$ff,$ff,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10
endif

if adval > 210 and adval < 220 then
lcdout $fe, $80,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10,$10
endif

if adval > 220 then
lcdout $fe, $80,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$10,$10,$10,$10,$10,$10,$10,$10
endif
pause 50
goto main

ADMIN Дата: Вт, 26.01.2016, 20:04  |                                                                                                                Сообщение # 8
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1096
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Вместо 
if adval > 200 and adval < 210 then
лучше написать
if adval >= 200 and adval < 210 then
поскольку сама цифра 200 остается без внимания при этом. 
Это относится и к другим условиям
timerlan Дата: Ср, 27.01.2016, 11:30  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 88
Репутация: 0   ±
Замечания:   ±
На сайте с 18.03.2012

Статус: Offline

ADMIN, спасибо за замечание!
ADMIN Дата: Ср, 27.01.2016, 13:40  |                                                                                                                Сообщение # 10
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1096
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Еще, я бы попробовал загнать это все в цикл. Прога была бы компактнее.
timerlan Дата: Сб, 30.01.2016, 10:38  |                                                                                                                Сообщение # 11
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 88
Репутация: 0   ±
Замечания:   ±
На сайте с 18.03.2012

Статус: Offline

ADMIN, в цикл это как, можно хоть намек?!
ADMIN Дата: Сб, 30.01.2016, 15:22  |                                                                                                                Сообщение # 12
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1096
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Ну я сейчас не знаю, как в PBP печать на экран реализуется. У меня он не установлен. Я не знаю, как допечатывать символы в конце строки. А вот по другому вопросу могу сказать так:
Есть диапазон от 0 до 220, за исключением первого варианта (до 75 - но и его можно туда же загнать)

adcin 0, adval
lcdout $FE, $80 'команда на печать - где именно печатать
for i = 0 to adval /10 do ' цикл - значение делим на десять (поскольку i - типа byte, получим значения от 0 до 22
if i <=7 then 
    lcdout "0"
else
    lcdout $FF ' и вот здесь, по задумке, $FF должно напечататься i раз
endif
    lcdout $10, $10, $10, $10, $10, $10 ' в конце печатаем пробелы.
next i

К примеру, в протоне я делал таким способом, но там используется номер строки и столбца дисплея, как здесь, не вспомню и не подскажу. Вот статья. Там в коде есть кусок вывода заставки- вывод символа в нужном месте. Принцип тот же.

'-------------------Заставка------------------------
For i = 8 To 1 Step -1   'Заставка :)
Cls
Print At 1,i, $54,$61,$78,$6F,$BC,$65,$BF,$70," "
Print At 2,2 - i, "v.1.0.2"
DelayMS 100
Next
holyuser Дата: Вс, 31.01.2016, 13:31  |                                                                                                                Сообщение # 13
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 233
Репутация: 5   ±
Замечания:   ±
На сайте с 12.12.2007

Статус: Offline

А что должно происходить если 75 < adval < 100 ?

Добавлено (31.01.2016, 13:31)
---------------------------------------------
п.с.
кстати, вот вариант:
.......
.......
adval       var byte
shift       var byte
threshold   var byte
PORTB = 0
TRISB = 0
TRISA = 255 ' Set PORTA to all input
ADCON1 = 2  ' PORTA is analog
pause 1000
lcdout $FE,1
begin:
  ADCIN 0, adval
  select case adval
    case is < 75
      threshold = 0
    case is < 100
      threshold = 1
    case is < 120
      threshold = 2
    case is < 140
      threshold = 3
    case is < 160
      threshold = 4
    case is < 180
      threshold = 5
    case is < 200
      threshold = 6
    case is < 210
      threshold = 7
    case is < 220
      threshold = 8
    case else
      threshold = 9
  end select
  lcdout $FE,$80
  for shift = 0 to 15
    if shift < threshold then
      lcdout $FF
    else
      lcdout $10
    endif
  next
  lcdout $FE,$8D,#adval 'контрольный вывод
  pause 100
goto begin
                                 
end

timerlan Дата: Пн, 01.02.2016, 14:38  |                                                                                                                Сообщение # 14
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 88
Репутация: 0   ±
Замечания:   ±
На сайте с 18.03.2012

Статус: Offline

holyuser, спасибо! интересная конструкция, буду разбирать!..

Добавлено (01.02.2016, 14:38)
---------------------------------------------
holyuser, а почему в этой части

for shift = 0 to 15
if shift < threshold then
lcdout $FF
else
lcdout $10
endif
next

у вас в операторе for....next, установлен порог счетчика именно на 15?..

holyuser Дата: Пн, 01.02.2016, 15:11  |                                                                                                                Сообщение # 15
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 233
Репутация: 5   ±
Замечания:   ±
На сайте с 12.12.2007

Статус: Offline

Потому что в строке индикатора 16 позиций.
У первой позиции смещение (shift) ноль, и т.д., у последней смещение 15.
Таким образом очищается вся строка до конца, потому что последние три позиции используются для вывода значения adval - просто для визуального контроля. Если это не нужно, то можно цикл "укоротить" до необходимого.
Форум Picbasic.ru » Программирование МК » PicBasicPro » вывод progress bar-a (что-то в алгоритме этом есть...)
Страница 1 из 212»
Поиск: