Перейти к содержанию
    

Добрый день, возникли трудности с работой с МК. Это мой первый практический опыт в паянии и работе с МК.

Есть схема ультразвукового дальномера, пока собрал кусок: питание, кнопки управление, МК и 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 способствуют постоянному открытию транзисторов.

 

Опыта мало, так что надеюсь на ваше помощь!

post-57112-1273152498_thumb.jpg

Изменено пользователем rezident
Оформление цитаты исходника.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Проблем с землей/питанием вроде нет. Прозванивал, все баги давно уже исправил

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

информация отображается сразу на всех знакоместах.

 

Надо сначала отключать знакоместо, а потом уже выводить цифру для следующего знакоместа.

То есть, добавить

PORTD = 0x0;

перед каждым

PORTB = ....;

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Используйте кнопку rte-code-button.png для оформления исходников. Иначе их очень трудно читать и, соответственно, уменьшается желание в них вникать.

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 =

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я б изменил код в теме, но пропала кнопочка едит(

 

Поменя код на

 

#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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ой. Оно же и так отключит при записи PORTB =

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

 

Поменя код на

...
    _delay_ms(1000);

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Я правильно понимаю динамическую индикацию. Просто Вы, наверное, не правильно поняли, что я хочу.

Мне надо по очереди выводить разыне крякозяблы на индикаторе.

То есть, сначало что-то показывается в течении 1 сек на первом знакоместе, остальные погашены.

Потом что-то показывается на второй знакоместе и т.д.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я правильно понимаю динамическую индикацию. Просто Вы, наверное, не правильно поняли, что я хочу.

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Хм, почему 4 сек а не 1 сек я разобрался. Тк в мейкфайле стояла частота 4Мгц, то чего-то функция задержки работала в 4 раза дольше. Поставил 1Мгц и задержка стала 1 сек
У вас тактирование от внутреннего RC 8МГц и запрограммирован фуз CKDIV. Поэтому тактирование получается 1 МГц. А компилятор высчтитывает количество циклов задержки исходя из значения F_CPU. Так что все правильно.

 

Нет, там же катоды (знакоместа) на PORTD.
Да. Стормозил. :laughing:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

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

 

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

Маркировка на транзисторе: BC547B

Выводы транзисторов выбирал так:

если смотреть срез корпуса, то слева направо: к б э

На базах напряжения 0,74 (лог 0) или 0,82 (лог 1) вольт.

 

Меня очень смущают эти напряжения. Если они не падают ниже 0,74 В, то возможно что транзисторы постоянно открыты? Следовательно, тогда будут гореть все знакоместа

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Цоколевка похожа на правду, транзистор npn.

На базах напряжения 0,74 (лог 0) или 0,82 (лог 1) вольт.
А что на ногах если отключить от них транзисторы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Купил новый мк и транзисторы, попытаюсь сделать новую разводку и заново все собрать

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте вообще убрать транзисторы и индикатор соединить прямо на микроконтроллер (тока в порте микроконтроллера будет достаточно чтобы засветить индикатор). Данные выводить на порт в инвертированном виде.

Да еще попробуйте вашу программу пошагово пройти в каком нить симуляторе (посмотрите будут ли меняться состояния пинов).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...