|
Не могу собрать простейшую схему с кнопкой и диодом, Вернее могу, но она работает не так как я расчитывал |
|
|
|
Apr 16 2012, 15:47
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 14-02-10
Пользователь №: 55 477

|
Решил начать осваивать программирование на AVR. Была приобретена вот такая вещь (http://www.chipdip.ru/product/me-easyavr6.aspx), был скачен протеус и понеслось. С примерами что в протеусе, что в макетке проблемм не возникло и решил я чего то напроектировать сам. В протусе. Взял Atmega16, повесил на ножку B0 кнопку, кнопку кинул на землю. На С0 повесил диод и его тоже на землю кинул. Написал программку: if (Button(&PORTB,1,1) { PORTC=0x01; } else { PORTC=0x00; } примерно такую, пишу по памяти. Запускаю симуляцию: нажимаешь на кнопку, диод гаснет, отпускаешь - загорается. Ладно, допустим (хотя почему такое получается? Откуда берется единица на B0?). Пытаемся повторить тоже самое на макетной плате. В приложении фотка как кнопки подключены http://electronix.ru/forum/style_images/1/.../attach_add.pngпереключил J13 на землю, воткнул J18 еще и.... ничего. Вообще никакой реакции. Опять же вопрос, почему в симуляторе работает, а тут нет? идем дальше, возвращаем на макетной плате все обратно, шьем прошивку и работает все так как и надо -при нажатии на кнопку диод загорается, а при отпускании кнопки - гаснет. Т.е. абсолютно наоборот, нежеле в симуляторе. Но в симуляторе кнопка на землю заведена а в макетке - на питание, я так понимаю. Тк вот вопрос: где в протеусе этот самый элемент питания? Нашел какой-то INPUT, и вроде даже заработало, но только на один раз - нажал, загорелось и все. Не гаснет после отпускания кнопки.
Эскизы прикрепленных изображений
|
|
|
|
|
Apr 16 2012, 17:37
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(alex112 @ Apr 16 2012, 18:47)  if (Button(&PORTB,1,1) { 1. PORTB.1.1 - это первый разряд, а не нулевой 2. А кто линии МК на ввод/вывод настраивал ? 3. Схема потенциально опасная - можно сжечь МК за милую душу. Вы бы хоть книжку по АВР перед этим почитали: http://lord-n.narod.ru/walla.html4. Нет желания вникать в хитросплетения Протеуса (который здесь совершенно не нужен и даже вреден). Схему и программу покажите, как они есть, тогда можно будет дать советы ...
|
|
|
|
|
Apr 16 2012, 18:10
|
Гуру
     
Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025

|
Цитата(alex112 @ Apr 16 2012, 18:47)  На С0 повесил диод и его тоже на землю кинул. А почему вы упорно светодиод диодом называете? Это два очень разных электронных элемента. Цитата(alex112 @ Apr 16 2012, 18:47)  Запускаю симуляцию: нажимаешь на кнопку, диод гаснет, отпускаешь - загорается. Ладно, допустим (хотя почему такое получается? Откуда берется единица на B0?). Что значит "допустим"? вы получили результат, противоположный ожидаемому, и Вам даже на симуляторе не интересно выяснить почему? Цитата(alex112 @ Apr 16 2012, 18:47)  переключил J13 на землю, воткнул J18 еще и.... ничего. Вообще никакой реакции. Опять же вопрос, почему в симуляторе работает, а тут нет? А у Вас и в симуляторе не работает. сами написали, результат не соответствует запрограммированному алгоритму. Цитата(alex112 @ Apr 16 2012, 18:47)  Тк вот вопрос: где в протеусе этот самый элемент питания? Нашел какой-то INPUT, и вроде даже заработало, но только на один раз - нажал, загорелось и все. Не гаснет после отпускания кнопки. Метод научного тыка вещь конечно хорошая, но в нужном месте и в соответствующее время. Почитайте какую-нибудь документацию на Протеус, например тут наверное лучший рускоязычный ресурс, посвященный этой программе. Еще как вариант- обижаются на Вас компоненты, вы их постоянно "вешаете", "кидаете", "втыкаете". Смотрите, может случится то же самое, что с небезызвестной гражданкой Ф., от которой кухонная утварь убежала....
|
|
|
|
|
Apr 16 2012, 21:55
|
Гуру
     
Группа: Почетный участник
Сообщений: 6 851
Регистрация: 25-08-08
Из: Запорожье
Пользователь №: 39 802

|
Цитата(Ruslan1 @ Apr 16 2012, 21:10)  Еще как вариант- обижаются на Вас компоненты, вы их постоянно "вешаете", "кидаете", "втыкаете". Смотрите, может случится то же самое, что с небезызвестной гражданкой Ф., от которой кухонная утварь убежала.... Да, эта причина много серьезнее, чем кажется. Как только микруху , кондюк или резюк воткнули или присобачили - жди отказа или недоразумения. Даже по форуму прослеживается четко.
|
|
|
|
|
Apr 17 2012, 06:31
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 14-02-10
Пользователь №: 55 477

|
Цитата(kovigor @ Apr 16 2012, 21:37)  1. PORTB.1.1 - это первый разряд, а не нулевой 2. А кто линии МК на ввод/вывод настраивал ? 3. Схема потенциально опасная - можно сжечь МК за милую душу. Вы бы хоть книжку по АВР перед этим почитали: http://lord-n.narod.ru/walla.html4. Нет желания вникать в хитросплетения Протеуса (который здесь совершенно не нужен и даже вреден). Схему и программу покажите, как они есть, тогда можно будет дать советы ... Прилагаю схему и программу. Что схема опасная знаю, там надо еще резисторов добавить. CODE void main() {
DDB0_bit = 0; // Set pin as input
DDRC = 0xFF; // Configure PORTC as output PORTC = 0x00; // Initial PORTC value do { if (Button(&PINB, 0, 1, 1)) { // Detect logical one PORTC = 0x01; // Set PINC0 ON oldstate = 1; } else { PORTC=0x00; } } while(1); // Endless loop } Цитата(Ruslan1 @ Apr 16 2012, 22:10)  Что значит "допустим"? вы получили результат, противоположный ожидаемому, и Вам даже на симуляторе не интересно выяснить почему? Почему не интересно? Я же там спрашиваю, в скобочках, почему такое происходит. Цитата А у Вас и в симуляторе не работает. сами написали, результат не соответствует запрограммированному алгоритму. Ну в алгоритме я мог и накосячить, но почему результат отличаеться в симуляторе и в релаьности? Я, кстати, добавил VCC на линию между B0 и кнопкой и на макетной плате у меня тоже стал светодиод загораться при отпускании кнопки, а при нажатии - тухнуть. Цитата Метод научного тыка вещь конечно хорошая, но в нужном месте и в соответствующее время. Почитайте какую-нибудь документацию на Протеус, например тут наверное лучший рускоязычный ресурс, посвященный этой программе. Спасибо, почитаю. Цитата Еще как вариант- обижаются на Вас компоненты, вы их постоянно "вешаете", "кидаете", "втыкаете". Смотрите, может случится то же самое, что с небезызвестной гражданкой Ф., от которой кухонная утварь убежала.... Что то слабо вериться, но впредь учту
Эскизы прикрепленных изображений
|
|
|
|
|
Apr 18 2012, 15:42
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 14-02-10
Пользователь №: 55 477

|
ну так что? Просили схему и программу.... и куда все попрятались то?
|
|
|
|
|
Apr 18 2012, 18:50
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 14-02-10
Пользователь №: 55 477

|
Цитата(bav @ Apr 18 2012, 19:56)  1. на кнопку нужен подтягивающий резистор? наверняка нужен. Только как его рассчитать? Со светодиодом все понятно - у каждого светодиода есть внутреннее напряжение (или как оно зовется), у каждого цвета свое, у красного 2,2В вроде. И есть питающий ток, 15-20мА. Напряжение сети 5В-2,2В и узнаем сколько надо "просадить" резистором. И по закону Ома вычисляем. А с кнопкой как быть? Цитата 2. при нажатии на кнопку, какой логический уровень будет на входе порта? Понятия не имею, но почему светодиод загорается когда кнопка отпущена и тухнет когда нажата?
|
|
|
|
|
Apr 18 2012, 19:26
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(alex112 @ Apr 18 2012, 22:50)  наверняка нужен. Можно включить внутреннюю подтяжку: Код PORTB= 0x01; Цитата(alex112 @ Apr 18 2012, 22:50)  Понятия не имею, но почему светодиод загорается когда кнопка отпущена и тухнет когда нажата? Плохо - что не имеете понятия... При нажатии на кнопку: на PB0 - низкий уровень (0), а чтобы загорелся светодиод: на PC0 нужно выдать высокий уровень (1). В соответствии с Вашей программой: на PC0 выдается тот же уровень, что и на PB0. Вот так и получается: нажали кнопку (PB0=0 - низкий уровень) - выдали на PC0 ноль (низкий уровень) - светодиод не горит. И наоборот...
|
|
|
|
|
Apr 18 2012, 20:32
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 14-02-10
Пользователь №: 55 477

|
Цитата(Палыч @ Apr 18 2012, 23:26)  Можно включить внутреннюю подтяжку: Код PORTB= 0x01; а что это дает и зачем нужно? со светодиодом понятно, а тут? Цитата Плохо - что не имеете понятия... При нажатии на кнопку: на PB0 - низкий уровень (0), а чтобы загорелся светодиод: на PC0 нужно выдать высокий уровень (1). В соответствии с Вашей программой: на PC0 выдается тот же уровень, что и на PB0. Вот так и получается: нажали кнопку (PB0=0 - низкий уровень) - выдали на PC0 ноль (низкий уровень) - светодиод не горит. И наоборот... Т.е. уровень мериентся относительно С0? Я думал что для высокого уровня нужно 5В подать....
|
|
|
|
|
Apr 18 2012, 20:57
|
Профессионал
    
Группа: Свой
Сообщений: 1 172
Регистрация: 14-11-11
Из: Москва
Пользователь №: 68 299

|
Цитата(Microwatt @ Apr 17 2012, 00:55)  Как только микруху , кондюк или резюк воткнули или присобачили - жди отказа или недоразумения. Даже по форуму прослеживается четко. 5 баллов! То alex112: Поищите любой самоучитель по МК, например по слову "avr123" - там все толково объясняется. По поводу подтяжки, что это и зачем нужно. Почитайте даташит на Ваш МК или хотя бы посмотрите в нем схему внешних портов, Вам сразу многое станет понятно. Вообще, даташиты надо смотреть обязательно, т.к. в любом самоучителе предполагается туда заглядывать и эта информация нигде больше не дается.
|
|
|
|
|
Apr 19 2012, 09:20
|
Знающий
   
Группа: Свой
Сообщений: 693
Регистрация: 21-06-05
Из: Санкт-Петербург
Пользователь №: 6 184

|
Цитата а что это дает и зачем нужно? со светодиодом понятно, а тут? порты по входу имеют ооооочень высокое сопротивление, поэтому если он "висит" в воздухе (когда кнопка отпущена), то не известно что на его входе 1 или 0. поэтому и стоит подтянуть его к цепи питания для того, что бы гарантировать на входе четкую 1. это можно сделать внешним резистором (~10 к достаточно) или внутренним. когда кнопка нажата, входной порт будет четко притянут к земле, т.е. на входе будет 0. а теперь снова прочитайте что Вы написали Цитата Т.е. уровень мериентся относительно С0? Я думал что для высокого уровня нужно 5В подать.... будьте более внимательны, не ленитесь читать рекомендованную литературу...
|
|
|
|
|
Apr 19 2012, 21:46
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 14-02-10
Пользователь №: 55 477

|
Цитата(bav @ Apr 19 2012, 13:20)  порты по входу имеют ооооочень высокое сопротивление, поэтому если он "висит" в воздухе (когда кнопка отпущена), то не известно что на его входе 1 или 0. поэтому и стоит подтянуть его к цепи питания для того, что бы гарантировать на входе четкую 1. это можно сделать внешним резистором (~10 к достаточно) или внутренним. когда кнопка нажата, входной порт будет четко притянут к земле, т.е. на входе будет 0. ну изначально я хотел по другому - когда нажата - светодиод горит, а когда отпущена, то не горит. Т.е. мне надо +5 завести через кнопку на В0 и между кнопкой и В0 заземлить проводник через резистор, т.е. подтянуть его к земле когда кнопка разомкнута. Цитата(Палыч @ Apr 18 2012, 23:26)  Можно включить внутреннюю подтяжку: Код PORTB= 0x01; А куда она подтягивает? К питанию? А к земле это 0х00?
|
|
|
|
|
Apr 20 2012, 09:50
|
Знающий
   
Группа: Свой
Сообщений: 693
Регистрация: 21-06-05
Из: Санкт-Петербург
Пользователь №: 6 184

|
Цитата ну изначально я хотел по другому - когда нажата - светодиод горит, а когда отпущена, то не горит. Т.е. мне надо +5 завести через кнопку на В0 и между кнопкой и В0 заземлить проводник через резистор, т.е. подтянуть его к земле когда кнопка разомкнута. можно и так. но это не "наш" метод  у Вас контроллер, который можно программировать! достаточно сделать, что бы светодиод загорался, когда на ножке будет лог 0: Цитата Достаточно поменять местами строки присваивания значения POTRC
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|