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

Attiny2313 + Ds18B20 + Индикатор


pavelok

Рекомендуемые сообщения

Здравствуйте! Пытаюсь собрать простой термометр, вроде бы все написал, да только вот проблема: при моделировании в протеусе два правых индикатора мигают, а постоянно горит только 3й справа. Вот код:

#include <tiny2313.h>
#include <delay.h>
#asm
.equ __w1_port=0x12
.equ __w1_bit=3
#endasm
#include <1wire.h>
#include <ds18b20.h>
void set(int s)
{
int i,n;
int j;
unsigned int a[] = {0b11111100, 0b01100000, 0b11011010, 0b11110010, 0b01100110, 0b10110110, 0b10111110, 0b11100000, 0b11111110, 0b11110110};
unsigned int c;
n=1;
for (j=0; j<3; j++) {
c=a[s%10];
if (n==1) {PORTD.1=1; PORTD.2=1;}
if (n==2) {PORTD.0=1; PORTD.2=1; c=c+1;}
if (n==3) {PORTD.0=1; PORTD.1=1;}
PORTB.2=0;
for (i=0; i<8; i++)
{
PORTB.1=c%2;
PORTB.0=0;
PORTB.0=1;
c=c/2;
}
PORTB.2=1;
if (n==1) {PORTD.0=0;}
if (n==2) {PORTD.1=0;}
if (n==3) {PORTD.2=0;}
delay_ms(1);
n=n+1;
s=s/10;
}
}
void main(void)
{
PORTB=0x00;
DDRB=0xFF;
PORTD=0b11110111;
DDRD=0b11110111;

w1_init();

while (1)
 {
 int temp;
 temp=ds18b20_temperature(0)*10;
 set(temp);				
 }
}

Я так понимаю, что проблема возникла из-за задержки при чтении температуры:

temp=ds18b20_temperature(0)*10;

Собственно, как можно решить данную проблему?

Схема в Протеусе

h_1430841462_4824348_6e8d011937.png

Изменено пользователем pavelok
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Именно так. Вы в динамике выводите все разряды. Последний вывелся, функция завершилась, управление ушло на измерение температуры. Последний разряд - застыл. Бороться с этим - выводить разряды через равные промежутки времени.

Я не раздаю удочки. Я продаю рыбу.

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

динамическая индикация делается по прерыванию от таймер.

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

К тому же время преобразования датчиков DSxx, достаточно большое.

Учитывать надо!

Подключать железо, лучше начинать с прочтения документации, а не тупова использования чужих библиотек.

Изменено пользователем hasl
Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Тут вот какое дело. Можно (вернее нужно), как выше сказали, динамич. индикацию в обработчике прерываний делать. Тогда работа с датчиком в основном цикле будет невозможна, т.к. этот цикл периодически будет "отвлекаться" на прерывания. Нужно ухитриться впихнуть работу с датчиком в процедуру - обработчик прерываний, чтобы "и волки сыты и овцы целы" были. С LCD1602 подобными проще, однако :)

Изменено пользователем КЭС
Ссылка на комментарий
Поделиться на другие сайты

Почему невозможна работа с датчиком в осовном цикле? В прерывание таймера (аппаратного) закидываете функцию обновления экрана, а в основном цикле фланговый автомат, к примеру, с программным таймером. Как по мне то для работы с этим датчиком очень удобно пользоваться именно им (программным таймером), так как преобразование окло 0,8с, если память не изменяет. Ждать это время обычным дилеем крайне не практично.

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

Делается проще. Индикацию вешаем на прерывания. А температуру измеряем раз в минуту. Ну моргнёт оно разок в минуту, никто и не заметит. Это если без заморотов.

Изменено пользователем солар

Я не раздаю удочки. Я продаю рыбу.

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

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

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Приветствую. Скажите, кто в курсе, зачем делают такой выпрямитель? Зачем по два диода последовательно?
    • Не встречал таких программаторов, "чисто под Атинни". Фото программатора и его название продемонстрировать можете?  
    • Скажите кто-нибудь, как определить где у пружинного ревера вход а где выход? Есть подозрение, что у моего ревера перепутаны надписи на корпусе. Потому, что если я подаю сигнал на OUT - звучит лучше. Такая: https://varikap.ru/reverberator-na-mikrosxeme-ht8970/?
    • Low ESR ставят при определенных условиях а тут хватит и обычных. Можно конечно и  Low ESR поставить но это зря, ну хотя деньги ваши, никто не будет останавливать.
    • Было бы интересно узнать, выпускались ли в союзе такие щупы, и какие у них были размеры... Я так понял, нужно усилить (синусоидальный?) сигнал переменного тока в полосе условно от 10 герц до 100кГц примерно раз в 10-20. Решить проблему самому можно по-разному. Олдскульный метод, посоветовали выше с ссылкой на трёхтранзисторную схему, но учтите, что она разработана не для усиления сигнала, а для увеличения входного сопротивления: Коэффициент усиления надо будет поднять, что даст уменьшение полосы, но тут это не критично. Эта схема потребует наладки. Более "ленивый" метод, который выбрал бы я сам, это просто сделать х10 усилитель на ОУ. Для того, чтобы входное сопротивление было большим - надо установить по входу ОУ с полевиковыми входами. Можно использовать его как буфер, сделав схему двухкаскадной,  а можно взять чуть более высокочастотный ОУ и организовать весь функционал на нём. Например, LF357 будет более чем достаточна, отечественный аналог, который попроще достать, это, насколько помню, 544УД2/574УД1. На ней же можно и усиление организовать, если нужно всего 20дБ. По входу стоит поставить какую-нибудь защиту от перегрузки, хотяб резистор с диодами. Можно взять сдвоенный полевиковый ОУ, и сделать двухступенчатый усилитель, с каждой ступенью, усиливающей в несколько раз. Конкретная реализация в ваших руках, простор для творчества, так сказать) Неужели не интересно попробовать решить такую относительно простую задачу "своими руками"?
    • Если бы был ограничитель то он бы ограничивал китайские амперы ))
×
×
  • Создать...