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

Помогите студенту-чайнику по МК


Рекомендуемые сообщения

И еще не забудь поставить задержку для защиты от дребезга .

вот я это и имею ввиду: прерывание по таймеру у меня срабатывает через 1/25, если я ставлю. задержку для кнопки скажем 0,2сек, то пока 1 обработчик будет ждать 0,2 сек, таймер уже выдаст несколько новых прерываний, вот они пропадут или в очередь встанут?

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Использовать внешние прерывание для кнопки не очень правильный путь.

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

Если кратко то так:

Запускаем таймер, в обработчике прерывания сканируем клавиатуру(кнопку), запоминая последние состояние и количество повторений одинаковых состояний, если одно и тот же состояние присутствует более 10 раз (зависит от частоты наступления прерывания) то принимается решение, что кнопка нажата.

Примерно так

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

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

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

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

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

ЗЫ: поставил делей 200мс и дребезг устранен.

Изменено пользователем NebelWefer
Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

тогда разрешите в прерывании таймера другие прерывания.

нет не так. опубликуйте код. Похоже у Вас ошибка в проектировании. Попробую помочь

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

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

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

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

пожалуйста, рад выслушать советы ибо только учусь кодить мк.

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.

Изменено пользователем NebelWefer
Ссылка на комментарий
Поделиться на другие сайты

появились вопросы

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. Имеет органы управления кнопка

итд

и вместе порассуждаем как лучше её решить

согласны?

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

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

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

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

пойду по порядку:

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

Изменено пользователем wowa
Ссылка на комментарий
Поделиться на другие сайты

И последний вопрос (надо было его задать в самом начале :D) какой чип используем?

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

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

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

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

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

1. Измерение частоты

2. Сравнение частоты с эталоном и формирование кода корекции

3. Индикация

4. Обслуживание клавиатуры.

5. Главный управляющий цикл

Задачи расположил в порядке приоритета выполнения

далее я бы расписал как эти части будут общаться между собой

1. По окончанию измерений выставляет флаг “измерение ON” и переменную со значением

2. По окончанию расчета выставляет флаг “расчет ON” и переменную с кодом коррекции

3. В памяти создан буфер последнего состояния и подпрограмма периодически из него обновляет индикацию

4. Периодический опрос с защитой от дребезга по окончанию выставляет флаг “кнопка нажата,отжата, нет нажатия” и код кнопки

5. Этот модуль как раз и будет получать все результаты от работы предыдущих частей и в зависимости от этих результатов формировать управляющие воздействие. Проектирование этого модуля пока отложим и займемся предыдущими.

Продолжение следует

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

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

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

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

Раз с контроллером мы определились, можно приступить к написанию частей нашей программы. Правда у меня где то в душе закралось, что размера ПЗУ выбранного контроллера может не хватить. В принципе есть два пути обойти это, либо перепрыгнуть на более старшую модель, либо перейти на ассемблер. Но попытка не пытка, поэтому продолжаем.

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

Существуют разные методики измерения, я предлагаю Вам, рассмотреть две из них

1. Подсчитать число импульсов за определенный интервал времени (потребуется два таймера)

2. Измерять период импульса (потребуется внешнее прерывание и 16 разрядный таймер)

Сможете сами реализовать?

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

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

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

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

хм..а почему прерывание по изменению состояния не точно? в принципе устройство то работает уже. Когда подаю сигнал от звукового генератора все просто отлично, а вот с гитарой немного похуже...больше колебаний сигнала, показания иногда скачут с высоких на низкие, но мне удалось настроить струну по своему тюнеру с точностью до 1 Гц)

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

по 1му: один таймер с большой частотой проверяет лог. уровень на входе и делает +1 в переменную когда нужно, а 2й таймер через определенное время читает эту переменную?

по 2му: разрешить внешнее прерывание на входе и как только оно получено запускать таймер, который будет проверять не пропала ли лог.1 с входа? Затем это время сохранять.

ЗЫ: забыл добавить, что кроме собственно мк есть еще предварительный каскад на транзисторе на входе для сигнала.

такой же как здесь:

Jesper tuner

Изменено пользователем NebelWefer
Ссылка на комментарий
Поделиться на другие сайты

хм..а почему прерывание по изменению состояния не точно?

Может я до конца не понял Ваш код, но из того что я Видел получается, что в момент обработки прерывания таймера у Вас будет блокировано внешнее прерывание которое и ведет подсчет входных импульсов, аж на 200 мили секунд.:rolleyes:

По первому варианту красивей было бы использовать аппаратную возможность таймер-счетчика "External Clock Source" (режим счета внешних импульсов), а в целом идею поняли правильно.

По второму варианту всё правильно, добавить нечего.

Если что то реализовали давайте посмотрим, что у Вас получилось.

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

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

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

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

Так и должно быть. Гитара - щипковый инструмент. Во время начального щипка в спектре сигнала присутствует огромное множество гармоник высших порядков. Тут нужен фильтр на входе. Конечно лучше посмотреть сигнал с гитары осциллографом, тогда все ясно станет.

Изменено пользователем Геннадий
Ссылка на комментарий
Поделиться на другие сайты

Может я до конца не понял Ваш код, но из того что я Видел получается, что в момент обработки прерывания таймера у Вас будет блокировано внешнее прерывание которое и ведет подсчет входных импульсов, аж на 200 мили секунд.:rolleyes:

только если кнопку нажимаю, а так задержка игнорируется.

if (PIND.6==0) ....

Пока ничего не реализовал, на неделе попробую если работой не загрузят сильно=)

Изменено пользователем NebelWefer
Ссылка на комментарий
Поделиться на другие сайты

Вопрос такой возник: вот 16разрядный счетчик содержит счет в 2х регистрах TCNT1H и TCNT1L. можно ли какой-нибудь переменной присвоить

unsigned int time;
time=TCNT1;  

?

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

Для IAR AVR допускается такая нотация. Компилятор сам "сгенирит" правильную последовательность обращение к регистрам и объединение данных. Для своего компилятора смотрите документацию.

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

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

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

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

В Asm вроде in rx,TCNT0L in ry,TCNT0H.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

Читайте полностью мой ответ!!!

Да в асме и чистом "СИ", то что я ответил, такое не возможно. Но компиляторы затачивают под конкретный контроллер, я специально указал IAR AVR, в документации к нему указано, что возможно запись/чтение сдвоенный регистров типа TCNT1(TCNT1L,TCNT1Н) из переменных типа "int", при этом компилятор всё правильно прочитает и разложит. Типа облегчение работы программиста :D.

Если Вы о классической нотации, то вот так:

typedef union 
{
WORD w;
BYTE b[2];
} TWOBYTEPACK ;
TWOBYTEPACK Dat;

И работать с Dat.w

Dat.b[0] - младший байт,

Dat.b[1] - старший байт.

//---------------------------------------------------------------------------------------------

могу написать еще три варианта как работать с TCNT1 и int на СИ

кто нибудь больше сможет??? :D

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

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

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

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

  • 2 недели спустя...

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

.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

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

  • 2 месяца спустя...

Здравствуйте, форумчане.

Помогите, пожалуйста, с задачей: соединить платы beagleboard с arduino nano через SPI интерфейс и отправить с одной на другую (и наоборот) короткую текстовую информацию. на данном этапе загрузил android на beagleboard и подготовил arduino. теперь планирую припаяться,а как не знаю.и что делать дальше? знания в этой области нулевые.всю информацию ищу в инете. помогите освоиться, пожалуйста.

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

  • 2 недели спустя...

Всем доброе время суток. У себя в городе увидел курсы по обучению программированию микроконтролеров. Подскажите - стоит ли на них записываться, нужные ли знания будут давать? Вот список их обещаний:

После обучения вы будете знать:

Язык программирования С.

Начинку микроконтроллеров, причём в подробностях

Принципы работы в среде разработки MPLab

Принципы работы в программе эмуляции PROTEUS

После обучения вы будете уметь:

Писать программы для микроконтроллера на языке C

Уверенно пользоваться средой разработки MPLab и средой эмуляции PROTEUS

Настраивать тактовый генератор.

Работать с портами ввода вывода

Программировать прерывания.

Использовать таймеры в различных режимах

Работать с модулем захвата и модулем сравнения

Использовать коммуникационные модули UART, I2C, SPI

Работать с АЦП.

И многое другое…

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

нужные ли знания будут давать?
Это Вас надо спросить - нужны ли Вам эти знания ? :)

А вообще, если есть желание и терпение, то можно и без курсов всё это освоить. Интернет и форум Вам в помощь! :)

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

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

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

>>или это "вчерашний день", а может то чему будут учить мало где применимо и вообще бесполезно

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

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

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

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

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

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

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