|
ATtiny 2313 |
|
|
|
May 6 2010, 13:10
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 6-05-10
Пользователь №: 57 112

|
Добрый день, возникли трудности с работой с МК. Это мой первый практический опыт в паянии и работе с МК. Есть схема ультразвукового дальномера, пока собрал кусок: питание, кнопки управление, МК и 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 способствуют постоянному открытию транзисторов. Опыта мало, так что надеюсь на ваше помощь!
Сообщение отредактировал rezident - May 8 2010, 23:57
Причина редактирования: Оформление цитаты исходника.
Эскизы прикрепленных изображений
|
|
|
|
|
May 6 2010, 13:30
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 6-05-10
Пользователь №: 57 112

|
Исправил ситуацию с принтскрином.
Проблем с землей/питанием вроде нет. Прозванивал, все баги давно уже исправил
|
|
|
|
|
May 6 2010, 13:45
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(indi_88 @ May 6 2010, 19:10)  информация отображается сразу на всех знакоместах. Надо сначала отключать знакоместо, а потом уже выводить цифру для следующего знакоместа. То есть, добавить Код PORTD = 0x0; перед каждым Код PORTB = ....; Ну и - volatile unsigned int k, l;  Пардон, первое замечание снимается - проглядел
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
May 6 2010, 14:06
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Используйте кнопку  для оформления исходников. Иначе их очень трудно читать и, соответственно, уменьшается желание в них вникать. Цитата(indi_88 @ May 6 2010, 16:10)  Код 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. А когда компилятор выкинул задержку - вваша программа исполняется быстро-быстро  Цитата(AHTOXA @ May 6 2010, 16:45)  То есть, добавить Код PORTD = 0x0; перед каждым Код PORTB = ....; Ой. Оно же и так отключит при записи PORTB =
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 6 2010, 14:46
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 6-05-10
Пользователь №: 57 112

|
Я б изменил код в теме, но пропала кнопочка едит( Поменя код на Код #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 сек
Сообщение отредактировал indi_88 - May 6 2010, 14:29
|
|
|
|
|
May 6 2010, 15:00
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Сергей Борщ @ May 6 2010, 20:06)  Ой. Оно же и так отключит при записи PORTB = Нет, там же катоды (знакоместа) на PORTD. Цитата(indi_88 @ May 6 2010, 20:46)  Поменя код на Код ... _delay_ms(1000); Вы очень своеобразно трактуете понятие "динамическая индикация"  Вообще-то обычно для этого переключают разряды гораздо чаще, чем раз в секунду. Раз в сто чаще. Уменьшите задержку примерно раз в сто, и всё станет нормально. (В том числе и напряжения.)
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
May 6 2010, 15:08
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 6-05-10
Пользователь №: 57 112

|
Цитата Вы очень своеобразно трактуете понятие "динамическая индикация" smile.gif Вообще-то обычно для этого переключают разряды гораздо чаще, чем раз в секунду. Раз в сто чаще. Я правильно понимаю динамическую индикацию. Просто Вы, наверное, не правильно поняли, что я хочу. Мне надо по очереди выводить разыне крякозяблы на индикаторе. То есть, сначало что-то показывается в течении 1 сек на первом знакоместе, остальные погашены. Потом что-то показывается на второй знакоместе и т.д.
|
|
|
|
|
May 6 2010, 16:24
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(indi_88 @ May 6 2010, 17:46)  Что вы можете сказать про напряжение на ноге мк при лог 0 ? Ненормально. А что на базах транзисторов? Если еще больше - то у вас транзистор не той полярности (pnp) или попутаны выводы базы и коллектра. В результате в вывод стекает ток из индикатора. Других разумных объяснений нет - направление портов вы задали. Цитата(indi_88 @ May 6 2010, 17:46)  Хм, почему 4 сек а не 1 сек я разобрался. Тк в мейкфайле стояла частота 4Мгц, то чего-то функция задержки работала в 4 раза дольше. Поставил 1Мгц и задержка стала 1 сек У вас тактирование от внутреннего RC 8МГц и запрограммирован фуз CKDIV. Поэтому тактирование получается 1 МГц. А компилятор высчтитывает количество циклов задержки исходя из значения F_CPU. Так что все правильно. Цитата(AHTOXA @ May 6 2010, 18:00)  Нет, там же катоды (знакоместа) на PORTD. Да. Стормозил.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 6 2010, 17:58
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 6-05-10
Пользователь №: 57 112

|
Цитата Значит вы неясно выражаете свои мысли Прошу прощение) Цитата Что касается вопроса "почему выводятся сразу на все места" - осталось лишь одно разумное объяснение - вы перепутали цоколёвку индикатора. Вряд ли, я меняя значение порта Б могу зажигать/тушить все сегменты знакоместа индикатора (то есть вывести все, что я захочу). Цитата Ненормально. А что на базах транзисторов? Если еще больше - то у вас транзистор не той полярности (pnp) или попутаны выводы базы и коллектра. В результате в вывод стекает ток из индикатора. Других разумных объяснений нет - направление портов вы задали. Маркировка на транзисторе: BC547B Выводы транзисторов выбирал так: если смотреть срез корпуса, то слева направо: к б э На базах напряжения 0,74 (лог 0) или 0,82 (лог 1) вольт. Меня очень смущают эти напряжения. Если они не падают ниже 0,74 В, то возможно что транзисторы постоянно открыты? Следовательно, тогда будут гореть все знакоместа
|
|
|
|
|
May 6 2010, 21:04
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цоколевка похожа на правду, транзистор npn. Цитата(indi_88 @ May 6 2010, 20:58)  На базах напряжения 0,74 (лог 0) или 0,82 (лог 1) вольт. А что на ногах если отключить от них транзисторы?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 7 2010, 14:50
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 6-05-10
Пользователь №: 57 112

|
Купил новый мк и транзисторы, попытаюсь сделать новую разводку и заново все собрать
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|