|
Поддержи наш сайт! |
Через WebMoney
R785211844650
Z210696637574
E368177590409
|
|  | | | |
Регулятор яркости и режимов ШИМа на AT89C2051 (1 просматривает)
|
|
TOPIC: Регулятор яркости и режимов ШИМа на AT89C2051
|
Fantomas (Пользователь)
Новичок
Постов: 26
|
| В ответ на: Регулятор яркости и режимов ШИМа на AT89C2051 25.11.2009 19:59 |
Репутация: 0   |
я не прошу делать за меня работу  мне не нужен мой код, мне примерный код нужен, как с клавиатурой. я сам хочу разобраться, если бы мне не было интересно, то не вовсе не делал бы ничего.
|
|
|
|
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
|
ARV (Администратор)
Администратор
Постов: 2027
|
| В ответ на: Регулятор яркости и режимов ШИМа на AT89C2051 25.11.2009 22:15 |
Репутация: 167   |
|
у вас движение в верном направлении, но из-за того, что вы не выполняете некие простые правила, все. что вы делаете, не работает, как надо. 1. возьмите себе за правило всегда при входе в обработчик прерывания делать push PSW, а перед выходом pop PSW - то есть сохраняйте регистр флагов неизменным. уверен, вам рассказывали, зачем это надо делать, вспомните. это важно. 2. оформляйте каждую подпрограмму так, чтобы даже при беглом взгляде было понятно, где она начинается и заканчивается, например, в начале делайте комментарий в виде строки из звездочек, а в конце - в виде строки из минуксов: ;**************** подпрограмма 1 ********************* PROG1: mov A, #1 ret ;----------------------------------------------------- эта рекомендация относится и к обработчика прерываний. не допускайте, чтобы из вашей подпрограммы были переходы за пределы, ограниченные этими строчками, т.е. пишите все нужные ветви обработки в одной кучке. 3. обязательно в начале программы (т.е. по метке START) инициализируйте указатель стека SP - иначе все ваши подпрограммы и обработчики прерываний могут творить невесть что. 4. описываейте константы при помощи дериктивы EQU, распределяйте ячейки озу директивами DB, DW и т.п.? в общем, используйте все нужные средства ассемблера. 5. не перемешивайте разные куски кода: если вы делаете опрос кнопок - это одна задача, а анализ нажатых кнопок - это другая задача. у вас же получается, что начали с опроса и плавно перешли в анализ. вы сами себя путаете.
короче: наведите порядок, и вы сразу увидите, что у вас было не так.
Не стыдно не знать, стыдно не учиться
|
|
|
|
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
|
Fantomas (Пользователь)
Новичок
Постов: 26
|
| В ответ на: Регулятор яркости и режимов ШИМа на AT89C2051 25.11.2009 22:45 |
Репутация: 0   |
ARV писал(а): уверен, вам рассказывали, зачем это надо делать, вспомните. это важно.
Ага, если бы что-то читали, то я бы некоторых глупых вопросов не задавал  Сказали сделать, а как никого не волнует, смотрят на результат. Спасибо за ваше терпение  буду продолжать двигаться дальше
|
|
|
|
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
|
ARV (Администратор)
Администратор
Постов: 2027
|
| В ответ на: Регулятор яркости и режимов ШИМа на AT89C2051 25.11.2009 22:49 |
Репутация: 167   |
|
в журнале "Радиолюбитель" по-моему начиная с конца 2007 года публиковался цикл моих статей о программировании микроконтроллеров семейства MCS51 - найдите, почитайте. если вам не давали в лекциях, то, думаю. из моих статей вы почерпнете кое-что полезное. во всяком случае, с ассемблером познакомитесь.
P.S. Ссылок на пиратские копии журналов не даю по понятным причинам. но они, увы, есть...
Не стыдно не знать, стыдно не учиться
|
|
|
|
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
|
Fantomas (Пользователь)
Новичок
Постов: 26
|
| В ответ на: Регулятор яркости и режимов ШИМа на AT89C2051 26.11.2009 18:33 |
Репутация: 0   |
назрело несколько вопросов. Мне не совсем нравится мой метод опроса кнопок, поэтому решил протестировать ваш метод, но что-то не так делаю наверно, ибо не работает. Вопрос1: Когда мы нажимаем кнопку, которая включает светодиод её же код будет 00100000b (кнопка на порту Р1.5). неужели код кнопки будет 11011111? Хотя проверял и так и так, светодиод не зажегся. Вопрос2: Когда мы нажимаем второй раз на эту же кнопку, то её код будет отличаться от первоначального(00100000b),ведь мы первым нажатием включили светодиод(обнулили линию порта Р1.6). как отследить это? вот код File Attachment:File name: SVET.txtFile size:1802 bytes Содержимое поста отредактировано: Fantomas, в: 26.11.2009 18:34
|
|
|
|
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
|
ARV (Администратор)
Администратор
Постов: 2027
|
| В ответ на: Регулятор яркости и режимов ШИМа на AT89C2051 26.11.2009 20:15 |
Репутация: 167   |
1. вы схему-то не дали, как подключаете кнопки свои... но надеюсь, что с вывода МК на общий провод - в этом случае нажатая кнопка будет именно нулевым битом отображаться. 2. чтобы те биты, которые у вас используются для вывода чего-то, не мешали опросу кнопок, надо эти биты замаскировать, т.е. для однообразия или принудительно обнулить или установить в единицы. например: | Code: | mov A, P1
anl A, #00110000b
; а вот теперь анализируем кнопки, которые могут быть в 4 и 5 битах порта
|
Не стыдно не знать, стыдно не учиться
|
|
|
|
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
|
Fantomas (Пользователь)
Новичок
Постов: 26
|
| В ответ на: Регулятор яркости и режимов ШИМа на AT89C2051 27.11.2009 21:44 |
Репутация: 0   |
Все-таки оставил свой рабочий вариант, чисто из правила программиста: работает - не трогай! После прочтения вашего комментария и пошагового анализа в некоторых местах чувствовал себя ... (цензура). Вот что получилось завтра попытаюсь прошить. Интересно ваше мнение, по повода кода.
|
|
|
|
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
|
ARV (Администратор)
Администратор
Постов: 2027
|
| В ответ на: Регулятор яркости и режимов ШИМа на AT89C2051 27.11.2009 23:07 |
Репутация: 167   |
поглядел... код приобретает приличный вид, видно, что старались  очень хорошо, что самостоятельно сумели найти места, за котрые сами себя ругали  но тем не менее согласитесь, что обилие проверок битов очень некрасиво и портит структуру всей программы... вот поглядите на то, как по идее должна выглядеть ваша программа на "псевдо-ассемблере" (я могу исказить суть вашей задачи - это скиньте со счетов): 1. настройка таймера, стека и других переменных 2. процедура таймера - уже готова и понятна. 3. основной цикл: 3.1. вызов подпрограммы GET_KEY - опрос кнопок (KEY - байт, единички в котором соответствуют нажатым кнопкам) 3.2. сравнение KEY с кодом "первой кнопки". если совпало - выполнение подпрограммы KEY_1 3.3. сравнение KEY с кодом "второй кнопки". если совпало - выполнение подпрограммы KEY_3 ; и так далее до обработки всех комбинаций кнопок, которые нужны 4. переход к п.3 ; подпрограммы: GET_KEY: 1. ввести уровни с пинов порта 2. т.к. ненажатым кнопкам у нас соответствуют единички, инвертировать полученное значение 3. обнулить те биты, которые не связаны с кнопками. 4. полученное значение вернуть в качестве KEY 5. выход KEY_1: 1. Увеличить переменную DUTY 2. выход ; и так далее согласитесь, что это намного нагляднее, чем то, что просматривается по вашему коду? собственно, этот псевдоассемблер есть комментарии к вашим реальным командам  просто добавь воды! то есть ассемблера!  P.S. Архитектура MCS51 - это аккумулятор-ориентированная архитектура, потому использовать аккумулятор в качестве переменной программы - крайне неудобно, это ведь основной рабочий регистр для множества операций! у вас ведь еще минимум 8 регистров других, не говоря уже о минимум 128 байтах ОЗУ, которые почти ничем не хуже регистров!
Не стыдно не знать, стыдно не учиться
|
|
|
|
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
|
Fantomas (Пользователь)
Новичок
Постов: 26
|
| В ответ на: Регулятор яркости и режимов ШИМа на AT89C2051 28.11.2009 18:45 |
Репутация: 0   |
|
Полностью согласен с вами насчет опроса, с удовольствием попробую ваш вариант. Отпишу, что получится
|
|
|
|
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
|
|
|
|
| | |  |
|