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

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

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

Сообщение Z_h_e »

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

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

Сообщение COKPOWEHEU »

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

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

Сообщение Алексей 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
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение 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 мс
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

Сообщение COKPOWEHEU »

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

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

while(1){
  if( !(PIND & (1<<BUTTON_4)) ){
  //код
  }
  _delay_ms(100);
}

Еще акцентирую внимание на объявлении ARV переменной, используемой и в прерывании и основном цикле - она объявлена с модификатором volatile.
ozonn
Вымогатель припоя
Сообщения: 522
Зарегистрирован: Чт янв 21, 2016 15:59:10

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

Сообщение ozonn »

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

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

Сообщение ARV »

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

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

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

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

Сообщение ozonn »

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

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

но у меня Atmel Studio 6.2, не CodeVision. Тем не менее, почему в одних проектах одни функции работают, в других другие?

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

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

Сообщение ARV »

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

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

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

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

Сообщение ozonn »

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

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

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

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

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

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

Сообщение ARV »

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

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

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

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

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

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

Сообщение ozonn »

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

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

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

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

Изображение

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

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

Сообщение Z_h_e »

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

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

Сообщение ozonn »

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

Изображение

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


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

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

Сообщение ARV »

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

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

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

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

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

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

Сообщение ARV »

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

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

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

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

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

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

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

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