indi_88 0 6 мая, 2010 Опубликовано 6 мая, 2010 (изменено) · Жалоба Добрый день, возникли трудности с работой с МК. Это мой первый практический опыт в паянии и работе с МК. Есть схема ультразвукового дальномера, пока собрал кусок: питание, кнопки управление, МК и 7сегм индикатор. Столкнулся с проблемой, когда начал писать простенькую прошивку. Цель прошивки: просто отображать какие-то крякозяблы поочереди на 3х знакоместах (использую динамику). Пишу и шьюсь через винавр: #include <avr/io.h> void delay_7s() { unsigned int k, l; for(l=0; l<1; l++) { for(k=0;k<65000;k++){} } } void main() { DDRB = 0xFF; DDRD = 0xFF; for(;;) { PORTB = 0b00110011; PORTD = 0x40; delay_7s(); PORTD = 0x0; // PORTB = 0b01010101; PORTD = 0x20; delay_7s(); PORTD = 0x0; // PORTB = 0b11001100; PORTD = 0x10; delay_7s(); PORTD = 0x0; } } Не могу понять почему, но информация отображается сразу на всех знакоместах. Проверял прошивку в Протеусе, там все работает. Следовательно, проблема со спаянной схемой. Меня настараживает что моя тинька, когда на выводах лог 0, выдает 1,2-1,3 В !!!. Следовательно, напряжение после ограничивающих резюков перед транзисторами, колеблется от 0,74 В (когда на выводе PD6 (PD5 или PD4) лог 0) и до 0,82 В (когда лог 1). Думаю, что проблема в этом. То есть напряжения 0,74 и 0,82 способствуют постоянному открытию транзисторов. Опыта мало, так что надеюсь на ваше помощь! Изменено 8 мая, 2010 пользователем rezident Оформление цитаты исходника. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GDI 0 6 мая, 2010 Опубликовано 6 мая, 2010 · Жалоба Все ноги питания и земли подключили? У биполярных транзисторов полезно поставить резистор с базы на землю чтоб закрывались лучше. По схеме трудно что то сказать, слишком мелкая, а ссылка на главную радикала ведет. Вообще, картинки лучше прямо сюда в форум прикладывать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
indi_88 0 6 мая, 2010 Опубликовано 6 мая, 2010 · Жалоба Исправил ситуацию с принтскрином. Проблем с землей/питанием вроде нет. Прозванивал, все баги давно уже исправил Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
akl 0 6 мая, 2010 Опубликовано 6 мая, 2010 · Жалоба Может поможет временное подключение лапы RESET к +5V. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 6 мая, 2010 Опубликовано 6 мая, 2010 · Жалоба информация отображается сразу на всех знакоместах. Надо сначала отключать знакоместо, а потом уже выводить цифру для следующего знакоместа. То есть, добавить PORTD = 0x0; перед каждым PORTB = ....; Ну и - volatile unsigned int k, l; :maniac: Пардон, первое замечание снимается - проглядел:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 6 мая, 2010 Опубликовано 6 мая, 2010 · Жалоба Используйте кнопку для оформления исходников. Иначе их очень трудно читать и, соответственно, уменьшается желание в них вникать. void delay_7s() { unsigned int k, l; for(l=0; l<1; l++) { for(k=0;k<65000;k++){} } } Этот код работать не будет. Точнее, он будет выкинут компилятором как бесполезный при включенной оптимизации (а без оптимизации компилировать не имеет смысла). Используйте встроенную функцию _delay_ms() из <util/delay.h> или хотя бы объявите переменные цикла как volatile. А когда компилятор выкинул задержку - вваша программа исполняется быстро-быстро :) То есть, добавить PORTD = 0x0; перед каждым PORTB = ....; Ой. Оно же и так отключит при записи PORTB = Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
indi_88 0 6 мая, 2010 Опубликовано 6 мая, 2010 (изменено) · Жалоба Я б изменил код в теме, но пропала кнопочка едит( Поменя код на #include <avr/io.h> #include <util/delay.h> int main() { DDRB = 0xFF; DDRD = 0xFF; for(;;) { PORTB = 0b00110011; PORTD = 0x40; _delay_ms(1000); PORTD = 0x0; // PORTB = 0b01010101; PORTD = 0x20; _delay_ms(1000); PORTD = 0x0; // PORTB = 0b11001100; PORTD = 0x10; _delay_ms(1000); PORTD = 0x0; } return(0); } Все равно выводит на 3 знакоместа. Странно, но задержка между изменением кракозяблов на 7сегм равна дето 4 сек а не 1 сек. Что вы можете сказать про напряжение на ноге мк при лог 0 ? Хм, почему 4 сек а не 1 сек я разобрался. Тк в мейкфайле стояла частота 4Мгц, то чего-то функция задержки работала в 4 раза дольше. Поставил 1Мгц и задержка стала 1 сек Изменено 6 мая, 2010 пользователем indi_88 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 6 мая, 2010 Опубликовано 6 мая, 2010 · Жалоба Ой. Оно же и так отключит при записи PORTB = Нет, там же катоды (знакоместа) на PORTD. Поменя код на ... _delay_ms(1000); Вы очень своеобразно трактуете понятие "динамическая индикация" :) Вообще-то обычно для этого переключают разряды гораздо чаще, чем раз в секунду. Раз в сто чаще. Уменьшите задержку примерно раз в сто, и всё станет нормально. (В том числе и напряжения.) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
indi_88 0 6 мая, 2010 Опубликовано 6 мая, 2010 · Жалоба Вы очень своеобразно трактуете понятие "динамическая индикация" smile.gif Вообще-то обычно для этого переключают разряды гораздо чаще, чем раз в секунду. Раз в сто чаще. Я правильно понимаю динамическую индикацию. Просто Вы, наверное, не правильно поняли, что я хочу. Мне надо по очереди выводить разыне крякозяблы на индикаторе. То есть, сначало что-то показывается в течении 1 сек на первом знакоместе, остальные погашены. Потом что-то показывается на второй знакоместе и т.д. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 6 мая, 2010 Опубликовано 6 мая, 2010 · Жалоба Я правильно понимаю динамическую индикацию. Просто Вы, наверное, не правильно поняли, что я хочу. Значит вы неясно выражаете свои мысли. Когда пишут "использую динамику" - это имеет вполне определённое значение. Что касается вопроса "почему выводятся сразу на все места" - осталось лишь одно разумное объяснение - вы перепутали цоколёвку индикатора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 6 мая, 2010 Опубликовано 6 мая, 2010 · Жалоба Что вы можете сказать про напряжение на ноге мк при лог 0 ?Ненормально. А что на базах транзисторов? Если еще больше - то у вас транзистор не той полярности (pnp) или попутаны выводы базы и коллектра. В результате в вывод стекает ток из индикатора. Других разумных объяснений нет - направление портов вы задали. Хм, почему 4 сек а не 1 сек я разобрался. Тк в мейкфайле стояла частота 4Мгц, то чего-то функция задержки работала в 4 раза дольше. Поставил 1Мгц и задержка стала 1 секУ вас тактирование от внутреннего RC 8МГц и запрограммирован фуз CKDIV. Поэтому тактирование получается 1 МГц. А компилятор высчтитывает количество циклов задержки исходя из значения F_CPU. Так что все правильно. Нет, там же катоды (знакоместа) на PORTD.Да. Стормозил. :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
indi_88 0 6 мая, 2010 Опубликовано 6 мая, 2010 · Жалоба Значит вы неясно выражаете свои мысли Прошу прощение) Что касается вопроса "почему выводятся сразу на все места" - осталось лишь одно разумное объяснение - вы перепутали цоколёвку индикатора. Вряд ли, я меняя значение порта Б могу зажигать/тушить все сегменты знакоместа индикатора (то есть вывести все, что я захочу). Ненормально. А что на базах транзисторов? Если еще больше - то у вас транзистор не той полярности (pnp) или попутаны выводы базы и коллектра. В результате в вывод стекает ток из индикатора. Других разумных объяснений нет - направление портов вы задали. Маркировка на транзисторе: BC547B Выводы транзисторов выбирал так: если смотреть срез корпуса, то слева направо: к б э На базах напряжения 0,74 (лог 0) или 0,82 (лог 1) вольт. Меня очень смущают эти напряжения. Если они не падают ниже 0,74 В, то возможно что транзисторы постоянно открыты? Следовательно, тогда будут гореть все знакоместа Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 6 мая, 2010 Опубликовано 6 мая, 2010 · Жалоба Цоколевка похожа на правду, транзистор npn. На базах напряжения 0,74 (лог 0) или 0,82 (лог 1) вольт.А что на ногах если отключить от них транзисторы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
indi_88 0 7 мая, 2010 Опубликовано 7 мая, 2010 · Жалоба Купил новый мк и транзисторы, попытаюсь сделать новую разводку и заново все собрать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
*ZEVS* 0 11 мая, 2010 Опубликовано 11 мая, 2010 · Жалоба Попробуйте вообще убрать транзисторы и индикатор соединить прямо на микроконтроллер (тока в порте микроконтроллера будет достаточно чтобы засветить индикатор). Данные выводить на порт в инвертированном виде. Да еще попробуйте вашу программу пошагово пройти в каком нить симуляторе (посмотрите будут ли меняться состояния пинов). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться