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

Приемник радиосигнала, для ворот

On 9/14/2023 at 11:46 AM, EdgeAligned said:

зачем в нем нужна обработка кнопок?

чтобы обучать и записывать сигнал с пульта, по вашему записать шаблон

On 9/14/2023 at 3:13 PM, esaulenka said:

должен нажимать примерно один раз в жизни устройства - когда меняет пульт. Насколько это надёжно работает - я не знаю. Скорее всего, не очень.

все заводские устройства так и работают.

вот все косяки

scrin.gif

#include <avr/io.h>

#define F_CPU 1000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <avr/eeprom.h>
#include "main.h"
void port_ini (void)
{
	DDRD &=~ (1<<2)|(1<<3)|(1<<5)|(1<<6);  DDRD |= (1<<7);
	PORTD &=~ (1<<2)|(1<<3)|(1<<7);        PORTD |= (1<<5)|(1<<6);
	DDRB &=~ (1<<0)|(1<<7);                DDRB |= (1<<1);   
	PORTB &=~ (1<<0);                      PORTB |= (1<<1)|(1<<7);
	DDRC |= (1<<2)|(1<<3)|(1<<5);          PORTC &=~ (1<<2)|(1<<3)|(1<<5);
}
void timer_ini(void)
{
	TCCR1A = 0x00;
	TCCR1B |= (1<<WGM12)// устанавливаем режим СТС (сброс по совпадению)
	|(1<<CS10);            // делитель
	TCNT1 = 0x00;                    // Обнуляем счетный регистр
	OCR1A=833;                    // Настраиваем регистр сравнения 1000000/833=1200
	//CS12	CS11	CS10
	//0		0		0	нет тактирования
	//0		0		1	/1
	//0		1		0	/8
	//0		1		1	/64
	//1		0		0	/256
	//1		0		1	/1024
	//1		1		0	External clock source on T1 pin. Clock on falling edge.
	//1		1		1	1 External clock source on T1 pin. Clock on rising edge.
	
	// Разрешаем прерывание таймера по совпадению с OCR1A
	TIMSK |= (1<<OCIE1A);
}
//заносим в массив входящий сигнал
ISR (TIMER1_COMPA_vect)
{
	massive_signal[i]=data_input;
	i++;
}
int main(void)
{
	timer_ini();
	port_ini();
	sei();
    while (1) 
    {
		if (button_open) 
		{
			flag_button_open = true;
		}
		if (button_close) 
		{
			flag_button_close = true;
		}
		if (flag_button_open)
		{
			//копируем массив 
			memcpy(massive_open,massive_signal,'@',10);
			//заносим массив в память
			eeprom_write_block(massive_open,0,10);
			flag_button_open = false;
		}
		if (flag_button_close)
		{
			memcpy(massive_close,massive_signal,'@',10);
			eeprom_write_block(massive_close,1,10);
			flag_button_close = false;
		}
		unsigned int massive_open_memories[10];
		unsigned int massive_close_memories[10];
		eeprom_read_block(massive_open_memories, 0,10);
		eeprom_read_block(massive_close_memories, 1,10);
		if (memcmp (massive_open_memories, massive_signal, 10) == 0)//если массивы равны memcmp возвращает 0
		{
			open;
		}
		if (memcmp (massive_close_memories, massive_signal, 10) == 0)
		{
			close;
		}
		if (alarm)
		{
			stop;
		}
    }
}

вот как выглядит код сейчас

#ifndef MAIN_H_
#define MAIN_H_

#define data_input PIND2
#define step_input PIND3
#define button_lgth PINB7
#define button_close PIND5
#define button_open PIND6
#define open (PORTD|= (1<<PIND7))
#define alarm (PORTB|=(1<<PINB0))
#define close (open && (PORTB|= (1<<PINB1)))
#define stop ((PORTD&=~ (1<<PIND7)) && (PORTB&=~(1<<PINB0)))
#define blink_save_open PINC2
#define blink_save_close PINC3
#define blink_save_step PINC5

bool flag_button_open;
bool flag_button_close;
unsigned short i = 0;
unsigned int massive_signal[10];//10 - ширина пачки сигнала
unsigned int massive_open[10];
unsigned int massive_close[10];
#endif /* INCFILE1_H_ */

хедер файл

убрал @ в memcpy, eror ушли

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


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

Не подключен файл string.h - нет #include <string.h>

Слишком много аргументов в функции memcpy() - она требует только три агрумента - откуда копируется, куда копируется и сколько байт копируется. Аргумент '@' - лишний.

Неверный второй по порядку аргумент в функциях eeprom_write_block и eeprom_read_block - это нужно смотреть файлы, в которых описаны эти функции и смотреть, какие аргументы они требуют.

В макросах open; stop; стоит операция && вместо &. И они написаны с ошибкой.

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

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

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


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

5 minutes ago, EdgeAligned said:

быть более внимательным

с этим у меня проблемы, согласен

6 minutes ago, EdgeAligned said:

воообще изучить язык программирования Си и построение программ в целом

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

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


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

int main(void)
{
	timer_ini();
	port_ini();
	sei();
    while (1) 
    {
		if (button_open) 
		{
			flag_button_open = true;
		}
		if (button_close) 
		{
			flag_button_close = true;
		}
		if (flag_button_open)
		{
			//копируем массив 
			memcpy((void *)massive_open,(const void *)massive_signal,2);//куда копируем, что копируем(источник данных), обьем памяти
			//заносим массив в память
			eeprom_write_block((const void *)massive_open,(void *)0,2);//какой массив, адресс, обьем памяти
			flag_button_open = false;
		}
		if (flag_button_close)
		{
			memcpy((void *)massive_close,(const void *)massive_signal,2);
			eeprom_write_block((const void *)massive_close,(void *)1,2);
			flag_button_close = false;
		}
		unsigned int massive_open_memories[10];
		unsigned int massive_close_memories[10];
		eeprom_read_block((void *)massive_open_memories,(const void *) 0,2);//massive_open_memories куда пишем из памяти
													   //0 - адрес в EEPROM откуда ведем чтение
													   //2 - количество байт которое читаем
		eeprom_read_block((void *)massive_close_memories,(const void *) 1,2);
		if (memcmp ((void *)massive_open_memories, (const void *)massive_signal, 2) == 0)//если массивы равны memcmp возвращает 0
		{
			open;
		}
		if (memcmp ((void *)massive_close_memories, (const void *)massive_signal, 2) == 0)
		{
			close;
		}
		if (alarm)
		{
			stop;
		}
    }
}

вот так ругается только на 'stop'

in expansion of macro 'stop' вот так. понять не могу что хочет

Изменено пользователем Дмитрий МВ

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


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

Не хватает первой открывающейся скобки, вот этой (
#define stop (((PORTD&=~ (1<<PIND7)) && (PORTB&=~(1<<PINB0)))

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


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

1 hour ago, EdgeAligned said:
Не хватает первой открывающейся скобки, вот этой (
#define stop (((PORTD&=~ (1<<PIND7)) && (PORTB&=~(1<<PINB0)))

Нет все там хватает

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


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

Макрос пытается выполнить два действия с портами? Может в этом случае изменить его на однострочный?

	#define stop PORTD &=~(1<<PIND7); PORTB &= ~(1<<PINB0)
	

В таком случае будет производиться подстановка, условно, двух команд. А та конструкция должна вызывать у компилятора вопрос "Тут же всегда будет TRUE. Оптимизировать, что ли?"

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


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

18 hours ago, AlanDrakes said:

Может в этом случае изменить его на однострочный?

Логично, почему я не догадался?

18 hours ago, Arlleex said:

жесть

Что, где?

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


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

А ещё можно вызывать __INLINE__ функции. И даже функции описывать так же.

Да в конце концов!

static inline __attribute__((always_inline)) void stop(void) {
	PORTD &=~(1<<PIND7);
	PORTB &= ~(1<<PINB0);
	}
	

И вызывать в коде "stop();". В результате на место вызова функици будет вставлено её развёрнутое тело - обе операции с портами.

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


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

1 час назад, AlanDrakes сказал:

И вызывать в коде "stop();". В результате на место вызова функици будет вставлено её развёрнутое тело - обе операции с портами.

always_inline тоже ничего не гарантирует:wink:

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


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

теперь такая проблема. на приводе есть датчик холла с его помощью хочу считать длину ворот. завел на ногу внешних прерываний

ISR(INT1_vect)
{
	step++;
}

как поставить логику работы? 

if (button_lgth)
{
	open;
}

есть кнопка которую нажав начнут открываться и считать шаги до отпускания. 

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

если писать так 

if(~button_lght)
{}

то записываться будет каждый шаг когда кнопка будет отпущена, как быть?

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


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

када построив сложно предложение речи даже и программировать программу сложно логику работ тоже

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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