15.12.2012, 03:38
|
#61
|
Заблокирован
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
|
Re: Часы-будильник на PIC16CXX
Сообщение от snevar
|
movlw a'0000'(если замкнуты)
|
Вы, это, ... уже не пишите букву а перед двоичным числом. Только буква B используется для двоичных чисел для любого порта.
Вот табличка для букв перед константами из руководства по ассемблеру Microchip. Например, человеческое число 95 можно записать различными способами для компьютера
Цитата:
|
Десятичное D'95' или .'95'
Шестнадцатеричное H'5F' или 0x5F
Восьмеричное O'137'
Двоичное B'01011111'
ASCII A'_' или '_'
|
Это всё - разные формы записи одного и того же числа 95.
То есть команды
Код:
|
movlw D'95'
movlw 0x5F
movlw O'137'
movlw B'01011111'
movlw '_' |
абсолютно одинаковы, и в результате любой из них в рабочем регистре W будет лежать число 95.
Последний раз редактировалось Yurkin2007; 15.12.2012 в 03:47.
|
|
|
Сказали "Спасибо" Yurkin2007
|
|
|
15.12.2012, 05:06
|
#62
|
Супер-модератор
Регистрация: 09.06.2011
Сообщений: 2,647
Сказал спасибо: 73
Сказали Спасибо 1,799 раз(а) в 651 сообщении(ях)
|
Re: Часы-будильник на PIC16CXX
Сообщение от snevar
|
Это я хочу послать на ра1 единицу... Т.е. movlw a'0100', movwf porta в моем понимании должно означать, что таким образом я подаю на ra0 - 0, ra1 - 1, ra2 - 0, ra3 - 0.
|
Вы правильно все понимаете, но у Вас старшие и младшие разряды поменяны местами. Я ведь Вам не зря наводящие вопросы задаю. Старшие разряды всегда идут слева, а младшие справа - так же, как и у нас в десятичной системе. То есть, раскладка порта А имеет вид: RA3-RA2-RA1-RA0.
Не, не пойдет. Ну например... Вы полагаете, что через несколько микросекунд после того, как Вы запишите 1 в порт RА1, двигатель уже успеет повернуть механизм настолько, что разомкнутся концевые выключатели? Да он даже с места еще не сдвинется! А у Вас получится вот что: включили двигатель. Переключатели замкнуты? Да. Останавливаем двигатель.
Сообщение от snevar
|
movlw OP_CL_KEY
xorwf new_key,w
btfss status, z
goto ignore_key (если не нажата)
|
До этого места всё нормально. Дальше полный бред.
Сообщение от snevar
|
Правда как-то скудновато получилось, но... Вроде бы так. Т.е. нам не надо в начале опрашивать, в каком положении двигатель? Как-то нелогично, хоть он и должен помнить в программе...
|
Ну, у Вас же упрощенный учебный проект. То есть, для реального рабочего устройства это неприемлимо, конечно. А для курсовика вполне можно пойти на такое допущение.
Сообщение от snevar
|
Это не надо описывать конкретно? Что проверяем такой-то бит, если он равен тому-то - то в одну сторону, другому - в другую...? и как вот это запомнить в конце? Или это опять же нам конкретно описывать не надо?Т.е., к примеру, остановили, и записали значение порта ра3 в какую-нибудь переменную?
|
Да, конечно, нужно описывать всё подробно, от и до.
Сообщение от snevar
|
Еще вот словами, к рисунку...
Если вдруг мы зарегистрировали нажатие кнопки, отвечаю щей за открытие и закрытие, то начинаем проверять концевые контакты - если замкнуты, запускаем двигатель в направлении, указанном в программе(как указанном?), если разомкнуты, значит двигатель в движении, и мы сканируем контакты до тех пор, пока они не замкнутся. Останавливаем двигатель, запоминаем его положение, и все... Примерно так?
Правда, если правильно понимаю, будет все циклиться, если мы нажали кнопку откр.закр. во время того, как двигатель начал уже открывать или закрывтаь.. Но это. думаю, не страшно.. Или страшно?
|
Ну, Вы правильно мыслите. В том смысле, что подобные мелочи нужно обязательно предусмотреть. Вот, например, еще. По Вашему алгоритму, если Вы нажмете и будете удерживать кнопку, механизм будет ездить туда-сюда, пока Вы кнопку не отпустите. Поэтому нужно предусмотреть, чтобы механизм переместился один раз и остановился, даже если кнопка удерживается. И чтобы его последующее перемещение было возможно только после отпускания и повторного нажатия кнопки.
|
|
|
|
15.12.2012, 12:39
|
#63
|
Временная регистрация
Регистрация: 12.11.2010
Сообщений: 61
Сказал спасибо: 11
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
|
Re: Часы-будильник на PIC16CXX
Сообщение от RECTO
|
Не, не пойдет. Ну например... Вы полагаете, что через несколько микросекунд после того, как Вы запишите 1 в порт RА1, двигатель уже успеет повернуть механизм настолько, что разомкнутся концевые выключатели? Да он даже с места еще не сдвинется! А у Вас получится вот что: включили двигатель. Переключатели замкнуты? Да. Останавливаем двигатель.
|
А если так?.. Один из вариантов... Скорее правый, потому что мы не знаем сколько надо ждать.
Сообщение от RECTO
|
Поэтому нужно предусмотреть, чтобы механизм переместился один раз и остановился, даже если кнопка удерживается. И чтобы его последующее перемещение было возможно только после отпускания и повторного нажатия кнопки.
|
Ну это, по аналогии, будет через incf new_key, w?
|
|
|
|
15.12.2012, 23:31
|
#64
|
Супер-модератор
Регистрация: 09.06.2011
Сообщений: 2,647
Сказал спасибо: 73
Сказали Спасибо 1,799 раз(а) в 651 сообщении(ях)
|
Re: Часы-будильник на PIC16CXX
Правый ближе, но все равно не то. Основной момент, почему: Ваша программа - это большой цикл, который выполняется несколько десятков, а может и сотен раз в секунду (кстати, Вы это не проанализировали?). И запуск двигателя - это дополнительный элемент, встраиваемый в этот цикл. То есть ждать, пока механизм докрутится до замыкания или размыкания контактов, будет очень некорректно - остановится индикация, счет времени, и еще что-нибудь. Поэтому и нужно планировать этот кусок, как выполняемый в большом цикле. У Вас должно получиться что-то вроде этого. Здесь основную идею я уже нарисовал. Вам осталось дорисовать остальные блоки программы - корректно запустить двигатель в нужную сторону. Если, конечно, действительно хотите разобраться... Кстати, замкнутый переключатель на порту RA3 имеет значение "0", а разомкнутый "1". Это видно даже по схеме.
Сообщение от snevar
|
Ну это, по аналогии, будет через incf new_key, w?
|
Ну, в общем, да! Только тогда уж через "incf NEW_KEY, f" а не "W".
А Вы, кстати, понимаете, почему и что при этом происходит?
Кстати, я посмотрел повнимательнее на коды клавиш. http://s005.radikal.ru/i211/1212/a7/9d35316875d0.jpg Судя по всему, в схеме опечатка: на пустом месте должна стоять клавиша "D", а вместо "D" должен стоять "0". И в программе тоже: коды клавиш 7, 8, 9 и Е должны быть "0D7", "0DB", "0DD" и "0DE" соответственно (вместо "D" там напечатан "0").
|
|
|
|
16.12.2012, 00:36
|
#65
|
Временная регистрация
Регистрация: 12.11.2010
Сообщений: 61
Сказал спасибо: 11
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
|
Re: Часы-будильник на PIC16CXX
Сообщение от RECTO
|
Кстати, я посмотрел повнимательнее на коды клавиш.
|
Да, я тоже обратил внимание, когда перепечатывал... Во многих местах вообще D перепутано с 0...
Сообщение от RECTO
|
Ну, в общем, да! Только тогда уж через "incf NEW_KEY, f" а не "W".
А Вы, кстати, понимаете, почему и что при этом происходит?
|
Как сказать... Очень смутно. Если мне паскаль тот же хоть как-то преподавали, я хотя бы ориентируюсь, ну хоть примерно... А тут все вижу первый раз. И уж сколько я не читал описания... Ну да, увеличивает значение на 1. А как это вот связать со сканированием отжимания клавиши... Т.е. вообще никогда ассемблер не видел, и абсолютно никакой практики не было. Поэтому даже с азами сложновато.
Сообщение от RECTO
|
Правый ближе, но все равно не то. Основной момент, почему: Ваша программа - это большой цикл, который выполняется несколько десятков, а может и сотен раз в секунду (кстати, Вы это не проанализировали?). И запуск двигателя - это дополнительный элемент, встраиваемый в этот цикл. То есть ждать, пока механизм докрутится до замыкания или размыкания контактов, будет очень некорректно - остановится индикация, счет времени, и еще что-нибудь.
|
Ну с этим вроде более-менее понятно... В очень общих чертах.
Сообщение от RECTO
|
У Вас должно получиться что-то вроде этого. Здесь основную идею я уже нарисовал. Вам осталось дорисовать остальные блоки программы - корректно запустить двигатель в нужную сторону. Если, конечно, действительно хотите разобраться...
|
Я бы и хотел разобраться... Но как я могу решать, к примеру, логарифмические уравнения, не зная цифр и основных законов с операциями? Да, я могу прочитать, что есть там умножение, деление... Но даже после этого это уравнение я решить не смогу. Тут вот так же... Я хоть не раз уже читал про все команды, про регистры, адреса... И теперь я знаю, что есть команды, регистры, адреса. А как их связать...
И вообще, я очень вам благодарен...
Даже в этой программе - вроде смотрю, читаю комментарии, вроде так-то понятно, хотя бы в общих чертах. А вот так с нуля, какую команду взять и вставить, и чем грозит ошибка в команде, и как правильно применить..
Вот насчет этого места... Dvig_on=1,это включение двигателя? Вроде похоже, по левой ветке, а по правой и нет... тогда как мы остановим двигатель, если он открыл\закрыл, замкнул контакты, то значение dvig_on так и будет равно единице, он же включен... И как запомнить положение? Никак до меня не дойдет...
А с программой даже не знаю... Попробовать сразу что-нибудь?...)
Последний раз редактировалось snevar; 16.12.2012 в 00:39.
|
|
|
|
16.12.2012, 02:56
|
#66
|
Супер-модератор
Регистрация: 09.06.2011
Сообщений: 2,647
Сказал спасибо: 73
Сказали Спасибо 1,799 раз(а) в 651 сообщении(ях)
|
Re: Часы-будильник на PIC16CXX
Сообщение от snevar
|
Да, я тоже обратил внимание, когда перепечатывал... Во многих местах вообще D перепутано с 0...
|
Ну вот, исправляйте... Вообще, конечно, это не лучший пример для изучения азов, тем более, когда он еще содержит много неточностей и опечатки...
Сообщение от snevar
|
Как сказать... Очень смутно. Если мне паскаль тот же хоть как-то преподавали, я хотя бы ориентируюсь, ну хоть примерно... А тут все вижу первый раз. И уж сколько я не читал описания... Ну да, увеличивает значение на 1. А как это вот связать со сканированием отжимания клавиши... Т.е. вообще никогда ассемблер не видел, и абсолютно никакой практики не было. Поэтому даже с азами сложновато.
|
Да конкретно ассемблер тут совсем ни при чем... Короче, работает это так (если я правильно понял). У подпрограммы сканирования клавиш есть дополнительная переменная "HIT_KEY", кажется. Когда клавиша нажимается, и при этом HIT_KEY=0, подпрограмма записывает код клавиши в NEW_KEY, а в HIT_KEY записывает 1. А если ни одна из клавиш не нажата, подпрограмма записывает в HIT_KEY 0. Теперь берем нашу программу. Фиксируем нажатие клавиши, проверив ее код в NEW_KEY. Если теперь увеличить значение NEW_KEY на 1, полученный код больше не будет совпадать ни с одной клавишей, и нажатия даже при зажатой клавише больше зафиксировано не будет... Надеюсь, понятно объяснил.
Сообщение от snevar
|
Я бы и хотел разобраться... Но как я могу решать, к примеру, логарифмические уравнения, не зная цифр и основных законов с операциями?
|
Да погодите Вы с операциями... То бишь, с командами. Рисуйте пока ромбиками. Пока правильно алгоритм не нарисуете, программу писать смысла не имеет.
Сообщение от snevar
|
Вот насчет этого места... Dvig_on=1,это включение двигателя? Вроде похоже, по левой ветке, а по правой и нет... тогда как мы остановим двигатель, если он открыл\закрыл, замкнул контакты, то значение dvig_on так и будет равно единице, он же включен...
|
"DVIG_ON" - это просто имя переменной, оно может быть произвольным. Смотрите по веткам алгоритма внимательнее. Когда DVIG_ON=1 и переключатели замкнуты, ничего не произойдет. Как только переключатели разомкнутся, в DVIG_ON запишется 0. И при следующем замыкании переключателя двигатель остановится.
Сообщение от snevar
|
И как запомнить положение? Никак до меня не дойдет...
|
Предлагаю, как вариант - непосредственно перед выключением двигателя читаете порт А, и запоминаете полученное значение в переменной. 1-й и 2-й разряды (начиная с 0-го), дадут информацию о том, куда крутился двигатель. Значит, в следующий раз будем крутить его в другую сторону.
|
|
|
|
16.12.2012, 03:30
|
#67
|
Временная регистрация
Регистрация: 12.11.2010
Сообщений: 61
Сказал спасибо: 11
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
|
Re: Часы-будильник на PIC16CXX
Сообщение от RECTO
|
У подпрограммы сканирования клавиш есть дополнительная переменная "HIT_KEY", кажется. Когда клавиша нажимается, и при этом HIT_KEY=0, подпрограмма записывает код клавиши в NEW_KEY, а в HIT_KEY записывает 1. А если ни одна из клавиш не нажата, подпрограмма записывает в HIT_KEY 0. Теперь берем нашу программу. Фиксируем нажатие клавиши, проверив ее код в NEW_KEY. Если теперь увеличить значение NEW_KEY на 1, полученный код больше не будет совпадать ни с одной клавишей, и нажатия даже при зажатой клавише больше зафиксировано не будет... Надеюсь, понятно объяснил.
|
Это вроде бы понял...
Сообщение от RECTO
|
Да погодите Вы с операциями... То бишь, с командами. Рисуйте пока ромбиками. Пока правильно алгоритм не нарисуете, программу писать смысла не имеет.
|
А алгоритм... По-моему, на вашем вроде бы есть уже все... Ну вот только запуск с клавиши, но там разве не так? Ну вроде бы должно работать... .
Просто еще сроки...
Сообщение от RECTO
|
Предлагаю, как вариант - непосредственно перед выключением двигателя читаете порт А, и запоминаете полученное значение в переменной. 1-й и 2-й разряды (начиная с 0-го), дадут информацию о том, куда крутился двигатель. Значит, в следующий раз будем крутить его в другую сторону.
|
Т.е. читаем порт А... Если запомнили последний раз 0100, то в следующий раз подаем 0010?
Ну это наверно можно инвертировать как-то каждый йраз.. по маске, или как это называется.. Типа чтобы инвертировались только 1 и 2 разряд?
Последний раз редактировалось snevar; 16.12.2012 в 03:36.
|
|
|
|
16.12.2012, 03:47
|
#68
|
Супер-модератор
Регистрация: 09.06.2011
Сообщений: 2,647
Сказал спасибо: 73
Сказали Спасибо 1,799 раз(а) в 651 сообщении(ях)
|
Re: Часы-будильник на PIC16CXX
Сообщение от snevar
|
А алгоритм... По-моему, на вашем вроде бы есть уже все... Ну вот только запуск с клавиши, но там разве не так? Ну вроде бы должно работать... .
|
А Вы ничего местами не попутали? И потом - где определяется, в какую сторону крутится двигатель?
Сообщение от snevar
|
Просто еще сроки...
|
Ну, Вы ведь хотите сами разобраться, а не чтобы за Вас сделали? Я всего лишь подталкиваю Вас к правильному ходу мыслей, говорю где правильно, а где нет.
Сообщение от snevar
|
Т.е. читаем порт А... Если запомнили последний раз 0100, то в следующий раз подаем 0010?
Ну это наверно можно инвертировать как-то каждый йраз.. по маске, или как это называется.. Типа чтобы инвертировались только 1 и 2 разряд?
|
Да, можно так.
|
|
|
|
16.12.2012, 04:54
|
#69
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
|
Re: Часы-будильник на PIC16CXX
У ставней 2 концевика. И сигналы с них надо обрабатывать отдельно.
Даже если запоминать состояния, не факт, что свет не вырубиться в самый ответственный момент или кто-то руками не поменяет их положение в отключенном состоянии.
Раз уж решили ставить их вместо неиспользуемых кнопок - вот и ставьте, только на 2 кнопки.
Правда, так тоже никто не делает. Линии до концевиков длинные, наводки, да и замкнуть на что-нибудь могут. Элементарную защиту надо бы предусмотреть.
|
|
|
|
16.12.2012, 05:08
|
#70
|
Супер-модератор
Регистрация: 09.06.2011
Сообщений: 2,647
Сказал спасибо: 73
Сказали Спасибо 1,799 раз(а) в 651 сообщении(ях)
|
Re: Часы-будильник на PIC16CXX
Сообщение от Godzilla82
|
У ставней 2 концевика. И сигналы с них надо обрабатывать отдельно.
|
У МК элементарно портов не хватает на 2 концевика, к сожалению...
Сообщение от Godzilla82
|
Даже если запоминать состояния, не факт, что свет не вырубиться в самый ответственный момент или кто-то руками не поменяет их положение в отключенном состоянии.
|
Ну... Решили, что для учебного проекта, который все равно в железе не реализуется, можно пойти на упрощение.
Сообщение от Godzilla82
|
Раз уж решили ставить их вместо неиспользуемых кнопок - вот и ставьте, только на 2 кнопки.
|
На клавиатуру не получится поставить переключатели, я уже писал об этом. Программа МК не допускает нажатия одновременно 2 и более клавиш. Если одна из клавиш нажата, на другие клавиши реакции не будет. К тому же оказалось, что порт опрашивать будет проще, чем разбираться с программой опроса клавиатуры...
Сообщение от Godzilla82
|
Правда, так тоже никто не делает. Линии до концевиков длинные, наводки, да и замкнуть на что-нибудь могут. Элементарную защиту надо бы предусмотреть.
|
Ну, так можно написать в аннотации к проекту, что линия до концевиков оборудована защитой от помех... Но это уже детали, в общем.
Последний раз редактировалось RECTO; 16.12.2012 в 05:10.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Часы-будильник
|
ninelka21pelis |
TTL и CMOS логика |
10 |
22.05.2011 10:43 |
электромеханический будильник "Слава"
|
alxchep |
Поиск схем. Делимся схемами |
2 |
07.06.2008 13:51 |
[Решено] Добрый будильник
|
dimitriy |
Отвлекитесь, эмбеддеры! |
15 |
22.02.2008 08:56 |
часы
|
transford |
Микроконтроллеры, АЦП, память и т.д |
3 |
19.06.2007 17:23 |
[Решено] Часы в TV
|
Роберт |
Видеотехника |
8 |
19.10.2005 20:11 |
Часовой пояс GMT +4, время: 19:57.
|
|