Дмитрий МВ 0 16 сентября, 2023 Опубликовано 16 сентября, 2023 · Жалоба On 9/14/2023 at 11:46 AM, EdgeAligned said: зачем в нем нужна обработка кнопок? чтобы обучать и записывать сигнал с пульта, по вашему записать шаблон On 9/14/2023 at 3:13 PM, esaulenka said: должен нажимать примерно один раз в жизни устройства - когда меняет пульт. Насколько это надёжно работает - я не знаю. Скорее всего, не очень. все заводские устройства так и работают. вот все косяки #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 ушли Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 16 сентября, 2023 Опубликовано 16 сентября, 2023 (изменено) · Жалоба Не подключен файл string.h - нет #include <string.h> Слишком много аргументов в функции memcpy() - она требует только три агрумента - откуда копируется, куда копируется и сколько байт копируется. Аргумент '@' - лишний. Неверный второй по порядку аргумент в функциях eeprom_write_block и eeprom_read_block - это нужно смотреть файлы, в которых описаны эти функции и смотреть, какие аргументы они требуют. В макросах open; stop; стоит операция && вместо &. И они написаны с ошибкой. Вообще, вам очень настоятельно рекомендуется быть более внимательным и воообще изучить язык программирования Си и построение программ в целом. Пока что вы не делаете даже работу над ошибками. Без этого дальнейшие занятия бессмысленны - мартышкин труд. Изменено 16 сентября, 2023 пользователем EdgeAligned Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Дмитрий МВ 0 16 сентября, 2023 Опубликовано 16 сентября, 2023 · Жалоба 5 minutes ago, EdgeAligned said: быть более внимательным с этим у меня проблемы, согласен 6 minutes ago, EdgeAligned said: воообще изучить язык программирования Си и построение программ в целом изучил но нужна постоянная практика, больше года не писал, многое забыл. уж извините, если бы был уверенным писакой то сюда бы наверное и не обращался Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Дмитрий МВ 0 16 сентября, 2023 Опубликовано 16 сентября, 2023 (изменено) · Жалоба 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' вот так. понять не могу что хочет Изменено 16 сентября, 2023 пользователем Дмитрий МВ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 17 сентября, 2023 Опубликовано 17 сентября, 2023 · Жалоба Не хватает первой открывающейся скобки, вот этой ( #define stop (((PORTD&=~ (1<<PIND7)) && (PORTB&=~(1<<PINB0))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Дмитрий МВ 0 17 сентября, 2023 Опубликовано 17 сентября, 2023 · Жалоба 1 hour ago, EdgeAligned said: Не хватает первой открывающейся скобки, вот этой ( #define stop (((PORTD&=~ (1<<PIND7)) && (PORTB&=~(1<<PINB0))) Нет все там хватает Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlanDrakes 1 17 сентября, 2023 Опубликовано 17 сентября, 2023 · Жалоба Макрос пытается выполнить два действия с портами? Может в этом случае изменить его на однострочный? #define stop PORTD &=~(1<<PIND7); PORTB &= ~(1<<PINB0) В таком случае будет производиться подстановка, условно, двух команд. А та конструкция должна вызывать у компилятора вопрос "Тут же всегда будет TRUE. Оптимизировать, что ли?" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 17 сентября, 2023 Опубликовано 17 сентября, 2023 · Жалоба жесть Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Дмитрий МВ 0 18 сентября, 2023 Опубликовано 18 сентября, 2023 · Жалоба 18 hours ago, AlanDrakes said: Может в этом случае изменить его на однострочный? Логично, почему я не догадался? 18 hours ago, Arlleex said: жесть Что, где? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 18 сентября, 2023 Опубликовано 18 сентября, 2023 · Жалоба 23 минуты назад, Дмитрий МВ сказал: Что, где? В написании макросов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlanDrakes 1 18 сентября, 2023 Опубликовано 18 сентября, 2023 · Жалоба А ещё можно вызывать __INLINE__ функции. И даже функции описывать так же. Да в конце концов! static inline __attribute__((always_inline)) void stop(void) { PORTD &=~(1<<PIND7); PORTB &= ~(1<<PINB0); } И вызывать в коде "stop();". В результате на место вызова функици будет вставлено её развёрнутое тело - обе операции с портами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 18 сентября, 2023 Опубликовано 18 сентября, 2023 · Жалоба 1 час назад, AlanDrakes сказал: И вызывать в коде "stop();". В результате на место вызова функици будет вставлено её развёрнутое тело - обе операции с портами. always_inline тоже ничего не гарантирует Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Дмитрий МВ 0 23 сентября, 2023 Опубликовано 23 сентября, 2023 · Жалоба теперь такая проблема. на приводе есть датчик холла с его помощью хочу считать длину ворот. завел на ногу внешних прерываний ISR(INT1_vect) { step++; } как поставить логику работы? if (button_lgth) { open; } есть кнопка которую нажав начнут открываться и считать шаги до отпускания. отпустив кнопку шаги (step) должны залететь в память, и потом сравниваться. если писать так if(~button_lght) {} то записываться будет каждый шаг когда кнопка будет отпущена, как быть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 24 сентября, 2023 Опубликовано 24 сентября, 2023 · Жалоба када построив сложно предложение речи даже и программировать программу сложно логику работ тоже 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Дмитрий МВ 0 25 сентября, 2023 Опубликовано 25 сентября, 2023 · Жалоба Что не понятно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться