AVR studio в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Видимо какой-то тип super void. Он не только не кладет данные в определенную область памяти возврата результата, но наоборот, забирает и оставляет после себя вакуум. После выполнения функции super void, следующая функция, возвращающая что-либо, по факту вернет void, тем самым компенсируя своим результатом возникший вакуум.
Изображение
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Желающие могут изучить, например, функцию int execve(const char *filename, char *const argv[], char *const envp[]); и что она делает в случае успеха.
ARV писал(а):ой, вот только не надо снова... если функция возвращает еще больше "ничего", чем просто void, это так и есть - лучше согласитесь, что бывают такие вот суперничегоневозвращающие функции, и все - иначе COKPOWEHEU выкушает все мозги у вас и у меня (я и так еще от прошлого раза не восстановился полностью).
Да ладно вам, я просто развлекался. :oops:
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 134
Зарегистрирован: Вс дек 28, 2008 18:07:28
Откуда: Москва

Сообщение Алексей bird »

чет вас понесло в какие то дали, нас тут более приземлённые вопросы интересуют. Например всё те же кнопки, опрос которых я тут выдумываю, вот код:

Код: Выделить всё

#include <avr/io.h>
#include <avr/interrupt.h>
#define RELE_5 PORTB3
#define BUTTON_4 PIND5
unsigned int flag_drebezg;
ISR (TIMER0_OVF_vect) 
{ 
if ((PIND & (1<<BUTTON_4))&&(flag_drebezg==1))
 flag_drebezg=0; //Флаг сбрасывается только при отжатой кнопке, т.е. при лог.1 на входе

int main(void)
TCCR0 = (1 << CS12)|(0 << CS11)|(1 << CS10); //делитель clk/1024
TIMSK |= (1 << TOIE0); // разрешение прерывания по переполнению таймера
sei(); // Разрешение прерываний
DDRB = 0xff; //Все пины B как выходы
PORTB = 0x00; //Во все пины B по нулям
DDRD = 0x00;	//Все пины D как входы

while(1)
	{
		if (~PIND & (1<<BUTTON_4))&&(flag_drebezg == 0)) //Компенсация дребезга и частого срабатывания
			
			((PORTB ^= (1<<RELE_3))&&(flag_drebezg=1));//включение реле, Флаг включен
	  }
	
	return 0;
}
как я думал разобрался, но нет, проблема осталась. Идея опроса кнопки такова: при нажатии кнопку, т.е. перевод её в лог.0, в основной функции происходит сравнение flag_drebezg, сброшен ли он и, если он равен нулю, то происходит включение реле и устанавливает это флаг в единицу. Таймер же, каждые 260мс проверяет отжатие кнопки, т.е. лог.1 и если она есть, то flag_drebezg сбрасывает и основная функция готова к новой обработке нажатия. Проблема в том, что участок в основном коде отрабатывается единожды и больше нет никакой реакции на нажатие кнопки, т.е. похоже flag_drebezg не сбрасывается в 0. Если же я убираю из участка if (~PIND & (1<<BUTTON_4))&&(flag_drebezg == 0)) выделенный фрагмент, то кнопка начинает почти норм отрабатывать, за исключением того, что требуется многократное нажатие на неё(иногда с одного раза срабатывает), причем время срабатывания её всегда разное, зависимости не выявил.
Симулятор же ведет себя совсем по другому, например, если кнопка зажата, то программа постоянно переключает ногу, в реале же, если я нажму и держу, о ничего не происходит.
Заранее спасибо!
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18707
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

первый вариант

Код: Выделить всё

#include <util/delay.h>
#define DEBOUNCE_DELAY_MS  20

uint8_t get_button_state(void){
   uint8_t tmp = !(PIND & _BV(BUTTON_4));
   _delay_ms(DEBOUNCE_DELAY_MS);
   return tmp & !(PIND & _BV(BUTTON_4));
}

// далее в нужном месте вызываете эту функцию: она вернет НЕ НОЛЬ, если кнопка нажата
второй вариант

Код: Выделить всё

volatile uint8_t btn = 0;

ISR(TIMER0_OVF_vect){
   btn = !(PIND & _BV(BUTTON_4));
}

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Самый простой опрос кнопки.

Код: Выделить всё

while(1){
  if( !(PIND & (1<<BUTTON_4)) ){
  //код
  }
  _delay_ms(100);
}
Еще акцентирую внимание на объявлении ARV переменной, используемой и в прерывании и основном цикле - она объявлена с модификатором volatile.
Реклама
Вымогатель припоя
Сообщения: 522
Зарегистрирован: Чт янв 21, 2016 15:59:10

Сообщение ozonn »

в некоторых проектах не вызываются функции delay_ms() и delay_us(), но вызываются _delay_ms() и _delay_us().
Кто-нибудь с таким сталкивался? Почему так?
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18707
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ozonn писал(а):Почему так?
потому что для WinAVR, а так же avr-gcc (т.е. для AVR Studio любых версий) "стандартными" функциями задержки являются именно _delay_ms и _delay_us, а для "компилятора" CodeVision стандартными считаются функции без первого нижнего подчеркивания.

внимание: не смотря на похожесть наименования и функционирования эти "функции" не взаимозаменяемы в некоторых случаях! это важно при "переводе" проектов из CVAVR в формат проектов студии - студийные функции могут корректно работать только с параметрами в виде констант! переменные в этом случае использовать нельзя.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Вымогатель припоя
Сообщения: 522
Зарегистрирован: Чт янв 21, 2016 15:59:10

Сообщение ozonn »

ARV писал(а):
ozonn писал(а):Почему так?
потому что для WinAVR, а так же avr-gcc (т.е. для AVR Studio любых версий) "стандартными" функциями задержки являются именно _delay_ms и _delay_us, а для "компилятора" CodeVision стандартными считаются функции без первого нижнего подчеркивания.

внимание: не смотря на похожесть наименования и функционирования эти "функции" не взаимозаменяемы в некоторых случаях! это важно при "переводе" проектов из CVAVR в формат проектов студии - студийные функции могут корректно работать только с параметрами в виде констант! переменные в этом случае использовать нельзя.
но у меня Atmel Studio 6.2, не CodeVision. Тем не менее, почему в одних проектах одни функции работают, в других другие?

Или можно на это плюнуть и пользоваться функциями с подчеркиванием? тем более, что они работают также, как и без подчеркивания
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18707
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ozonn писал(а):Тем не менее, почему в одних проектах одни функции работают, в других другие?
никогда не встречал.

но это возможно, если:
1. я не в курсе последних нововведений в libc avr-gcc (Atmel Toolchain)
2. в проекте присутствуют самописные функции без подчеркивания
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Вымогатель припоя
Сообщения: 522
Зарегистрирован: Чт янв 21, 2016 15:59:10

Сообщение ozonn »

ARV писал(а):
ozonn писал(а):Тем не менее, почему в одних проектах одни функции работают, в других другие?
никогда не встречал.

но это возможно, если:
1. я не в курсе последних нововведений в libc avr-gcc (Atmel Toolchain)
2. в проекте присутствуют самописные функции без подчеркивания
Toolchain один и тот же. У меня проект на атмеге32, стало не хватать портов, решил перейти на атмегу128, тем более, что она дешевле. Сделал новый проект и возникла такая, если можно так сказать, проблема :). Самописных функций никаких нет, поскольку я в него из старого еще ничего не перенес, просто собрал новую макетку на атмеге128 и просто проверил работоспособность портов. Выводил на них нули и единицы с задержкой. тут-то и возникли проблемы с вызовом функций задержки.

Но это ладно, раз фунции с подчеркиванием и есть "стандартные" то и заморачиваться не буду. Спасибо за консультацию.

Еще чисто теоретический вопрос: почему нельзя инклюдить файлы *.c ?
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18707
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ozonn писал(а):почему нельзя инклюдить файлы *.c
потому что парадигма языка Си подразумевает независимую компиляцию каждого исходника.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Инклюдить .c можно, но только если он не включен в файлы проекта. Иначе он будет скомпилирован не единожды, что приведёт к неприятным последствиям.
Иногда полезно подключить определённый .c-файл, в зависимости от каких либо настроек.
Контактная информация:
Вымогатель припоя
Сообщения: 522
Зарегистрирован: Чт янв 21, 2016 15:59:10

Сообщение ozonn »

впасибо за разъяснения :)
Родился
Сообщения: 5
Зарегистрирован: Пт май 13, 2011 18:45:36

Сообщение Kotэ »

В даташите (таймеры, CTC Mode) есть такая форума возвращающая частоту на выходе OCnA.

Изображение

Как ее переделать чтобы по известной частоте получить число для регистра OCRnA? Другими словами нужно генерировать нужную частоту таймером.
Вложения
CTC.png
(10.57 КБ) 657 скачиваний
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Kotэ, это Вам в школу, формулы "переделывать". Не знаю как сейчас, раньше в 5ом классе учили выражать переменные из формулы.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Вымогатель припоя
Сообщения: 522
Зарегистрирован: Чт янв 21, 2016 15:59:10

Сообщение ozonn »

Kotэ писал(а):В даташите (таймеры, CTC Mode) есть такая форума возвращающая частоту на выходе OCnA.

Изображение

Как ее переделать чтобы по известной частоте получить число для регистра OCRnA? Другими словами нужно генерировать нужную частоту таймером.
OCRnA = fclk/(2N*focna) - 1
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18707
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Аlex писал(а):Инклюдить .c можно, но
но не нужно. никогда не стоит соглашаться с отсуплением от общепринятых правил
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

ARV писал(а):никогда
Никогда не говорите "никогда" :))
Иногда можно, даже нужно. Я привёл пример ситуации, в которой не зазорно отступить от этих правил.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18707
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Аlex писал(а):Я привёл пример ситуации, в которой не зазорно отступить от этих правил
это вы про это:
Аlex писал(а):Иногда полезно подключить определённый .c-файл, в зависимости от каких либо настроек
?

ну так вообще-то мало-мальски удобная IDE обязательно имеет средства организации проектов, позволяющие собирать ту или иную target в зависимости от каких-то настроек... аналогичные действия можно делать и ручками, не отступая от де-факто правил, т.е. правя makefile (я плохо знаю этот путь, но мне кажется, что и в makefile есть средства вариантов сборки проекта из разного набора исходников)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

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

"Настройки" - это немного не то, что Вы подумали. Точнее я неправильно выразился. Настройки не IDE.
Я имел в виду настроки проекта в виде дефайнов. Задал/изменил некий дефайн (параметр), в код приинклюдился соответствующий .с- файл. К примеру,выбор драйвера дисплея. Драйверов может куча в папке лежать, а выбор за юзером, через дефайн.
Контактная информация:
Ответить

Вернуться в «AVR»