простые интересные РАДИОСХЕМЫ сделанные своими руками

» Гость

Мы рады вас видеть. Пожалуйста зарегистрируйтесь или авторизируйтесь!





» ДАТАШИТЫ
Например: TDA1562

» СХЕМЫ


Отметить прочитанными   -   Поиск   -   Правила   -   Новые сообщения

Страница 4 из 5«12345»
Модератор форума: Igoran, Витинари, Sam 
Форум радиолюбителей » СХЕМЫ » НАЧИНАЮЩИМ » Помощь в программировании (Подскажите в какой теме можно задать вопрос)
Помощь в программировании
Вт, 13.06.2017, 17:49 | Сообщение # 31        
Ник
аватар
  Постов: 184  Offline
msmmmm, Огромное спасибо. Я повнимательней посмотрел предложенные программы и написал свою с учетом ошибок которые были у меня. Все работает. Есть правда небольшие нюансы, но думаю разберусь.

Добавлено (13.06.2017, 17:49)
---------------------------------------------
Подскажите как правильно понять данную запись (можно подробней):
s=(~s)+0x0001;
s - это переменная,
~ - логическое НЕ,
0x0001 - шестнадцатеричное число.

Вт, 13.06.2017, 18:19 | Сообщение # 32        
msmmmm
аватар
  Постов: 730  Offline Друзья 
Цитата Ник ()
~ - логическое НЕ

~ - побитовая инверсия.
А в строке определяется модуль отрицательного числа. Если старший бит равен 1 - число отрицательное.
-1 = 0хFFFF;
инвертируем, получаем 0х0000;
добавляем 1, получаем 0х0001.
Вт, 13.06.2017, 18:42 | Сообщение # 33        
Ник
аватар
  Постов: 184  Offline
~ - побитовая инверсия, если это применить к данному числу?
~0b00111001 = 0b11000110 ,будет выглядеть так?
~ - побитовая инверсия, и когда такое выражение применять?
Вт, 13.06.2017, 22:54 | Сообщение # 34        
msmmmm
аватар
  Постов: 730  Offline Друзья 
Цитата Ник ()
~0b00111001 = 0b11000110 ,будет выглядеть так?
Да.
Цитата Ник ()
когда такое выражение применять?
Когда нужно побитно инвертировать biggrin . Пример в первом сообщении. Алгоритмов обработки данных, где может применяться, много: кодирование и декодирование, вычисление контрольных сумм и т.д.
А вот пример макроса для обнуления бита:
#define ClearBit(reg, bit) reg &= (~(1<<bit))
Здесь это команда для препроцессора.
Сб, 05.08.2017, 14:51 | Сообщение # 35        
Ник
аватар
  Постов: 184  Offline
Доброе время суток. Понадобился дома многоступенчатый регулятор температуры (набирает до определенной температуры и поддерживает за определенное время и таких насколько ступеней). Сначала начал писать программу для атмеги8 на частоте 4Мгц. выводил на семи сегментный индикатор. Время показывало в обратном отсчете, работало пока на дошел до вывода температуры и тут начались танцы с бубном, то температуру показывает, время нули, а потом мерцает индикатор. Решил не мучатся и написать для атмеги32 с подкл. ЖК индикатора 16х2. Начал писать программу по кускам с коректеровкой до рабочего состояния. При сборке в одну программу начались проблемы со стыковкой. Скорости на внешнем кварце 16Мгц. и часовом 32768гц.(обработка таймера при прерывании по переполнению) при подключении к программе инсталляции ЖК стали тормозится сильно опрос кнопок и таймер почему то стал работать быстрее ( за минуту на 3-4 секунды), а кнопка вкл./откл. нормально только на вкл.,а на откл. требуется ждать секунд 10. Если требуется могу выложить весь код на языке Си. В чем причина таких проблем? В программировании уровень новичка.
Сб, 05.08.2017, 20:26 | Сообщение # 36        
Витинари
аватар
  Постов: 2525  Offline Модератор 
Ник, можно подробнее, в каких случаях и когда начинает выводиться обратный отсчет? Когда в помещении достигается нужная температура?
Как в программе разграничены (и разграничены ли?) показ температуры и вывод времени? Как реализован счет времени - внутренними ресурсами контроллера или через микросхему типа DS1307?
Как организован замер температуры? Что за датчик используется? Контроллер опрашивает его постоянно?
Переход на Atmega32 был совершенно лишним, Atmega8 легко справится с такой задачей.
Пн, 07.08.2017, 16:42 | Сообщение # 37        
Ник
аватар
  Постов: 184  Offline
По задумке программа должна работать так: одна кнопка вкл. откл. одна переключение каналов (ступеней), две кнопки на набор времени и две на температуру. При программировании на первой ступени водим нужное время и температуру, также если требуется ввод следующей ступени (переключение между ступенями кнопкой) далее кнопкой вкл. запускаю программу и начинается набор заданной температуры (выход на нагреватель пин РВ3 ) как только достигнута температура, нагреватель откл. или вкл. чтобы поддерживать заданную температуру а время начинает обратный отсчет. При достижении времени нуля переходит на следующую ступень или заканчивает работу с подачей звукового сигнала.

Таймер задействован внутренний. Вчера проверил частоту основную и на часовом - 15,9997Мгц. и 32895гц. Проверял на макетной без паечной плате, проводки до кварцев по 4 см. корпус часового подпаян к минусу. Может из за этого спешить время(длинные провода)? Частота то отличается.

Код
// Timer2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
sek++;
d++;
if (d>1)
{
d=0;

};

if (chas>0&&sek==59&&min>0) // отнимаю минуту если час не равен 0
{
sek=0;
min--;
};

if (chas==0&&sek==59&&min>0) //отнимаю минуту если час равен 0, а минута не равна
{
sek=0;
min--;
};
if (chas>=1&&sek==59&&min==0) //отнимаю час если минута равна 0
{
sek=0;
min=59;
chas--;

};

}

Показ температуры и времени в программе написан последовательно как правильно надо не знаю. Вот та часть кода которую кое как соединил, правда так она и работает как описано выше.
Датчик температуры DS18B20. Все библиотеки на ЖК и датчик подключены готовые, не мной написанные. Переход я знаю был лишнем, просто были приобретены атмеги32 в Китае 10 шт. 230 гривен с бесплатной доставкой.
while (1)
{

if (PINC.5==0&&f==1) //вкл. кнопка работа/прог
{

if (a<50)
{
a++;
}

else
{
if (chas==0&&min==0)
{
lcd_clear(); // Функция очистки экрана
lcd_putsf(" ERROR"); // Выводим запись
delay_ms(1000);
q=0;
}
else
{

PORTB|=(1<<PORTB0); // показывает работу или прог.
TIMSK=(0<<OCIE2) | (1<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (0<<TOIE0);

rab=1;// переключение между работой и вводом данных
f=0;
};

};
};
if (PINC.5==1&&f==0)
{
f=2;
};
if (PINC.5==1&&f==3)
{
f=1;
};

switch (rab) //переключение работа/прог
{
case 0:

if (PINC.2==0) //прибавляю часы
{

if (v<400)
{
v++;
}
else

{
chas++;
v=0;
if (chas>9)
{
chas=0;
};

};

};

if (PINC.1==0) //прибавляю минуты
{

if (v1<400)
{
v1++;
}
else

{
min++;
v1=0;
if (min>59)
{
min=0;
};

};

};
if (q==0)
{
lcd_clear(); // Функция очистки экрана
delay_ms(50);
q=1;
};

sprintf(chas1, "%01d",chas); // форматируем
lcd_gotoxy(3,1); // Выставляем курсор
lcd_puts(chas1); // Выводим значение

lcd_gotoxy(4,1); // Выставляем курсор
lcd_putsf(":");

sprintf(min1, "%02d",min); // форматируем
lcd_gotoxy(5,1); // Выставляем курсор
lcd_puts(min1); // Выводим значение

if (PINC.4==0) //прибавляю температуру
{

if (z<400)
{
z++;
}
else

{
temp++;
z=0;

if (temp>105)
{
temp=5;
};

};

};

if (PINC.3==0) //отнимаю температуру
{

if (z1<400)
{
z1++;
}
else

{
temp--;
z1=0;
if (temp<5)
{
temp=105;
};

};

};

lcd_gotoxy(8,1); // Выставляем курсор
lcd_puts("t="); // Выводим значение */

sprintf(temper2, "%3d",temp); // форматируем
lcd_gotoxy(10,1); // Выставляем курсор
lcd_puts(temper2); // Выводим значение */

break;

case 1:

if (PINC.5==0&&f==2) // кнопка работа/прог откл. таймера 2 я уже не знаю куда ее перенести что бы был опрос.
{

if (a>0)
{
a--;
}
else
{
PORTB&=~(1<<PORTB0); // индикация режима работа/прог
PORTB&=~(1<<PORTB3); //откл. нагревателя

TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (0<<TOIE0);

f=3; // контроль кнопки работа/прог
rab=0; // переключение работа/прог

};

};

if (chas==0&&min==0)
{
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (0<<TOIE0);
TCNT2=0;
rab=0;
min=0;
chas=0;
sek=0;
PORTB&=~(1<<PORTB3); //откл. тену
PORTB&=~(1<<PORTB0); // индикайия режима работа/прог
};

if (q==1)
{
lcd_clear(); // Функция очистки экрана
delay_ms(50);
q=0;
};

sprintf(chas1, "%01d",chas); // форматируем
lcd_gotoxy(3,1); // Выставляем курсор
lcd_puts(chas1); // Выводим значение

if (d==1)
{
lcd_gotoxy(4,1); // Выставляем курсор мигание : за 1 сек.
lcd_putsf(":");
}
else
{
lcd_gotoxy(4,1); // Выставляем курсор
lcd_putsf(" ");
};

sprintf(min1, "%02d",min); // форматируем
lcd_gotoxy(5,1); // Выставляем курсор
lcd_puts(min1); // Выводим значение

#asm("cli") // здесь надо еще пересчитать показывает до 70 градусов далее показания бредовые.
temper=ds18b20_temperature(0);

if (temp>temper)
{
PORTB|=(1<<PORTB3); //вкл. тену
};

if (temp<=temper)
{
PORTB&=~(1<<PORTB3); //откл. тену
};
#asm("sei")
lcd_gotoxy(8,1); // Выставляем курсор
lcd_puts("t="); // Выводим значение */
sprintf(temper1, "%3d",temper); // форматируем
lcd_gotoxy(10,1); // Выставляем курсор
lcd_puts(temper1); // Выводим значение */

break;
};

}
}
Пн, 07.08.2017, 18:27 | Сообщение # 38        
Витинари
аватар
  Постов: 2525  Offline Модератор 
Не стал особо вникать в код, судя по посту №35, по отдельности-то оно все работает, а вместе - глючит. У меня такое было на PIC с LCD1602 и DS18b20. У DS1820 и DS18b20 есть торможение примерно в 700 мс, требуемое на инициализацию. То есть температура может замеряться не чаще, чем раз в секунду, а лучше даже раз в несколько секунд, иначе датчик может начать разогреваться от частых обращений к нему. Попробуйте замерять температуру раз в 10 секунд - должно помочь. Заодно так обеспечится гистерезис, иначе при пограничной температуре на датчике нагреватель будет включаться и выключаться бесконечно.
Кстати, какая температура предполагается максимальной? У DS18b20 максимум +125 °C.
Еще совет: не стоит давать переменным имена типа v, v1, z, d, q и т.п., особенно в неочевидных ситуациях. Одно дело код типа for(int i; i<10; i++), но совсем другое - if(i==100){a++;b=1;} Лучше написать целое слово, чем давать ни о чем не говорящее имя. Например, if(z<400){z++;} - что это? Без комментариев слишком муторно разбирать.
Пн, 07.08.2017, 19:10 | Сообщение # 39        
Сергей-78
аватар
  Постов: 7680  Online Модератор 
Кто подскажет какие будут эти чертовы FUSE для Аттини 13 в Понипрог.
low_fuses=0x6a
high_fuses=0xFF
Пн, 07.08.2017, 19:48 | Сообщение # 40        
Витинари
аватар
  Постов: 2525  Offline Модератор 
Сергей-78, это ее заводские фьюзы. Вот:
Форум радиолюбителей » СХЕМЫ » НАЧИНАЮЩИМ » Помощь в программировании (Подскажите в какой теме можно задать вопрос)
Страница 4 из 5«12345»
Поиск:
Кто есть кто на форуме радиолюбителей: Администратор Модераторы Друзья Пользователи
Группа вконтакте Канал ютуб Группа в фэйсбук Мобильная версия © 2010-2018, "Радиосхемы". Все права защищены. Почта