Страница 121 из 160
Re: AVR studio в вопросах и ответах
Добавлено: Чт сен 15, 2016 11:33:10
Z_h_e
Видимо какой-то тип
super void. Он не только не кладет данные в определенную область памяти возврата результата, но наоборот, забирает и оставляет после себя вакуум. После выполнения функции
super void, следующая функция, возвращающая что-либо, по факту вернет void, тем самым компенсируя своим результатом возникший вакуум.

Re: AVR studio в вопросах и ответах
Добавлено: Чт сен 15, 2016 16:20:18
COKPOWEHEU
Желающие могут изучить, например, функцию int execve(const char *filename, char *const argv[], char *const envp[]); и что она делает в случае успеха.
ARV писал(а):ой, вот только не надо снова... если функция возвращает еще больше "ничего", чем просто void, это так и есть - лучше согласитесь, что бывают такие вот суперничегоневозвращающие функции, и все - иначе COKPOWEHEU выкушает все мозги у вас и у меня (я и так еще от прошлого раза не восстановился полностью).
Да ладно вам, я просто развлекался.

Re: AVR studio в вопросах и ответах
Добавлено: Чт сен 15, 2016 20:26:35
Алексей 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)) выделенный фрагмент, то кнопка начинает почти норм отрабатывать, за исключением того, что требуется многократное нажатие на неё(иногда с одного раза срабатывает), причем время срабатывания её всегда разное, зависимости не выявил.
Симулятор же ведет себя совсем по другому, например, если кнопка зажата, то программа постоянно переключает ногу, в реале же, если я нажму и держу, о ничего не происходит.
Заранее спасибо!
Re: AVR studio в вопросах и ответах
Добавлено: Чт сен 15, 2016 20:49:54
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 мс
Re: AVR studio в вопросах и ответах
Добавлено: Чт сен 15, 2016 22:23:43
COKPOWEHEU
Самый простой опрос кнопки.
Код: Выделить всё
while(1){
if( !(PIND & (1<<BUTTON_4)) ){
//код
}
_delay_ms(100);
}
Еще акцентирую внимание на объявлении ARV переменной, используемой и в прерывании и основном цикле - она объявлена с модификатором volatile.
Re: AVR studio в вопросах и ответах
Добавлено: Вт окт 04, 2016 09:16:57
ozonn
в некоторых проектах не вызываются функции delay_ms() и delay_us(), но вызываются _delay_ms() и _delay_us().
Кто-нибудь с таким сталкивался? Почему так?
Re: AVR studio в вопросах и ответах
Добавлено: Вт окт 04, 2016 09:40:13
ARV
ozonn писал(а):Почему так?
потому что для WinAVR, а так же avr-gcc (т.е. для AVR Studio любых версий) "стандартными" функциями задержки являются именно _delay_ms и _delay_us, а для "компилятора" CodeVision стандартными считаются функции без первого нижнего подчеркивания.
внимание: не смотря на похожесть наименования и функционирования эти "функции" не взаимозаменяемы в некоторых случаях! это важно при "переводе" проектов из CVAVR в формат проектов студии - студийные функции могут корректно работать
только с параметрами в виде констант! переменные в этом случае использовать нельзя.
Re: AVR studio в вопросах и ответах
Добавлено: Вт окт 04, 2016 09:43:34
ozonn
ARV писал(а):ozonn писал(а):Почему так?
потому что для WinAVR, а так же avr-gcc (т.е. для AVR Studio любых версий) "стандартными" функциями задержки являются именно _delay_ms и _delay_us, а для "компилятора" CodeVision стандартными считаются функции без первого нижнего подчеркивания.
внимание: не смотря на похожесть наименования и функционирования эти "функции" не взаимозаменяемы в некоторых случаях! это важно при "переводе" проектов из CVAVR в формат проектов студии - студийные функции могут корректно работать
только с параметрами в виде констант! переменные в этом случае использовать нельзя.
но у меня Atmel Studio 6.2, не CodeVision. Тем не менее, почему в одних проектах одни функции работают, в других другие?
Или можно на это плюнуть и пользоваться функциями с подчеркиванием? тем более, что они работают также, как и без подчеркивания
Re: AVR studio в вопросах и ответах
Добавлено: Вт окт 04, 2016 09:48:48
ARV
ozonn писал(а):Тем не менее, почему в одних проектах одни функции работают, в других другие?
никогда не встречал.
но это возможно, если:
1. я не в курсе последних нововведений в libc avr-gcc (Atmel Toolchain)
2. в проекте присутствуют
самописные функции без подчеркивания
Re: AVR studio в вопросах и ответах
Добавлено: Вт окт 04, 2016 10:00:55
ozonn
ARV писал(а):ozonn писал(а):Тем не менее, почему в одних проектах одни функции работают, в других другие?
никогда не встречал.
но это возможно, если:
1. я не в курсе последних нововведений в libc avr-gcc (Atmel Toolchain)
2. в проекте присутствуют
самописные функции без подчеркивания
Toolchain один и тот же. У меня проект на атмеге32, стало не хватать портов, решил перейти на атмегу128, тем более, что она дешевле. Сделал новый проект и возникла такая, если можно так сказать, проблема

. Самописных функций никаких нет, поскольку я в него из старого еще ничего не перенес, просто собрал новую макетку на атмеге128 и просто проверил работоспособность портов. Выводил на них нули и единицы с задержкой. тут-то и возникли проблемы с вызовом функций задержки.
Но это ладно, раз фунции с подчеркиванием и есть "стандартные" то и заморачиваться не буду. Спасибо за консультацию.
Еще чисто теоретический вопрос: почему нельзя инклюдить файлы *.c ?
Re: AVR studio в вопросах и ответах
Добавлено: Вт окт 04, 2016 10:57:25
ARV
ozonn писал(а):почему нельзя инклюдить файлы *.c
потому что парадигма языка Си подразумевает независимую компиляцию каждого исходника.
Re: AVR studio в вопросах и ответах
Добавлено: Вт окт 04, 2016 11:20:52
Аlex
Инклюдить .c можно, но только если он не включен в файлы проекта. Иначе он будет скомпилирован не единожды, что приведёт к неприятным последствиям.
Иногда полезно подключить определённый .c-файл, в зависимости от каких либо настроек.
Re: AVR studio в вопросах и ответах
Добавлено: Вт окт 04, 2016 11:43:27
ozonn
впасибо за разъяснения

Re: AVR studio в вопросах и ответах
Добавлено: Вт окт 04, 2016 11:51:15
Kotэ
В даташите (таймеры, CTC Mode) есть такая форума возвращающая частоту на выходе OCnA.
Как ее переделать чтобы по известной частоте получить число для регистра OCRnA? Другими словами нужно генерировать нужную частоту таймером.
Re: AVR studio в вопросах и ответах
Добавлено: Вт окт 04, 2016 12:20:59
Z_h_e
Kotэ, это Вам в школу, формулы "переделывать". Не знаю как сейчас, раньше в 5ом классе учили выражать переменные из формулы.
Re: AVR studio в вопросах и ответах
Добавлено: Вт окт 04, 2016 12:26:58
ozonn
Kotэ писал(а):В даташите (таймеры, CTC Mode) есть такая форума возвращающая частоту на выходе OCnA.
Как ее переделать чтобы по известной частоте получить число для регистра OCRnA? Другими словами нужно генерировать нужную частоту таймером.
OCRnA = fclk/(2N*focna) - 1
Re: AVR studio в вопросах и ответах
Добавлено: Вт окт 04, 2016 13:32:03
ARV
Аlex писал(а):Инклюдить .c можно, но
но не нужно. никогда не стоит соглашаться с отсуплением от общепринятых правил
Re: AVR studio в вопросах и ответах
Добавлено: Вт окт 04, 2016 14:00:01
Аlex
ARV писал(а):никогда
Никогда не говорите "никогда"
Иногда можно, даже нужно. Я привёл пример ситуации, в которой не зазорно отступить от этих правил.
Re: AVR studio в вопросах и ответах
Добавлено: Вт окт 04, 2016 14:05:43
ARV
Аlex писал(а):Я привёл пример ситуации, в которой не зазорно отступить от этих правил
это вы про это:
Аlex писал(а):Иногда полезно подключить определённый .c-файл, в зависимости от каких либо настроек
?
ну так вообще-то мало-мальски удобная IDE обязательно имеет средства организации проектов, позволяющие собирать ту или иную target в зависимости от каких-то настроек... аналогичные действия можно делать и ручками, не отступая от де-факто правил, т.е. правя makefile (я плохо знаю этот путь, но мне кажется, что и в makefile есть средства вариантов сборки проекта из разного набора исходников)
Re: AVR studio в вопросах и ответах
Добавлено: Вт окт 04, 2016 14:12:20
Аlex
Возможно, Вы и правы, не буду спорить.
В любом случае, каждый будет поступать так, как ему удобно. Главное понимать что делаешь
"Настройки" - это немного не то, что Вы подумали. Точнее я неправильно выразился. Настройки не IDE.
Я имел в виду настроки проекта в виде дефайнов. Задал/изменил некий дефайн (параметр), в код приинклюдился соответствующий .с- файл. К примеру,выбор драйвера дисплея. Драйверов может куча в папке лежать, а выбор за юзером, через дефайн.