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

Дмитрий МВ

Участник
  • Постов

    93
  • Зарегистрирован

  • Посещение

Весь контент Дмитрий МВ


  1. int main(void) { port_ini(); timer_ini(); interrupt_ini(); sei(); while (1) { if (button_open) { flag_button_open = true; } if (button_close) { flag_button_close = true; } if (button_lgth && ~flag_button_lgth)//нажали кнопку и пока держим обработчик INT1_vect считает шаги { flag_button_lgth = true; open;// открываются ворота } if (~button_lgth && flag_button_lgth)//когда отпустили кнопку и проверяем что она была нажата ранее flag_button_lgth { eeprom_write_byte (2,step);//заносим длину ворот по адрессу 2 в память flag_button_lgth = false;//сбрасываем флаг } 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; } step_memory = eeprom_read_byte((const *)2); if (alarm || (step_memory == step)) { stop; step = 0; } И так, вот что имеем на данный момент. С логикой вроде все правильно. Проблема только с варнингами, не понимаю в чем дело, прошу помощи. #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 PORTD|= (1<<PIND7);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; bool flag_button_lgth; unsigned short i = 0; unsigned int massive_signal[10];//10 - ширина пачки сигнала unsigned int massive_open[10]; unsigned int massive_close[10]; unsigned char step = 0; //шаги длины ворот unsigned char step_memory = 0;//длина (шаги) из памяти #endif /* INCFILE1_H_ */ вот хедер файл
  2. теперь такая проблема. на приводе есть датчик холла с его помощью хочу считать длину ворот. завел на ногу внешних прерываний ISR(INT1_vect) { step++; } как поставить логику работы? if (button_lgth) { open; } есть кнопка которую нажав начнут открываться и считать шаги до отпускания. отпустив кнопку шаги (step) должны залететь в память, и потом сравниваться. если писать так if(~button_lght) {} то записываться будет каждый шаг когда кнопка будет отпущена, как быть?
  3. 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' вот так. понять не могу что хочет
  4. с этим у меня проблемы, согласен изучил но нужна постоянная практика, больше года не писал, многое забыл. уж извините, если бы был уверенным писакой то сюда бы наверное и не обращался
  5. чтобы обучать и записывать сигнал с пульта, по вашему записать шаблон все заводские устройства так и работают. вот все косяки #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 ушли
  6. Это как? На мониторе один файл .с и один .h Да точно, не внимательный был. Это где так? eeprom_write_block(название массива, адрес в памяти куда записать, размер массива в байтах) Да bool, вначале она объявлена значит равна нулю. Здесь она приравнивается к единице. Сравнить два массива.
  7. 1) почему dec а не def? В примерах на микроконтроллер везде пишут def. 2) согласен у меня размер массива 10, нужно внести изменения 3) размер в байтах? Спасибо внесу поправку
  8. извиняюсь за долгое отсутствие, долгий больничный, куча работы накопилось. вот набросок но куча варнингов, проблемы с записью и чтением из EEPROM. видимо я что то не понимаю.
  9. За что минус? Ну не разобрался как код вставлять.
  10. Добрый день. Хочу сделать привод для ворот. Имеется вот такой приемник и сигнал который он принимает. Микроконтроллер атмега 8. Предполагается использовать таймер для принятия сигнала, он будет отслеживать что приходит на ножку и заносить в массив, затем сохранять его и сравнивать в будущем. timer2_init{}; masive_signal[]; masive_open[]; masive_close[]; //PIND5 нога куда заведена антена //PIND2 нога записи сигнала открыть //PIND3 нога записи сигнала закрыть while(1) { int size = 10; //по сути ширина сигнала ISR(timer2_compa_vect) { int j = 0; masive_signal[j] = PIND5; j++; if(PIND2==1)//если нажата кнопка открыть { masive_open = new int ; //записываем сигнал как открыть for (int i = 0; i<size; i++) {masive_open = masive_signal;} //заносим в память EEPROM.write(0,masive_open); delet[]masive_open; } if(PIND3==1)//если нажата кнопка закрыть { masive_cloze = new int ; //записываем сигнал как открыть for (int i = 0; i<size; i++) {masive_cloze = masive_signal;} //заносим в память); EEPROM.write(1,masive_close); delet[]masive_cloze; } } if(masive_signal == masive_open) команда открыть; if(masive_signal == masive_close) комана закыть; Вот осциллограммы
  11. Иногда все проще. Усилители тоже можно купить, но почему то их строют дома на коленке и даже ламповые. Так и тут, интерес к строительству и созиданию.
  12. Да проект как хобби не более. Прошу модераторов закрыть тему!!!
  13. Есть вообще персональный компьютер где системный блок и монитор. Тогда зачем моноблок, ноутбук, планшет и т.д. зачем малинка и стольких разных модификаций . Подумай...
  14. Почему он должен обладать фичами? Почему ему не быть приставкой которой пока ещё нет. Возьмите Ардуино, там есть платы расширения возможностей. Камеры датчики и прочая лабуда. Почему бы не сделать подобную лабуду к малинке?
  15. Цель: собрать осциллограф приставку, например к raspberry, которая будет принимать 8бит отрисовывать и посылать на монитор без компьютера.
  16. Есть вариант купить такой за 2000₽, ваше мнение!? https://compacttool.ru/odnoplatniy-minikompyuter-cubieboard-3-cubietruck-tsd-version
  17. Вы серьёзно? Посмотрите на тип корпуса процессора это BGA а операционных усилителей и АЦП микросхем QFP! Разница огромная
  18. На ней буду пробовать. Выход есть hdmi на монитор, можно через переходник на vga. Будет интересно запилить интерфейс , расчёты , отрисовку.....
  19. Вообще не понятно , глядя на внутреннее устройство микросхемы, почему при присутствии на 5н пилы , так себя ведут выходы.
×
×
  • Создать...