12f629 и програмный ШИМ для RGB + управление с энкодера
|
|
buller |
Дата: Чт, 27.10.2011, 23:03 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
10
Замечания:
±
На сайте с 07.10.2011
Статус:
Offline
|
Это только тестовый вариант программы и тестовый вариант схемы. Мне нужно узнать почему стек переполняется и как этого избежать. При написании программ раньше у меня уже возникали проблемы со стеком, но сам я так и не смог их одолеть, поэтому прошу помощи в более продвинутых в этом вопросе людей.
|
|
|
|
ADMIN |
Дата: Пт, 28.10.2011, 06:13 | Сообщение # 2 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Если вызываешь подпрограмму командой GOSUB, то после этого нужно из нее возвращаться командой RETURN. У тебя же - вызов через GOSUB, а возврат в какое-то другое место:
GoSub SHIM
SHIM: PWM GPIO.0, R, 3 PWM GPIO.1, G, 3 'PWM GPIO.5, B, 3 GoTo Main 'Здесь нужно писать return
За счет этого и переполняется стек, поскольку при вызове ПП значение текущего адреса сохраняется в стек, а при возврате извлекается
|
|
|
|
terrarus |
Дата: Пт, 28.10.2011, 10:51 | Сообщение # 3 |
Группа:
Пользователи
Ранг:
Помогаю всем
Сообщений:
451
Замечания:
±
На сайте с 21.08.2008
Статус:
Offline
|
Что-то я совсем не могу понять назначение и принципы функционирования этого устройства. Что значит "управление с энкодера"? Можно ли вкратце пояснить как должно работать оно?
Если у в Вас что-то не получается, подумай, не стоит ли прочитать инструкцию...!
Сообщение отредактировал
terrarus - Пт, 28.10.2011, 10:53
|
|
|
|
buller |
Дата: Пт, 28.10.2011, 11:33 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
10
Замечания:
±
На сайте с 07.10.2011
Статус:
Offline
|
Quote (terrarus) Что-то я совсем не могу понять назначение и принципы функционирования этого устройства. Что значит "управление с энкодера"? Можно ли вкратце пояснить как должно работать оно?
Конечно все просто. На основе этой схемы будет построен контроллер RGB светодиода, который будет работать в двух режимах. 1й режим это автоматическое плавное изменение цветов из непрерывного спектра 2й режим это выбор какого то одного цвета из спектра
энкодер работает здесь как элемент управления. Крутя его в одну или другую сторону можно или изменять время задержки при смене цветов (если это 1й режим) или выбрать какой то цвет из непрерывного спектра (если это 2й режим) При подаче питая ничего не работает, пока не будет нажата кнопка енкодера, которая переведет его в 1й режим. При повторном нажатии будет осуществлен переход на 2й режим. И если нажать ее еще раз то контроллер снова перейдет в режим ожидания.
Добавлено (28.10.2011, 11.33.01) --------------------------------------------- Quote (ADMIN) Если вызываешь подпрограмму командой GOSUB, то после этого нужно из нее возвращаться командой RETURN. У тебя же - вызов через GOSUB, а возврат в какое-то другое место: GoSub SHIM SHIM: PWM GPIO.0, R, 3 PWM GPIO.1, G, 3 'PWM GPIO.5, B, 3 GoTo Main 'Здесь нужно писать return За счет этого и переполняется стек, поскольку при вызове ПП значение текущего адреса сохраняется в стек, а при возврате извлекается
Но тогда из SHIM она вернется на ту подпрограмму из которой она пришла, а мне нужно чтоб из SHIM возвращалась в main потому что там есть обработка кнопки
А если я добавлю в каждой ПП после команди gosub SHIM команду Return?
Сообщение отредактировал
buller - Пт, 28.10.2011, 11:34
|
|
|
|
ADMIN |
Дата: Пт, 28.10.2011, 12:10 | Сообщение # 5 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Quote (buller) Но тогда из SHIM она вернется на ту подпрограмму из которой она пришла, а мне нужно чтоб из SHIM возвращалась в main потому что там есть обработка кнопки А если я добавлю в каждой ПП после команди gosub SHIM команду Return?
Так ты после того как вернешься по RETURN из подпрограммы - иди куда хочешь - хоть на Main, хоть куда. Главное, чтобы стек вернулся на уровень вверх, иначе с каждым заходом в ПП SHIM - стек будет углубляться - последствия работы такой неправильной программы - непредсказуемы
|
|
|
|
buller |
Дата: Сб, 29.10.2011, 14:13 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
10
Замечания:
±
На сайте с 07.10.2011
Статус:
Offline
|
Спасибо Ваш совет мне помог. А ведь знал что нужно возвращаться командой Return. но видимо что то напутал.
Но здесь у меня другая проблема возникла. В Протеусе программа работает, а в реальной схеме нет. Не понятно почему при подаче питания все три цвета горят ярко и с одинаковой интенсивностью и ПИК никак не реагирует на обороты ручки энкодера, как я понимаю не исполняется команда ветвления Select..Case. При написании вот такой конструкции вместо Select..Case -- все работает отлично. При поворачивании ручки в одну сторону цвета начинают светить ярче а при повороте в другую гаснут. Code minus: r=r+5 g=g+2 b=b+15 return
plus: r=0 g=0 b=0 return Почему же не работает Select..Case?
Сообщение отредактировал
buller - Сб, 29.10.2011, 14:13
|
|
|
|
megavolt85 |
Дата: Чт, 03.11.2011, 02:56 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
16
Замечания:
±
На сайте с 10.01.2010
Статус:
Offline
|
попробуй до Main: вставить coloR=0
|
|
|
|