ВОТ ЗА ПАРУ МИНУТ СОШКРЯПАЛ ПРОГУ ТАХОМЕТР, НА 2 тактный двигатель.... но что явно не так, не отображаются обороты...... может что0то не так.... не судите строго я только учусь.... только одна ошибочка тут измерение проходит за 1 секунду, а в проекте за 100 миллисекунд..... не работает не так не так.....
if imp = 6 then LCDOUT $FE,$80, 400 : goto main if imp = 8 then LCDOUT $FE,$80, 500 : goto main if imp = 10 then LCDOUT $FE,$80, 600 : goto main if imp = 11 then LCDOUT $FE,$80, 700 : goto main if imp = 13 then LCDOUT $FE,$80, 800 : goto main if imp = 15 then LCDOUT $FE,$80, 900 : goto main if imp = 16 then LCDOUT $FE,$80, 1000 : goto main if imp = 18 then LCDOUT $FE,$80, 1100 : goto main if imp = 20 then LCDOUT $FE,$80, 1200 : goto main if imp = 21 then LCDOUT $FE,$80, 1300 : goto main if imp = 23 then LCDOUT $FE,$80, 1400 : goto main if imp = 25 then LCDOUT $FE,$80, 1500 : goto main if imp = 26 then LCDOUT $FE,$80, 1600 : goto main if imp = 28 then LCDOUT $FE,$80, 1700 : goto main if imp = 30 then LCDOUT $FE,$80, 1800 : goto main if imp = 31 then LCDOUT $FE,$80, 1900 : goto main if imp = 33 then LCDOUT $FE,$80, 2000 : goto main if imp = 35 then LCDOUT $FE,$80, 2100 : goto main if imp = 36 then LCDOUT $FE,$80, 2200 : goto main if imp = 38 then LCDOUT $FE,$80, 2300 : goto main if imp = 40 then LCDOUT $FE,$80, 2400 : goto main if imp = 42 then LCDOUT $FE,$80, 2500 : goto main if imp = 43 then LCDOUT $FE,$80, 2600 : goto main if imp = 45 then LCDOUT $FE,$80, 2700 : goto main if imp = 47 then LCDOUT $FE,$80, 2800 : goto main if imp = 48 then LCDOUT $FE,$80, 2900 : goto main if imp = 50 then LCDOUT $FE,$80, 3000 : goto main if imp = 52 then LCDOUT $FE,$80, 3100 : goto main if imp = 53 then LCDOUT $FE,$80, 3200 : goto main if imp = 55 then LCDOUT $FE,$80, 3300 : goto main if imp = 57 then LCDOUT $FE,$80, 3400 : goto main if imp = 58 then LCDOUT $FE,$80, 3500 : goto main if imp = 60 then LCDOUT $FE,$80, 3600 : goto main if imp = 62 then LCDOUT $FE,$80, 3700 : goto main if imp = 63 then LCDOUT $FE,$80, 3800 : goto main if imp = 65 then LCDOUT $FE,$80, 3900 : goto main if imp = 67 then LCDOUT $FE,$80, 4000 : goto main if imp = 68 then LCDOUT $FE,$80, 4100 : goto main if imp = 70 then LCDOUT $FE,$80, 4200 : goto main if imp = 72 then LCDOUT $FE,$80, 4300 : goto main if imp = 73 then LCDOUT $FE,$80, 4400 : goto main if imp = 75 then LCDOUT $FE,$80, 4500 : goto main if imp = 77 then LCDOUT $FE,$80, 4600 : goto main if imp = 78 then LCDOUT $FE,$80, 4700 : goto main if imp = 80 then LCDOUT $FE,$80, 4800 : goto main if imp = 82 then LCDOUT $FE,$80, 4900 : goto main if imp = 83 then LCDOUT $FE,$80, 5000 : goto main if imp = 85 then LCDOUT $FE,$80, 5100 : goto main if imp = 87 then LCDOUT $FE,$80, 5200 : goto main if imp = 89 then LCDOUT $FE,$80, 5300 : goto main if imp = 90 then LCDOUT $FE,$80, 5400 : goto main if imp = 92 then LCDOUT $FE,$80, 5500 : goto main if imp = 94 then LCDOUT $FE,$80, 5600 : goto main if imp = 95 then LCDOUT $FE,$80, 5700 : goto main if imp = 97 then LCDOUT $FE,$80, 5800 : goto main if imp = 99 then LCDOUT $FE,$80, 5900 : goto main if imp = 100 then LCDOUT $FE,$80, 6000 : goto main if imp = 102 then LCDOUT $FE,$80, 6100 : goto main if imp = 104 then LCDOUT $FE,$80, 6200 : goto main if imp = 105 then LCDOUT $FE,$80, 6300 : goto main if imp = 107 then LCDOUT $FE,$80, 6400 : goto main if imp = 109 then LCDOUT $FE,$80, 6500 : goto main if imp = 110 then LCDOUT $FE,$80, 6600 : goto main if imp = 112 then LCDOUT $FE,$80, 6700 : goto main if imp = 114 then LCDOUT $FE,$80, 6800 : goto main if imp = 115 then LCDOUT $FE,$80, 6900 : goto main if imp = 117 then LCDOUT $FE,$80, 7000 : goto main if imp = 119 then LCDOUT $FE,$80, 7100 : goto main if imp = 120 then LCDOUT $FE,$80, 7200 : goto main if imp = 122 then LCDOUT $FE,$80, 7300 : goto main if imp = 124 then LCDOUT $FE,$80, 7400 : goto main if imp = 125 then LCDOUT $FE,$80, 7500 : goto main if imp = 127 then LCDOUT $FE,$80, 7600 : goto main if imp = 129 then LCDOUT $FE,$80, 7700 : goto main if imp = 130 then LCDOUT $FE,$80, 7800 : goto main if imp = 132 then LCDOUT $FE,$80, 7900 : goto main if imp = 134 then LCDOUT $FE,$80, 8000 : goto main if imp = 136 then LCDOUT $FE,$80, 8100 : goto main if imp = 137 then LCDOUT $FE,$80, 8200 : goto main if imp = 139 then LCDOUT $FE,$80, 8300 : goto main if imp = 141 then LCDOUT $FE,$80, 8400 : goto main if imp = 142 then LCDOUT $FE,$80, 8500 : goto main if imp = 144 then LCDOUT $FE,$80, 8600 : goto main if imp = 146 then LCDOUT $FE,$80, 8700 : goto main if imp = 147 then LCDOUT $FE,$80, 8800 : goto main if imp = 149 then LCDOUT $FE,$80, 8900 : goto main if imp = 151 then LCDOUT $FE,$80, 9000 : goto main if imp = 152 then LCDOUT $FE,$80, 9100 : goto main if imp = 154 then LCDOUT $FE,$80, 9200 : goto main if imp = 156 then LCDOUT $FE,$80, 9300 : goto main if imp = 157 then LCDOUT $FE,$80, 9400 : goto main if imp = 159 then LCDOUT $FE,$80, 9500 : goto main if imp = 161 then LCDOUT $FE,$80, 9600 : goto main if imp = 162 then LCDOUT $FE,$80, 9700 : goto main if imp = 164 then LCDOUT $FE,$80, 9800 : goto main if imp = 166 then LCDOUT $FE,$80, 9900 : goto main if imp = 167 then LCDOUT $FE,$80, 10000 : goto main
Приятного времени суток. k2mozganet, у Вас есть некоторые не точности в схеме: 1) VSS - это земля (GND), а VDD - соответственно - питание. А у Вас индикатор подключен наоборот!!! 2) LCDOUT $FE, $80 - я не знаю, что это значит. LCDOUT $FE, 1 - очистить и вывести информацию на экран. 3) if imp = 6 then LCDOUT $FE, $80, 400 : goto main исправьте на: if imp = 6 then LCDOUT $FE, 1, "400" : goto main (и так везде!!!)
Здравствуйте, k2mozganet! А зачем Вы так усложняете столь простую программу? я предлагаю просто по формуле считать импульсы и переводить их в обороты/мин. Я так понимаю двигатель делает 1 импульс на 1 оборот, так?
k2mozganet, MiXaS прав. Так будет получше!!!! k2mozganet, попробуйте собрать на макетке и посмотрите МАХ значение для "W", если оно не превышает 255, то можете вместо "w var Word" написать "W Var Byte". Еще что я Вам посоветую, так это, пропишите порт для счета импульсов - "Imp Var PortB.3". В случае чего, Вам легче будет потом разобраться или изменить порт на другой... И если Вы планируете этим девайсом считать только об/дв, то может лучше использовать например: PIC12F629??? А значение выводить на LED индикатор... THE TRUTH IS OUT THERE.
k2mozganet, учтите, что экран WH0802A - это 2 строчный 8 символьный!!!!!! Будьте внимательны!!! И про правильность питания не забудьте!!! THE TRUTH IS OUT THERE.
Уважаемый k2mozganet. Код до ужаса прост. Подобный код Я сам применял. На порт вешал датчик отражения, подавал 1 через резистор 10к, а когда датчик срабатывал 0.Если я не ошибаюсь, то команде count все-равно какой переход считать. Таким образом Я из подручных средств сделал приметивный оптический тахометр. Да,и еще, хоть убейте не могу понять что такое $80, может Вы пользуетесь конвертером символов??? Косяк может заключаться в том, что Вы прописываете TRISB = %00000000 весь порт на выход, а на в3 подаете сигнал? Но как описано в мануале команда count автоматически делает вывод входом. Но всеже попробуйте поменять на TRISB = %00001000
А подскажите пожалуйста уважаемый k2mozganet, какие импульсы, какой амплитуды подаете. А лучше схему.
Приятного времени суток. k2mozganet, если не работает в железе, то и нужно смотреть, "железо"!!!! Может Вы где то ошиблись. Проверьте еще раз. Посмотрите, что у Вас на входе МК и т.д.!!!!! THE TRUTH IS OUT THERE.
Здравствуйте. Помогите, пожалуйста, начинающему. Хочу сделать тахометр, но с индикацией на 3х разрядном 7ми сегментном светодиодном индикаторе. Опираясь на приведенный выше код, подправил начало программы под свои нужды. А вот дальше пока не доходит, как из переменной w1 вывести число на индикатор, да еще и в динамической индикации. PBP да и программирование изучаю только второй день, так что, сильно не бейте если что, не так.
@ device pic16F87, xt_osc, wdt_off, protect_off, pwrt_on TRISB = %00000001 trisa = %11111000 w var Word w1 var Word pause 100 main: count PORTB.0, 1000, w w1=w*30/10
goto main end
Сообщение отредактировал
xppirat - Вс, 20.03.2011, 14:21
DigitDisp = TemperC Dig 2 ; первая слева цыфра 'PORTA.0 = 0: PORTA.1 = 1: PORTA.2 = 1 ; включить первую цыфру, а остальные выключить PORTA.0 = 1: PORTA.1 = 0: PORTA.2 = 0 ' для индикаторов собщим анодом FYT-3631BD GoSub LOOK ; сходить на преобразование в семисегментный код DelayMS 4 ; ждать 4 Мс для отображения PORTB = %11111111 ; выключить все сегменты OA=1 FYT-3631BD, OK=0
DigitDisp = TemperC Dig 1 ; средняя цыфра 'PORTA.0 = 1: PORTA.1 = 0: PORTA.2 = 1 ; включить вторую цыфру, а остальные выключить PORTA.0 = 0: PORTA.1 = 1: PORTA.2 = 0 ' для индикаторов собщим анодом FYT-3631BD GoSub LOOK ; сходить на преобразование в семисегментный код PORTB = PORTB + t ; точка DelayMS 4 ; ждать 4 Мс для отображения PORTB = %11111111 ; выключить все сегменты OA=1 FYT-3631BD, OK=0
DigitDisp = TemperC Dig 0 ; цыфра после точки 'PORTA.0 = 1: PORTA.1 = 1: PORTA.2 = 0 ; включить пследнюю цыфру, а остальные выключить PORTA.0 = 0: PORTA.1 = 0: PORTA.2 = 1 ' для индикаторов собщим анодом FYT-3631BD GoSub LOOK ; сходить на преобразование в семисегментный код DelayMS 4 ; ждать 4 Мс для отображения PORTB = %11111111 ; выключить все сегменты OA=1 FYT-3631BD, OK=0 Return
LOOK: ; таблица для индикаторов с общим катодом 'PORTB = LookUpL DigitDisp,[63,6,91,79,102,109,125,7,127,111] ; таблица для индикаторов с общим анодом PORTB = LookUpL DigitDisp,[192,249,164,176,153,146,130,248,128,144] Return
t равно 128 для отображения точки и "0" для тушения...
mikhail09p, Большое спасибо. Пару часов разбирался в коде, но потом пришло озарение. Подправил код под себя, но дальше сразу возник другой вопрос. При интервале измерения 500 миллисекунд происходит заметное мерцание индикатора, а при более коротком времени измерения при низких частотах вырастает погрешность измерения. Что скажете по этому поводу, как избавится от мерцания.