Почему тормозит контроллер?
|
|
radist108 |
Дата: Вт, 09.02.2010, 17:10 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Пытаюсь разобраться
Сообщений:
49
Замечания:
±
На сайте с 07.01.2010
Статус:
Offline
|
Есть программа для управления шаговым двигателем и отображения числа оборотов на дисплей ЖКИ: int var word counter var word Ob var word int = 1000 counter = 0 TRISC = %00000000 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 Main: lcdout $fe, 1,"Total",$fe, $C0,"turns : ",#counter For ob = 0 to 50 PortC = %00001000 pauseUS int PortC = %00001100 pauseUS int PortC = %00000100 pauseUS int PortC = %00000110 pauseUS int PortC = %00000010 pauseUS int PortC = %00000011 pauseUS int PortC = %00000001 pauseUS int PortC = %00001001 pauseUS int next Ob counter = COUNTER + 1 Goto Main Но почему-то когда заканчивается цикл Ob то в импульсах и переменная Counter увеличивается на единицу для отображения на ЖКИ числа сделанных оборотов, то возникает пауза на всех четырех каналах двигателя. И из-за этого двигатель как бы "стучит" и результате пропадает точность и плавность работы. Это даже видно на осциллографе Proteus'a. Подскажите, как от этого избавиться? Файл PBC, HEX, и Proteus прилагаю:
Да здравствует то, благодаря чему мы, несмотря ни на что…
Сообщение отредактировал
radist108 - Вт, 09.02.2010, 17:10
|
|
|
|
lvitat |
Дата: Вт, 09.02.2010, 21:11 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
35
Замечания:
±
На сайте с 13.06.2008
Статус:
Offline
|
Может последнюю паузу сделать меньше чем остальные - отображение на ЖКИ тоже время занимает
Я не волшебник, я только учусь ...
|
|
|
|
radist108 |
Дата: Вт, 09.02.2010, 21:20 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Пытаюсь разобраться
Сообщений:
49
Замечания:
±
На сайте с 07.01.2010
Статус:
Offline
|
Это все надо подбирать. А хочется получить программу в чистом виде. Да и к тому же он только один раз на оборот стукает. А на один оборот 50 раз по 8 комбинаций едениц и нулей приходится.
Да здравствует то, благодаря чему мы, несмотря ни на что…
|
|
|
|
lvitat |
Дата: Вт, 09.02.2010, 21:49 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
35
Замечания:
±
На сайте с 13.06.2008
Статус:
Offline
|
Пользуюсь протоном , поэтому проверить немогу. А так нельзя? Main: lcdout $fe, 1,"Total",$fe, $C0,"turns : ",#counter For ob = 0 to 50 pauseUS int PortC = %00001000 pauseUS int PortC = %00001100 pauseUS int PortC = %00000100 pauseUS int PortC = %00000110 pauseUS int PortC = %00000010 pauseUS int PortC = %00000011 pauseUS int PortC = %00000001 pauseUS int PortC = %00001001 next Ob intP = int - 200 pauseUS intP counter = COUNTER + 1 Goto Main Добавлено (09.02.2010, 21.45.32) --------------------------------------------- лоханул - двойная пауза получается Добавлено (09.02.2010, 21.49.32) --------------------------------------------- ну тогда условие надо IF ob = 50 ....
Я не волшебник, я только учусь ...
|
|
|
|
radist108 |
Дата: Вт, 09.02.2010, 21:50 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Пытаюсь разобраться
Сообщений:
49
Замечания:
±
На сайте с 07.01.2010
Статус:
Offline
|
если перекинуть LCDOUT наверх то тоже самое будет. Просто програма подтормаживает во время вычисления и записи в переменную "counter"
Да здравствует то, благодаря чему мы, несмотря ни на что…
|
|
|
|
lvitat |
Дата: Вт, 09.02.2010, 23:18 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
35
Замечания:
±
На сайте с 13.06.2008
Статус:
Offline
|
задержка происходит во время работы с индикатором , думаю поставленная задача выполнима только на ассемблере
Я не волшебник, я только учусь ...
|
|
|
|
radist108 |
Дата: Ср, 10.02.2010, 02:54 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Пытаюсь разобраться
Сообщений:
49
Замечания:
±
На сайте с 07.01.2010
Статус:
Offline
|
Этого я и боялся...
Да здравствует то, благодаря чему мы, несмотря ни на что…
|
|
|
|
terrarus |
Дата: Ср, 10.02.2010, 14:07 | Сообщение # 8 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
451
Замечания:
±
На сайте с 21.08.2008
Статус:
Offline
|
radist108, Может быть так: Main: For ob = 0 to 50 PortC = %00001000 gosub Pausa PortC = %00001100 gosub Pausa PortC = %00000100 gosub Pausa PortC = %00000110 gosub Pausa PortC = %00000010 gosub Pausa PortC = %00000011 gosub Pausa PortC = %00000001 gosub Pausa PortC = %00001001 gosub Pausa next Ob counter = COUNTER + 1 Goto Main Pausa: pauseUS int - 200 lcdout $fe, 1,"Total",$fe, $C0,"turns : ",#counter return
Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
|
|
|
|
ADMIN |
Дата: Ср, 10.02.2010, 16:28 | Сообщение # 9 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Тоже хотел предложить, используй вместо пауз процедуру отображения
|
|
|
|
radist108 |
Дата: Ср, 10.02.2010, 16:51 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Пытаюсь разобраться
Сообщений:
49
Замечания:
±
На сайте с 07.01.2010
Статус:
Offline
|
Да. Хорошо придумано. Надо опробовать. Правда LCDшка как то странно моргает в протеусе. Но может этого не будет в реале. Спасибо. P.S. Где взять библиотеку LCD с кириллицей?
Да здравствует то, благодаря чему мы, несмотря ни на что…
Сообщение отредактировал
radist108 - Ср, 10.02.2010, 16:57
|
|
|
|
terrarus |
Дата: Ср, 10.02.2010, 17:02 | Сообщение # 11 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
451
Замечания:
±
На сайте с 21.08.2008
Статус:
Offline
|
Тут на форуме много об этом
Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
|
|
|
|
lvitat |
Дата: Ср, 10.02.2010, 20:36 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
35
Замечания:
±
На сайте с 13.06.2008
Статус:
Offline
|
время отображения можно ещё уменьшить - необязательно каждый раз переписывать всё заново , меняется-то только переменная "counter"
Я не волшебник, я только учусь ...
|
|
|
|
radist108 |
Дата: Чт, 11.02.2010, 00:07 | Сообщение # 13 |
Группа:
Проверенные
Ранг:
Пытаюсь разобраться
Сообщений:
49
Замечания:
±
На сайте с 07.01.2010
Статус:
Offline
|
а что означает "pauseUS int - 200"?
Да здравствует то, благодаря чему мы, несмотря ни на что…
|
|
|
|
ivan_fd |
Дата: Чт, 11.02.2010, 10:44 | Сообщение # 14 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Quote (radist108) а что означает "pauseUS int - 200"? Означает, int минус 200. Если int = 1000, то в даном случаи пауза будет 800 мкс.
|
|
|
|
terrarus |
Дата: Чт, 11.02.2010, 10:51 | Сообщение # 15 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
451
Замечания:
±
На сайте с 21.08.2008
Статус:
Offline
|
Quote (lvitat) а что означает "pauseUS int - 200"? Если у Вас int = 1000 то это значит pauseUS 800 Для демонстрации такой возможности я прикрепил модель в Протеусе. Думаю, что так как работают операторы DelayMS и DelayUS Протона должны работать и операторы PauseMS и PauseUS в PicBasicPRO.
Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
|
|
|
|