ATMEGA8A. Две кнопки, два реле. На катушках реле меандр. ???
- Сообщения: 1
- Зарегистрирован: Ср ноя 02, 2022 16:20:28
Возникла необходимость перепрошить контроллер газировального аппарата. Старая слетела. Опыт программирования AVR минимален. Поизучал немного, и взялся. И сразу затыка. Написал на СИ прг.- две кнопки управляют двумя реле (через оптопары). При проверке осциллографом на катушках реле (или на входах оптопары) МЕАНДР. Это вместо высокого уровня.

- Реклама
А что должно быть? К этому сумбуру как-бы исходника надо бы приложить свою хотелку. Я так понимаю: нажали одну кнопку - сработало реле, налило воды. А выключать? Вроде должно по таймеру? Где он? Где задержка?
Типичная ошибка новичка: "Я написал фигню, а она не робить. Почему?" А как должна? Где расписан алгоритм?
Типичная ошибка новичка: "Я написал фигню, а она не робить. Почему?" А как должна? Где расписан алгоритм?
- Сообщения: 12867
- Зарегистрирован: Сб дек 18, 2021 19:25:32
Наверное, микроконтроллер постоянно ресетится по ватчдогу или ещё какой-то причине
- Сообщения: 1492
- Зарегистрирован: Ср июн 25, 2008 15:19:44
Спойлер
Код: Выделить всё
//==================
#define KEY_1_PIN PIND
#define KEY_1 0
#define KEY_2_PIN PIND
#define KEY_2 1
#define OUT_1_PORT PORTC
#define OUT_1_DDR DDRC
#define OUT_1 0
#define OUT_2_PORT PORTC
#define OUT_2_DDR DDRC
#define OUT_2 1
//==================
//==================
#define set_bit(reg, bit) reg |= (1<<(bit)) // Установка бита.
#define clr_bit(reg, bit) reg &= (~(1<<(bit))) // Сброс бита.
#define switch_bit(reg, bit) reg ^= (1<<(bit)) // Переключение бита.
//------------------------------------------------------------------------
#define check_bit(reg, bit) (reg & (1<<bit)) // Проверка бита.
//==================
//==================
#define check_key_1() (!(check_bit (KEY_1_PIN, KEY_1))) // Low level
#define check_key_2() (!(check_bit (KEY_2_PIN, KEY_2))) // Low level
//==================
//==================
#define __out_1_on() clr_bit (OUT_1_PORT, OUT_1) // Low level
#define __out_1_off() set_bit (OUT_1_PORT, OUT_1) // High level
#define __out_2_on() clr_bit (OUT_2_PORT, OUT_2) // Low level
#define __out_2_off() set_bit (OUT_2_PORT, OUT_2) // High level
//==================
//==================
void out_1_on (void);
void out_1_off (void);
void out_2_on (void);
void out_2_off (void);
//==================
//==================
void out_1_on (void)
{
__out_1_on ();
}
void out_1_off (void)
{
__out_1_off ();
}
void out_2_on (void)
{
__out_2_on ();
}
void out_2_off (void)
{
__out_2_off ();
}
//==================
int main(void)
{
// IO init
set_bit (OUT_1_PORT, OUT_1); // Логика управления отрицательная,
set_bit (OUT_2_PORT, OUT_2); // то есть, активный логический 0. Поэтому сразу выставляем 1.
// Важно. Если логика отрицательная, порты выставлять в 1 в первую очередь. Если сначала выставить DDRx, то нижние ключи выдадут кратковременный 0. Поэтому, сначала PORTx. Так верхние ключи сразу выдадут 1.
set_bit (OUT_1_DDR, OUT_1); // Out_1. Выход.
set_bit (OUT_2_DDR, OUT_2); // Out_2. Выход.
while (1)
{
if (check_key_1 ()) // проверка кн. "газ вода
out_1_on (); // вкл. клапан "газ.вода"
else
out_1_off (); // выкл. клапан "газ.вода"
if (check_key_2 ()) // проверка кн. "хол. вода"
out_1_on (); // вкл. клапан "хол.вода"
else
out_1_off (); // выкл. клапан "хол.вода"
}
}
Последний раз редактировалось Demiurg Ср ноя 02, 2022 22:44:30, всего редактировалось 4 раза.
- Сообщения: 12867
- Зарегистрирован: Сб дек 18, 2021 19:25:32
Alax2, и выключение инверсией - это странно и ненадежно и неправильно. Потому что невозможно гарантировать, в каком действительно было состоянии, проверки-то нет.
Добавлено after 54 seconds:
Re: ATMEGA8A. Две кнопки, два реле. На катушках реле меандр. ???
вот у Demiurg выключение однозначное.
Добавлено after 54 seconds:
Re: ATMEGA8A. Две кнопки, два реле. На катушках реле меандр. ???
вот у Demiurg выключение однозначное.
- Реклама
- Сообщения: 567
- Зарегистрирован: Ср дек 19, 2012 12:16:22
Вы проверяете две кнопки, но включаете одну и туже катушку. Когда кнопка первая нажата то реле включается, а при проверке на вторую кнопку - -выключается. У вас опечатка банальная из-за копипаста
Тогда зачем второе реле, если на первом 2 кнопки - это ПУСК и СТОП ? И вообще - нафиг тут МК? Одного таймера - больше чем достаточно.
Что-то тут недоговорено. Вспоминаю соотв. эпизод из "Особенностей национальной рыбалки"
Что-то тут недоговорено. Вспоминаю соотв. эпизод из "Особенностей национальной рыбалки"
- Сообщения: 1492
- Зарегистрирован: Ср июн 25, 2008 15:19:44
alex1126 Нет. ТС не разобрался с битовыми операциями.
Код: Выделить всё
PORTC^=(1<<PC0); // вкл. клапан "газ.вода" // Инверсия. XOR
}
else
{
PORTC|=(1<<PC0); // выкл. клапан "газ.вода"
- Сообщения: 567
- Зарегистрирован: Ср дек 19, 2012 12:16:22
ааааа, я не тот исходник смотрел
но в нем тоже ошибка 
[uquote="Alax2",url="/forum/viewtopic.php?p=4313836#p4313836"]Возникла необходимость перепрошить контроллер газировального аппарата. Старая слетела. Опыт программирования AVR минимален. Поизучал немного, и взялся. И сразу затыка. Написал на СИ прг.- две кнопки управляют двумя реле (через оптопары). При проверке осциллографом на катушках реле (или на входах оптопары) МЕАНДР. Это вместо высокого уровня.
[/uquote]
Принципиальную схему и блок-схему алгоритма работы предоставьте, чтобы можно было вам помочь.
Принципиальную схему и блок-схему алгоритма работы предоставьте, чтобы можно было вам помочь.
- Сообщения: 1492
- Зарегистрирован: Ср июн 25, 2008 15:19:44
Уже решено. Тс применял неправильные битовые операции.



