NebelWefer Опубликовано 24 августа, 2010 Поделиться Опубликовано 24 августа, 2010 И еще не забудь поставить задержку для защиты от дребезга . вот я это и имею ввиду: прерывание по таймеру у меня срабатывает через 1/25, если я ставлю. задержку для кнопки скажем 0,2сек, то пока 1 обработчик будет ждать 0,2 сек, таймер уже выдаст несколько новых прерываний, вот они пропадут или в очередь встанут? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
rtfcnf Опубликовано 24 августа, 2010 Поделиться Опубликовано 24 августа, 2010 (изменено) Использовать внешние прерывание для кнопки не очень правильный путь. Тема как читать состояние кнопок подымалась в под рублике "алгоритмы" да и других, несколько раз, попробуйте поискать. Если кратко то так: Запускаем таймер, в обработчике прерывания сканируем клавиатуру(кнопку), запоминая последние состояние и количество повторений одинаковых состояний, если одно и тот же состояние присутствует более 10 раз (зависит от частоты наступления прерывания) то принимается решение, что кнопка нажата. Примерно так Изменено 24 августа, 2010 пользователем rtfcnf 0 Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности за материальный, либо моральный ущерб причиненный данным сообщением напрямую или косвенно. Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
NebelWefer Опубликовано 24 августа, 2010 Поделиться Опубликовано 24 августа, 2010 (изменено) у меня не внешние прерывания, а по таймеру, таймер занимается основным алгоритмом и заодно кнопкой. Но вопрос о кнопке был побочный, его можно прикрыть) ЗЫ: поставил делей 200мс и дребезг устранен. Изменено 24 августа, 2010 пользователем NebelWefer 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Hongfa для различных применений в Компэл. Большой выбор в наличии!Компания HONGFA - это не только крупнейший в мире производитель электромеханических реле, но также производитель конденсаторов, вакуумных прерывателей, трансформаторов и низковольтного коммутационного оборудования. На складе КОМПЭЛ регулярно поддерживаются около 100 самых популярных позиций электромеханических реле. Реле Hongfa могут заместить многие изделия производства недоступных брендов. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
rtfcnf Опубликовано 24 августа, 2010 Поделиться Опубликовано 24 августа, 2010 (изменено) тогда разрешите в прерывании таймера другие прерывания. нет не так. опубликуйте код. Похоже у Вас ошибка в проектировании. Попробую помочь Изменено 24 августа, 2010 пользователем rtfcnf 0 Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности за материальный, либо моральный ущерб причиненный данным сообщением напрямую или косвенно. Ссылка на комментарий Поделиться на другие сайты Поделиться
Тренды и лучшие решения для разработки зарядных станций в РоссииК 2029 году в России прогнозируется увеличение числа зарядных станций до 40 000. При этом отечественный рынок электротранспорта имеет климатические, потребительские и географические особенности. Для успешной разработки и построения инфраструктуры станций заряда в России идеальным вариантом является использование решений и электронных компонентов китайских производителей – лидеров индустрии электротранспорта и возобновляемой энергетики, которые уже представлены в КОМПЭЛ. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
NebelWefer Опубликовано 24 августа, 2010 Поделиться Опубликовано 24 августа, 2010 (изменено) пожалуйста, рад выслушать советы ибо только учусь кодить мк. interrupt [TIM1_COMPA] void timer1_compa_isr(void) { // every 0.х sec //check freq; acumul+=freq; freq=0; if (count==7) { count=0; PORTD=0x00; if (acumul==0) {PORTD.5=1;return;} AlitLED(state); } else count++; if (PIND.6==0) { PORTA.0=0; PORTA.1=0; PORTB.7=0; #asm("nop"); #asm("nop"); state++; delay_ms(100); switch(state) { case 0:PORTA.0=1;break; case 1:PORTA.1=1;break; case 2:PORTA.1=1;PORTA.0=1;break; case 3:PORTB.7=1;break; case 4:PORTB.7=1;PORTA.0=1;break; case 5:PORTB.7=1;PORTA.1=1;state=-1;break; } } ; } общий смысл таков: есть прерывание по изменению сигнала на входе порта B - оно увеличивает значение freq на 1. по таймеру каждые 7 раз это значение аккумулируется( freq при этом сбрасывается в ноль) , на 8й раз оно округляется выдавая среднее значение частоты входного сигнала. если частота = 0 зажигается светодиод на PORTD.5 ( idle) если нет, то функция alitLED зажигает др. светодиоды. оставшиийся кусок-обработка кнопки. всего 6 состояний (6 струн) циклически их пееребираем. заажигаем соотв. индикацию. номер струны хранится в state. кст NOP наверно тут не нужен? после того как задержку ввел... ЗЫ: в моем случае мне не важны потерянные прерывания, ибо в их обработчиках нет смысла пока не установиться значение state. Изменено 24 августа, 2010 пользователем NebelWefer 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Секреты депассивации литиевых батареек FANSO EVE EnergyСамыми лучшими параметрами по энергоемкости, сроку хранения, температурному диапазону и номинальному напряжению обладают батарейки литий-тионилхлоридной электрохимической системы. Но при длительном хранении происходит процесс пассивации. Разберем в чем плюсы и минусы, как можно ее избежать или уменьшить последствия и как проводить депассивацию батареек на примере продукции и рекомендаций компании FANSO EVE Energy. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
rtfcnf Опубликовано 24 августа, 2010 Поделиться Опубликовано 24 августа, 2010 (изменено) появились вопросы freq - увиличиваеться в другом прерывании? count - используеться только "void timer1_compa_isr(void)" acumul - используеться только "void timer1_compa_isr(void)" AlitLED(state); - что за функция? имею виду код if (PIND.6==0) . . . Это обработчик нажатие на кнопку и зажигание светодиодов? delay_ms(100); - не понял смысл настройка таймера? жду ответа А лучше даже так. Давайте заново сформулируем задачу. Нам надо сделать контроллер который 1. Измеряет частоту в диапазоне (указать) 2. Имеет индикацию (указать) 3. Имеет органы управления кнопка итд и вместе порассуждаем как лучше её решить согласны? Изменено 24 августа, 2010 пользователем rtfcnf 0 Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности за материальный, либо моральный ущерб причиненный данным сообщением напрямую или косвенно. Ссылка на комментарий Поделиться на другие сайты Поделиться
NebelWefer Опубликовано 24 августа, 2010 Поделиться Опубликовано 24 августа, 2010 (изменено) пойду по порядку: 1) freq увеличивается в прерывании по изменению состояния на входе, на который идет сигнал, так получаем удвоенную частоту interrupt [PC_INT] void pin_change_isr0(void) { freq++; } 2) 3) count и acumul --глобальные (иначе как один обработчик узнает , что сделал другой?) 4) функция проверяет если частота дальше от нужного больше 10 Гц -зажигаем одно, если в пределах от 2-10 разница-зажигаем другое, если разница 0-1 Гц, то зажигаем 3е, ну и тоже самое в обе стороны (больше /меньше искомой частоты) void AlitLED(int num) { int tf; int r; tf=acumul*1.562; acumul=0; if (tf>=string[num]) //freq is above string { r=tf-string[num]; if (r<=1) {PORTD.2=1;}; //ok // if ((r>1)&&(r<=10)){PORTD.3=1;} //high if (r>10) {PORTD.4=1;} //too high } else { r=string[num]-tf; //freq is below string if (r<=1){PORTD.2=1;} //ok if ((r>1)&&(r<=10)){PORTD.1=1;} //low if (r>10) {PORTD.0=1;} //too low } } 5) if (PIND.6==0) -да, дальше обработка нажатия кнопки, delay_ms(100);- устранение дребезга контактов, без задержки на одно нажатие проскакиевает 3-4 переключения, а так 1. таймер на частоте 25 Гц. 6) Это проект-гитарный тюнер . дальше думаю все ясно). кнопкой выбираем нужную струну, в соответствии с этим программа подставляет в сравнение нужную частоту, и зажигает диоды "много больше/больше/равно/меньше/много меньше" ну а индикация струны -3 диода- бинарное число от 001 до 110 Изменено 25 августа, 2010 пользователем wowa 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
rtfcnf Опубликовано 25 августа, 2010 Поделиться Опубликовано 25 августа, 2010 И последний вопрос (надо было его задать в самом начале ) какой чип используем? 0 Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности за материальный, либо моральный ущерб причиненный данным сообщением напрямую или косвенно. Ссылка на комментарий Поделиться на другие сайты Поделиться
rtfcnf Опубликовано 25 августа, 2010 Поделиться Опубликовано 25 августа, 2010 (изменено) Из увиденного мною я считаю, что самая главная Ваша ошибка это то что части программы сильно зависят друг от друга. Я бы проектировал так что бы отдельные части программы могли работать самостоятельно и не зависели от других частей. Конкретно в Вашем случаи я бы разбил задачу на следующие подзадачи. 1. Измерение частоты 2. Сравнение частоты с эталоном и формирование кода корекции 3. Индикация 4. Обслуживание клавиатуры. 5. Главный управляющий цикл Задачи расположил в порядке приоритета выполнения далее я бы расписал как эти части будут общаться между собой 1. По окончанию измерений выставляет флаг “измерение ON” и переменную со значением 2. По окончанию расчета выставляет флаг “расчет ON” и переменную с кодом коррекции 3. В памяти создан буфер последнего состояния и подпрограмма периодически из него обновляет индикацию 4. Периодический опрос с защитой от дребезга по окончанию выставляет флаг “кнопка нажата,отжата, нет нажатия” и код кнопки 5. Этот модуль как раз и будет получать все результаты от работы предыдущих частей и в зависимости от этих результатов формировать управляющие воздействие. Проектирование этого модуля пока отложим и займемся предыдущими. Продолжение следует Изменено 25 августа, 2010 пользователем rtfcnf 0 Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности за материальный, либо моральный ущерб причиненный данным сообщением напрямую или косвенно. Ссылка на комментарий Поделиться на другие сайты Поделиться
NebelWefer Опубликовано 25 августа, 2010 Поделиться Опубликовано 25 августа, 2010 Чип Attiny2313V 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
rtfcnf Опубликовано 26 августа, 2010 Поделиться Опубликовано 26 августа, 2010 (изменено) Раз с контроллером мы определились, можно приступить к написанию частей нашей программы. Правда у меня где то в душе закралось, что размера ПЗУ выбранного контроллера может не хватить. В принципе есть два пути обойти это, либо перепрыгнуть на более старшую модель, либо перейти на ассемблер. Но попытка не пытка, поэтому продолжаем. Как, Вы, реализовать свой измеритель частоты делать нельзя, точность будет ни какая. Давайте перепишем код по более классическим алгоритмам. Существуют разные методики измерения, я предлагаю Вам, рассмотреть две из них 1. Подсчитать число импульсов за определенный интервал времени (потребуется два таймера) 2. Измерять период импульса (потребуется внешнее прерывание и 16 разрядный таймер) Сможете сами реализовать? Изменено 26 августа, 2010 пользователем rtfcnf 0 Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности за материальный, либо моральный ущерб причиненный данным сообщением напрямую или косвенно. Ссылка на комментарий Поделиться на другие сайты Поделиться
NebelWefer Опубликовано 26 августа, 2010 Поделиться Опубликовано 26 августа, 2010 (изменено) хм..а почему прерывание по изменению состояния не точно? в принципе устройство то работает уже. Когда подаю сигнал от звукового генератора все просто отлично, а вот с гитарой немного похуже...больше колебаний сигнала, показания иногда скачут с высоких на низкие, но мне удалось настроить струну по своему тюнеру с точностью до 1 Гц) Однако. прогу можно и переделать, благо мк это позволяет легко и быстро) по 1му: один таймер с большой частотой проверяет лог. уровень на входе и делает +1 в переменную когда нужно, а 2й таймер через определенное время читает эту переменную? по 2му: разрешить внешнее прерывание на входе и как только оно получено запускать таймер, который будет проверять не пропала ли лог.1 с входа? Затем это время сохранять. ЗЫ: забыл добавить, что кроме собственно мк есть еще предварительный каскад на транзисторе на входе для сигнала. такой же как здесь: Jesper tuner Изменено 27 августа, 2010 пользователем NebelWefer 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
rtfcnf Опубликовано 29 августа, 2010 Поделиться Опубликовано 29 августа, 2010 хм..а почему прерывание по изменению состояния не точно? Может я до конца не понял Ваш код, но из того что я Видел получается, что в момент обработки прерывания таймера у Вас будет блокировано внешнее прерывание которое и ведет подсчет входных импульсов, аж на 200 мили секунд. По первому варианту красивей было бы использовать аппаратную возможность таймер-счетчика "External Clock Source" (режим счета внешних импульсов), а в целом идею поняли правильно. По второму варианту всё правильно, добавить нечего. Если что то реализовали давайте посмотрим, что у Вас получилось. 0 Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности за материальный, либо моральный ущерб причиненный данным сообщением напрямую или косвенно. Ссылка на комментарий Поделиться на другие сайты Поделиться
Геннадий Опубликовано 29 августа, 2010 Поделиться Опубликовано 29 августа, 2010 (изменено) Когда подаю сигнал от звукового генератора все просто отлично, а вот с гитарой немного похуже...больше колебаний сигнала, показания иногда скачут с высоких на низкие... Так и должно быть. Гитара - щипковый инструмент. Во время начального щипка в спектре сигнала присутствует огромное множество гармоник высших порядков. Тут нужен фильтр на входе. Конечно лучше посмотреть сигнал с гитары осциллографом, тогда все ясно станет. Изменено 29 августа, 2010 пользователем Геннадий 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
NebelWefer Опубликовано 29 августа, 2010 Поделиться Опубликовано 29 августа, 2010 (изменено) Может я до конца не понял Ваш код, но из того что я Видел получается, что в момент обработки прерывания таймера у Вас будет блокировано внешнее прерывание которое и ведет подсчет входных импульсов, аж на 200 мили секунд. только если кнопку нажимаю, а так задержка игнорируется. if (PIND.6==0) .... Пока ничего не реализовал, на неделе попробую если работой не загрузят сильно=) Изменено 29 августа, 2010 пользователем NebelWefer 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
NebelWefer Опубликовано 5 сентября, 2010 Поделиться Опубликовано 5 сентября, 2010 Вопрос такой возник: вот 16разрядный счетчик содержит счет в 2х регистрах TCNT1H и TCNT1L. можно ли какой-нибудь переменной присвоить unsigned int time; time=TCNT1; ? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
rtfcnf Опубликовано 5 сентября, 2010 Поделиться Опубликовано 5 сентября, 2010 (изменено) Для IAR AVR допускается такая нотация. Компилятор сам "сгенирит" правильную последовательность обращение к регистрам и объединение данных. Для своего компилятора смотрите документацию. Изменено 5 сентября, 2010 пользователем rtfcnf 0 Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности за материальный, либо моральный ущерб причиненный данным сообщением напрямую или косвенно. Ссылка на комментарий Поделиться на другие сайты Поделиться
COKPOWEHEU Опубликовано 6 сентября, 2010 Поделиться Опубликовано 6 сентября, 2010 В Asm вроде in rx,TCNT0L in ry,TCNT0H. 0 Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз. Часть моих наработок. Ссылка на комментарий Поделиться на другие сайты Поделиться
rtfcnf Опубликовано 6 сентября, 2010 Поделиться Опубликовано 6 сентября, 2010 (изменено) Читайте полностью мой ответ!!! Да в асме и чистом "СИ", то что я ответил, такое не возможно. Но компиляторы затачивают под конкретный контроллер, я специально указал IAR AVR, в документации к нему указано, что возможно запись/чтение сдвоенный регистров типа TCNT1(TCNT1L,TCNT1Н) из переменных типа "int", при этом компилятор всё правильно прочитает и разложит. Типа облегчение работы программиста . Если Вы о классической нотации, то вот так: typedef union { WORD w; BYTE b[2]; } TWOBYTEPACK ; TWOBYTEPACK Dat; И работать с Dat.w Dat.b[0] - младший байт, Dat.b[1] - старший байт. //--------------------------------------------------------------------------------------------- могу написать еще три варианта как работать с TCNT1 и int на СИ кто нибудь больше сможет??? Изменено 6 сентября, 2010 пользователем rtfcnf 0 Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности за материальный, либо моральный ущерб причиненный данным сообщением напрямую или косвенно. Ссылка на комментарий Поделиться на другие сайты Поделиться
Junior Опубликовано 16 сентября, 2010 Поделиться Опубликовано 16 сентября, 2010 У меня такой вопрос к вам. Написал программу для светофора на зачет, суть такова, горит красный, к нему подключается желтый, затем оба гаснут и горит зеленный. Препод сказал вроде все правильно и добавил, вот мы с тобой прошьем контроллер твоей программой и если он не сгорит, то я поставлю тебе зачет. Посмотрите пожалуйста, нет ли ошибок у меня больше и будет ли все работать. Зачет завтра. .include "2313def.inc" .def temp=r16 ; Кнопка ldi temp, 0x00 out ddrb,temp ;Диоды ldi temp,0xFF out ddrd,temp main: ldi temp, 0x01 out portd, temp red: sbis pinb,0 rjmp red ldi temp, 0x03 out portd, temp yellow: sbic pinb,0 rjmp yellow ldi temp, 0x04 out portd, temp green: sbis pinb,0 rjmp green ldi temp, 0x06 out portd, temp yellow_grren: sbic pinb,0 rjmp yellow_grren ldi temp, 0x01 out portd, temp rjmp main 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
de_baks Опубликовано 6 декабря, 2010 Поделиться Опубликовано 6 декабря, 2010 Здравствуйте, форумчане. Помогите, пожалуйста, с задачей: соединить платы beagleboard с arduino nano через SPI интерфейс и отправить с одной на другую (и наоборот) короткую текстовую информацию. на данном этапе загрузил android на beagleboard и подготовил arduino. теперь планирую припаяться,а как не знаю.и что делать дальше? знания в этой области нулевые.всю информацию ищу в инете. помогите освоиться, пожалуйста. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Ambassador Опубликовано 21 декабря, 2010 Поделиться Опубликовано 21 декабря, 2010 Всем доброе время суток. У себя в городе увидел курсы по обучению программированию микроконтролеров. Подскажите - стоит ли на них записываться, нужные ли знания будут давать? Вот список их обещаний: После обучения вы будете знать: Язык программирования С. Начинку микроконтроллеров, причём в подробностях Принципы работы в среде разработки MPLab Принципы работы в программе эмуляции PROTEUS После обучения вы будете уметь: Писать программы для микроконтроллера на языке C Уверенно пользоваться средой разработки MPLab и средой эмуляции PROTEUS Настраивать тактовый генератор. Работать с портами ввода вывода Программировать прерывания. Использовать таймеры в различных режимах Работать с модулем захвата и модулем сравнения Использовать коммуникационные модули UART, I2C, SPI Работать с АЦП. И многое другое… 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 21 декабря, 2010 Поделиться Опубликовано 21 декабря, 2010 нужные ли знания будут давать?Это Вас надо спросить - нужны ли Вам эти знания ? А вообще, если есть желание и терпение, то можно и без курсов всё это освоить. Интернет и форум Вам в помощь! 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Ambassador Опубликовано 22 декабря, 2010 Поделиться Опубликовано 22 декабря, 2010 я имею ввиду нужны ли эти и прочее чему будут учить, в контексте необходимости и ценности... или это "вчерашний день", а может то чему будут учить мало где применимо и вообще бесполезно... просто цена курсов не маленькая... да и думал начало обучения положить на этих курсах, а остальное уже самому осваивать.... 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
rtfcnf Опубликовано 24 декабря, 2010 Поделиться Опубликовано 24 декабря, 2010 >>или это "вчерашний день", а может то чему будут учить мало где применимо и вообще бесполезно Всегда существуют задачи где использования "мощных" вычислительных систем просто экономически не выгодно, так что знания лишними не будут. 0 Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности за материальный, либо моральный ущерб причиненный данным сообщением напрямую или косвенно. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.