реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> ATtiny 2313
indi_88
сообщение May 6 2010, 13:10
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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
Причина редактирования: Оформление цитаты исходника.

Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
GDI
сообщение May 6 2010, 13:22
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Все ноги питания и земли подключили? У биполярных транзисторов полезно поставить резистор с базы на землю чтоб закрывались лучше. По схеме трудно что то сказать, слишком мелкая, а ссылка на главную радикала ведет. Вообще, картинки лучше прямо сюда в форум прикладывать.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
indi_88
сообщение May 6 2010, 13:30
Сообщение #3


Участник
*

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



Исправил ситуацию с принтскрином.

Проблем с землей/питанием вроде нет. Прозванивал, все баги давно уже исправил
Go to the top of the page
 
+Quote Post
akl
сообщение May 6 2010, 13:37
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 127
Регистрация: 4-04-07
Из: Ижевск
Пользователь №: 26 773



Может поможет временное подключение лапы RESET к +5V.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение May 6 2010, 13:45
Сообщение #5


фанат дивана
******

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



Цитата(indi_88 @ May 6 2010, 19:10) *
информация отображается сразу на всех знакоместах.


Надо сначала отключать знакоместо, а потом уже выводить цифру для следующего знакоместа.
То есть, добавить
Код
PORTD = 0x0;

перед каждым
Код
PORTB = ....;


Ну и - volatile unsigned int k, l; maniac.gif

Пардон, первое замечание снимается - прогляделsmile.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 6 2010, 14:06
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 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.
А когда компилятор выкинул задержку - вваша программа исполняется быстро-быстро smile.gif


Цитата(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)
Go to the top of the page
 
+Quote Post
indi_88
сообщение May 6 2010, 14:46
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение May 6 2010, 15:00
Сообщение #8


фанат дивана
******

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



Цитата(Сергей Борщ @ May 6 2010, 20:06) *
Ой. Оно же и так отключит при записи PORTB =

Нет, там же катоды (знакоместа) на PORTD.

Цитата(indi_88 @ May 6 2010, 20:46) *
Поменя код на
Код
...
    _delay_ms(1000);


Вы очень своеобразно трактуете понятие "динамическая индикация" smile.gif Вообще-то обычно для этого переключают разряды гораздо чаще, чем раз в секунду. Раз в сто чаще.

Уменьшите задержку примерно раз в сто, и всё станет нормально. (В том числе и напряжения.)


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
indi_88
сообщение May 6 2010, 15:08
Сообщение #9


Участник
*

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



Цитата
Вы очень своеобразно трактуете понятие "динамическая индикация" smile.gif Вообще-то обычно для этого переключают разряды гораздо чаще, чем раз в секунду. Раз в сто чаще.


Я правильно понимаю динамическую индикацию. Просто Вы, наверное, не правильно поняли, что я хочу.
Мне надо по очереди выводить разыне крякозяблы на индикаторе.
То есть, сначало что-то показывается в течении 1 сек на первом знакоместе, остальные погашены.
Потом что-то показывается на второй знакоместе и т.д.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение May 6 2010, 15:41
Сообщение #10


фанат дивана
******

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



Цитата(indi_88 @ May 6 2010, 21:08) *
Я правильно понимаю динамическую индикацию. Просто Вы, наверное, не правильно поняли, что я хочу.

Значит вы неясно выражаете свои мысли. Когда пишут "использую динамику" - это имеет вполне определённое значение.

Что касается вопроса "почему выводятся сразу на все места" - осталось лишь одно разумное объяснение - вы перепутали цоколёвку индикатора.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 6 2010, 16:24
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 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.
Да. Стормозил. laughing.gif


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
indi_88
сообщение May 6 2010, 17:58
Сообщение #12


Участник
*

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



Цитата
Значит вы неясно выражаете свои мысли

Прошу прощение)

Цитата
Что касается вопроса "почему выводятся сразу на все места" - осталось лишь одно разумное объяснение - вы перепутали цоколёвку индикатора.

Вряд ли, я меняя значение порта Б могу зажигать/тушить все сегменты знакоместа индикатора (то есть вывести все, что я захочу).

Цитата
Ненормально. А что на базах транзисторов? Если еще больше - то у вас транзистор не той полярности (pnp) или попутаны выводы базы и коллектра. В результате в вывод стекает ток из индикатора. Других разумных объяснений нет - направление портов вы задали.

Маркировка на транзисторе: BC547B
Выводы транзисторов выбирал так:
если смотреть срез корпуса, то слева направо: к б э
На базах напряжения 0,74 (лог 0) или 0,82 (лог 1) вольт.

Меня очень смущают эти напряжения. Если они не падают ниже 0,74 В, то возможно что транзисторы постоянно открыты? Следовательно, тогда будут гореть все знакоместа
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 6 2010, 21:04
Сообщение #13


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
indi_88
сообщение May 7 2010, 14:50
Сообщение #14


Участник
*

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



Купил новый мк и транзисторы, попытаюсь сделать новую разводку и заново все собрать
Go to the top of the page
 
+Quote Post
-SANYCH-
сообщение May 11 2010, 08:15
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 289
Регистрация: 6-12-05
Пользователь №: 11 864



Попробуйте вообще убрать транзисторы и индикатор соединить прямо на микроконтроллер (тока в порте микроконтроллера будет достаточно чтобы засветить индикатор). Данные выводить на порт в инвертированном виде.
Да еще попробуйте вашу программу пошагово пройти в каком нить симуляторе (посмотрите будут ли меняться состояния пинов).
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 01:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.01515 секунд с 7
ELECTRONIX ©2004-2016