Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: ivan_fd  
Почему тормозит контроллер?
radist108 Дата: Вт, 09.02.2010, 17:10  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Пытаюсь разобраться
Сообщений: 49
Репутация: 0   ±
Замечания:   ±
На сайте с 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 прилагаю:

Прикрепления: Stepper.rar (28.7 Kb)


Да здравствует то, благодаря чему мы, несмотря ни на что…
Сообщение отредактировал radist108 - Вт, 09.02.2010, 17:10
ЯНДЕКС Дата: 09.02.2010
lvitat Дата: Вт, 09.02.2010, 21:11  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 35
Репутация: 0   ±
Замечания:   ±
На сайте с 13.06.2008

Статус: Offline

Может последнюю паузу сделать меньше чем остальные - отображение на ЖКИ тоже время занимает

Я не волшебник, я только учусь ...
radist108 Дата: Вт, 09.02.2010, 21:20  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Пытаюсь разобраться
Сообщений: 49
Репутация: 0   ±
Замечания:   ±
На сайте с 07.01.2010

Статус: Offline

Это все надо подбирать. А хочется получить программу в чистом виде. Да и к тому же он только один раз на оборот стукает. А на один оборот 50 раз по 8 комбинаций едениц и нулей приходится.

Да здравствует то, благодаря чему мы, несмотря ни на что…
lvitat Дата: Вт, 09.02.2010, 21:49  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 35
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Репутация: 0   ±
Замечания:   ±
На сайте с 07.01.2010

Статус: Offline

если перекинуть LCDOUT наверх то тоже самое будет. Просто програма подтормаживает во время вычисления и записи в переменную "counter"

Да здравствует то, благодаря чему мы, несмотря ни на что…
lvitat Дата: Вт, 09.02.2010, 23:18  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 35
Репутация: 0   ±
Замечания:   ±
На сайте с 13.06.2008

Статус: Offline

задержка происходит во время работы с индикатором , думаю поставленная задача выполнима только на ассемблере

Я не волшебник, я только учусь ...
radist108 Дата: Ср, 10.02.2010, 02:54  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Пытаюсь разобраться
Сообщений: 49
Репутация: 0   ±
Замечания:   ±
На сайте с 07.01.2010

Статус: Offline

Этого я и боялся...

Да здравствует то, благодаря чему мы, несмотря ни на что…
terrarus Дата: Ср, 10.02.2010, 14:07  |                                                                                                                Сообщение # 8
Группа: Пользователи
Ранг:  Помогаю всем
Сообщений: 451
Репутация: 17   ±
Замечания:   ±
На сайте с 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
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Тоже хотел предложить, используй вместо пауз процедуру отображения
radist108 Дата: Ср, 10.02.2010, 16:51  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Пытаюсь разобраться
Сообщений: 49
Репутация: 0   ±
Замечания:   ±
На сайте с 07.01.2010

Статус: Offline

Да. Хорошо придумано. Надо опробовать. Правда LCDшка как то странно моргает в протеусе. Но может этого не будет в реале. Спасибо.

P.S. Где взять библиотеку LCD с кириллицей?


Да здравствует то, благодаря чему мы, несмотря ни на что…
Сообщение отредактировал radist108 - Ср, 10.02.2010, 16:57
terrarus Дата: Ср, 10.02.2010, 17:02  |                                                                                                                Сообщение # 11
Группа: Пользователи
Ранг:  Помогаю всем
Сообщений: 451
Репутация: 17   ±
Замечания:   ±
На сайте с 21.08.2008

Статус: Offline

Тут на форуме много об этом

Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
ЯНДЕКС Дата: 10.02.2010
lvitat Дата: Ср, 10.02.2010, 20:36  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 35
Репутация: 0   ±
Замечания:   ±
На сайте с 13.06.2008

Статус: Offline

время отображения можно ещё уменьшить - необязательно каждый раз переписывать всё заново , меняется-то только переменная "counter"

Я не волшебник, я только учусь ...
radist108 Дата: Чт, 11.02.2010, 00:07  |                                                                                                                Сообщение # 13
Группа: Проверенные
Ранг:  Пытаюсь разобраться
Сообщений: 49
Репутация: 0   ±
Замечания:   ±
На сайте с 07.01.2010

Статус: Offline

а что означает "pauseUS int - 200"?

Да здравствует то, благодаря чему мы, несмотря ни на что…
ivan_fd Дата: Чт, 11.02.2010, 10:44  |                                                                                                                Сообщение # 14
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Quote (radist108)
а что означает "pauseUS int - 200"?

Означает, int минус 200. Если int = 1000, то в даном случаи пауза будет 800 мкс.

terrarus Дата: Чт, 11.02.2010, 10:51  |                                                                                                                Сообщение # 15
Группа: Пользователи
Ранг:  Помогаю всем
Сообщений: 451
Репутация: 17   ±
Замечания:   ±
На сайте с 21.08.2008

Статус: Offline

Quote (lvitat)
а что означает "pauseUS int - 200"?

Если у Вас int = 1000
то это значит pauseUS 800

Для демонстрации такой возможности я прикрепил модель в Протеусе.
Думаю, что так как работают операторы DelayMS и DelayUS Протона должны работать и операторы PauseMS и PauseUS в PicBasicPRO.

Прикрепления: _DelayMS_int-80.rar (44.0 Kb)


Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: