
AVR studio в вопросах и ответах
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: AVR studio в вопросах и ответах
Видимо какой-то тип super void. Он не только не кладет данные в определенную область памяти возврата результата, но наоборот, забирает и оставляет после себя вакуум. После выполнения функции super void, следующая функция, возвращающая что-либо, по факту вернет void, тем самым компенсируя своим результатом возникший вакуум.


- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: AVR studio в вопросах и ответах
Желающие могут изучить, например, функцию int execve(const char *filename, char *const argv[], char *const envp[]); и что она делает в случае успеха.

Да ладно вам, я просто развлекался.ARV писал(а):ой, вот только не надо снова... если функция возвращает еще больше "ничего", чем просто void, это так и есть - лучше согласитесь, что бывают такие вот суперничегоневозвращающие функции, и все - иначе COKPOWEHEU выкушает все мозги у вас и у меня (я и так еще от прошлого раза не восстановился полностью).
- Алексей bird
- Встал на лапы
- Сообщения: 134
- Зарегистрирован: Вс дек 28, 2008 18:07:28
- Откуда: Москва
Re: AVR studio в вопросах и ответах
чет вас понесло в какие то дали, нас тут более приземлённые вопросы интересуют. Например всё те же кнопки, опрос которых я тут выдумываю, вот код:
как я думал разобрался, но нет, проблема осталась. Идея опроса кнопки такова: при нажатии кнопку, т.е. перевод её в лог.0, в основной функции происходит сравнение flag_drebezg, сброшен ли он и, если он равен нулю, то происходит включение реле и устанавливает это флаг в единицу. Таймер же, каждые 260мс проверяет отжатие кнопки, т.е. лог.1 и если она есть, то flag_drebezg сбрасывает и основная функция готова к новой обработке нажатия. Проблема в том, что участок в основном коде отрабатывается единожды и больше нет никакой реакции на нажатие кнопки, т.е. похоже flag_drebezg не сбрасывается в 0. Если же я убираю из участка if (~PIND & (1<<BUTTON_4))&&(flag_drebezg == 0)) выделенный фрагмент, то кнопка начинает почти норм отрабатывать, за исключением того, что требуется многократное нажатие на неё(иногда с одного раза срабатывает), причем время срабатывания её всегда разное, зависимости не выявил.
Симулятор же ведет себя совсем по другому, например, если кнопка зажата, то программа постоянно переключает ногу, в реале же, если я нажму и держу, о ничего не происходит.
Заранее спасибо!
Код: Выделить всё
#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 в вопросах и ответах
вы либо опрашивайте кнопку с подавлением дребезга без прерываний, либо просто каждые 20-100 миллисекунд в прерывании. в последнем случае дребезг уже не будет влиять.
первый вариант
второй вариант
в примерах кода я написал только то, чего не хватало у вас, т.е. инклюды и константы остаются ваши, мои добавляются. разумеется, для второго примера таймер должен быть настроен на переполнение каждые 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 в вопросах и ответах
Самый простой опрос кнопки.
Еще акцентирую внимание на объявлении ARV переменной, используемой и в прерывании и основном цикле - она объявлена с модификатором volatile.
Код: Выделить всё
while(1){
if( !(PIND & (1<<BUTTON_4)) ){
//код
}
_delay_ms(100);
}Еще акцентирую внимание на объявлении ARV переменной, используемой и в прерывании и основном цикле - она объявлена с модификатором volatile.
Re: AVR studio в вопросах и ответах
в некоторых проектах не вызываются функции delay_ms() и delay_us(), но вызываются _delay_ms() и _delay_us().
Кто-нибудь с таким сталкивался? Почему так?
Кто-нибудь с таким сталкивался? Почему так?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: AVR studio в вопросах и ответах
потому что для WinAVR, а так же avr-gcc (т.е. для AVR Studio любых версий) "стандартными" функциями задержки являются именно _delay_ms и _delay_us, а для "компилятора" CodeVision стандартными считаются функции без первого нижнего подчеркивания.ozonn писал(а):Почему так?
внимание: не смотря на похожесть наименования и функционирования эти "функции" не взаимозаменяемы в некоторых случаях! это важно при "переводе" проектов из CVAVR в формат проектов студии - студийные функции могут корректно работать только с параметрами в виде констант! переменные в этом случае использовать нельзя.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: AVR studio в вопросах и ответах
ARV писал(а):потому что для WinAVR, а так же avr-gcc (т.е. для AVR Studio любых версий) "стандартными" функциями задержки являются именно _delay_ms и _delay_us, а для "компилятора" CodeVision стандартными считаются функции без первого нижнего подчеркивания.ozonn писал(а):Почему так?
внимание: не смотря на похожесть наименования и функционирования эти "функции" не взаимозаменяемы в некоторых случаях! это важно при "переводе" проектов из CVAVR в формат проектов студии - студийные функции могут корректно работать только с параметрами в виде констант! переменные в этом случае использовать нельзя.
но у меня Atmel Studio 6.2, не CodeVision. Тем не менее, почему в одних проектах одни функции работают, в других другие?
Или можно на это плюнуть и пользоваться функциями с подчеркиванием? тем более, что они работают также, как и без подчеркивания
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: AVR studio в вопросах и ответах
никогда не встречал.ozonn писал(а):Тем не менее, почему в одних проектах одни функции работают, в других другие?
но это возможно, если:
1. я не в курсе последних нововведений в libc avr-gcc (Atmel Toolchain)
2. в проекте присутствуют самописные функции без подчеркивания
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: AVR studio в вопросах и ответах
ARV писал(а):никогда не встречал.ozonn писал(а):Тем не менее, почему в одних проектах одни функции работают, в других другие?
но это возможно, если:
1. я не в курсе последних нововведений в libc avr-gcc (Atmel Toolchain)
2. в проекте присутствуют самописные функции без подчеркивания
Toolchain один и тот же. У меня проект на атмеге32, стало не хватать портов, решил перейти на атмегу128, тем более, что она дешевле. Сделал новый проект и возникла такая, если можно так сказать, проблема
Но это ладно, раз фунции с подчеркиванием и есть "стандартные" то и заморачиваться не буду. Спасибо за консультацию.
Еще чисто теоретический вопрос: почему нельзя инклюдить файлы *.c ?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: AVR studio в вопросах и ответах
потому что парадигма языка Си подразумевает независимую компиляцию каждого исходника.ozonn писал(а):почему нельзя инклюдить файлы *.c
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: AVR studio в вопросах и ответах
Инклюдить .c можно, но только если он не включен в файлы проекта. Иначе он будет скомпилирован не единожды, что приведёт к неприятным последствиям.
Иногда полезно подключить определённый .c-файл, в зависимости от каких либо настроек.
Иногда полезно подключить определённый .c-файл, в зависимости от каких либо настроек.
Re: AVR studio в вопросах и ответах
впасибо за разъяснения 
Re: AVR studio в вопросах и ответах
В даташите (таймеры, CTC Mode) есть такая форума возвращающая частоту на выходе OCnA.

Как ее переделать чтобы по известной частоте получить число для регистра OCRnA? Другими словами нужно генерировать нужную частоту таймером.
Как ее переделать чтобы по известной частоте получить число для регистра OCRnA? Другими словами нужно генерировать нужную частоту таймером.
- Вложения
-
- CTC.png
- (10.57 КБ) 652 скачивания
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: AVR studio в вопросах и ответах
Kotэ, это Вам в школу, формулы "переделывать". Не знаю как сейчас, раньше в 5ом классе учили выражать переменные из формулы.
Re: AVR studio в вопросах и ответах
Kotэ писал(а):В даташите (таймеры, CTC Mode) есть такая форума возвращающая частоту на выходе OCnA.
Как ее переделать чтобы по известной частоте получить число для регистра OCRnA? Другими словами нужно генерировать нужную частоту таймером.
OCRnA = fclk/(2N*focna) - 1
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: AVR studio в вопросах и ответах
но не нужно. никогда не стоит соглашаться с отсуплением от общепринятых правилАlex писал(а):Инклюдить .c можно, но
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: AVR studio в вопросах и ответах
Никогда не говорите "никогда"ARV писал(а):никогда
Иногда можно, даже нужно. Я привёл пример ситуации, в которой не зазорно отступить от этих правил.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: AVR studio в вопросах и ответах
это вы про это:Аlex писал(а):Я привёл пример ситуации, в которой не зазорно отступить от этих правил
?Аlex писал(а):Иногда полезно подключить определённый .c-файл, в зависимости от каких либо настроек
ну так вообще-то мало-мальски удобная IDE обязательно имеет средства организации проектов, позволяющие собирать ту или иную target в зависимости от каких-то настроек... аналогичные действия можно делать и ручками, не отступая от де-факто правил, т.е. правя makefile (я плохо знаю этот путь, но мне кажется, что и в makefile есть средства вариантов сборки проекта из разного набора исходников)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: AVR studio в вопросах и ответах
Возможно, Вы и правы, не буду спорить.
В любом случае, каждый будет поступать так, как ему удобно. Главное понимать что делаешь
"Настройки" - это немного не то, что Вы подумали. Точнее я неправильно выразился. Настройки не IDE.
Я имел в виду настроки проекта в виде дефайнов. Задал/изменил некий дефайн (параметр), в код приинклюдился соответствующий .с- файл. К примеру,выбор драйвера дисплея. Драйверов может куча в папке лежать, а выбор за юзером, через дефайн.
В любом случае, каждый будет поступать так, как ему удобно. Главное понимать что делаешь
"Настройки" - это немного не то, что Вы подумали. Точнее я неправильно выразился. Настройки не IDE.
Я имел в виду настроки проекта в виде дефайнов. Задал/изменил некий дефайн (параметр), в код приинклюдился соответствующий .с- файл. К примеру,выбор драйвера дисплея. Драйверов может куча в папке лежать, а выбор за юзером, через дефайн.
