WinAvr в вопросах и ответах
- otmyavrozok
- Нашел транзистор. Понюхал.
- Сообщения: 195
- Зарегистрирован: Вт ноя 18, 2008 22:38:13
- Откуда: Я просто странник...
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
в некоторых случаях можно использовать такой метод "псевдопрерывания" по изменению состояния пина ЛЮБОГО порта. например, для прерывания по нажатию кнопки.
допустим, к PORTA у вас подключены 8 кнопок, прерывания по изменению уровня пина этого порта аппаратно не поддерживаются. вы хотите, чтобы МК спал все время, а при нажатии кнопки просыпался и обрабатывал ее. соединяете кнопки вместе, резистором подтягиваете их к земле или питанию и подключаете к INT0 (например, или к любому входу, инициирующему прерывание - ICP, вход компаратора и т.п.), в PORTА выводите все единички или нолики (это уж как вы впоследствии алгоритмом реализуете) - главное, чтобы уровень "подтяжки" кнопок (т.е. входа INT) был противоположным уровню на пинах PORTA. все, теперь можете усыплять МК.
что будет, если нажать любую кнопку? естественно, уровень с PORTA поступит на вход INT, что непременно сгенерирует прерывание, пробудит МК - вам останется только резво считать PINA, чтобы узнать, какая именно кнопка нажата - в соответствующем бите будет "не тот" уровень, что на остальных
по этому принципу работают практически все пульты ДУ - пока кнопки не нажаты, там все усыплено и практически не кушает батарейки
допустим, к PORTA у вас подключены 8 кнопок, прерывания по изменению уровня пина этого порта аппаратно не поддерживаются. вы хотите, чтобы МК спал все время, а при нажатии кнопки просыпался и обрабатывал ее. соединяете кнопки вместе, резистором подтягиваете их к земле или питанию и подключаете к INT0 (например, или к любому входу, инициирующему прерывание - ICP, вход компаратора и т.п.), в PORTА выводите все единички или нолики (это уж как вы впоследствии алгоритмом реализуете) - главное, чтобы уровень "подтяжки" кнопок (т.е. входа INT) был противоположным уровню на пинах PORTA. все, теперь можете усыплять МК.
что будет, если нажать любую кнопку? естественно, уровень с PORTA поступит на вход INT, что непременно сгенерирует прерывание, пробудит МК - вам останется только резво считать PINA, чтобы узнать, какая именно кнопка нажата - в соответствующем бите будет "не тот" уровень, что на остальных
по этому принципу работают практически все пульты ДУ - пока кнопки не нажаты, там все усыплено и практически не кушает батарейки
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- otmyavrozok
- Нашел транзистор. Понюхал.
- Сообщения: 195
- Зарегистрирован: Вт ноя 18, 2008 22:38:13
- Откуда: Я просто странник...
Уважаемые форумчане, знатоки WinAVR. Подскажите пожста почему в WinAVR в функции main не обрабатываются глобальные переменные. Попробовал откомпилировать в cvavr - там работает.
Вот этот код виснет при выполнении. Вроде ошибок нет. Может я чего-то де допонимаю. Компилировал в WinAVR-20090313 эмулировал в VMLAB.
#include <avr>
#include <util>
unsigned char a=0;
unsigned char b=0;
int main (void)
{ while(1)
{ if (++a>200) {a=0; b++;}
_delay_ms(1000);
}
}
Вот этот код виснет при выполнении. Вроде ошибок нет. Может я чего-то де допонимаю. Компилировал в WinAVR-20090313 эмулировал в VMLAB.
#include <avr>
#include <util>
unsigned char a=0;
unsigned char b=0;
int main (void)
{ while(1)
{ if (++a>200) {a=0; b++;}
_delay_ms(1000);
}
}
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
br.misha или Сергей69, а что приведенный вами код должен делать? если хорошо подумать - то ничего абсолютно! значения переменных а и b нигде никем не используются - значит, их содержимое нафиг никому не нужно, так зачем их вычислять вообще?!
вот компилятор и выбросил все бесполезное
если так хочется выполнять бесполезную работу - отключите оптимизацию WinAVR. или объявите эти переменные как volatile - об этом уже миллион раз говорилось.
вот компилятор и выбросил все бесполезное
если так хочется выполнять бесполезную работу - отключите оптимизацию WinAVR. или объявите эти переменные как volatile - об этом уже миллион раз говорилось.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
я вам ответил. единственный гарантированный способ заставить компилятор не выбрасывать то, что по его мнению лишнее (а он, как правило, не ошибается) - это объявить это volatile.Сергей69 писал(а):Программа изначально была в разы больше. Во всех функциях, в том числе и в прерывании нужные мне переменные вычислялись как и положено по условиям, но в главной функции программа на эти же переменные не обращала внимания.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
уж сколько раз твердили миру... читайте книжки, изучайте язык, которым пользуетесь...Сергей69 писал(а):не понял почему компилятор эти переменные считает лишними. В прерывании они тоже обрабатываются и в главной функции от их значения тоже должны выполняться определенные действия.
прерывание - это функция, про которую компилятор не может знать, будет ли она вызвана или нет. то есть с его точки зрения эта функция никогда не вызывается, т.е. лишняя. все, что делает лишняя функция - лишнее. переменные, которые она якобы изменяет, с точки зрения компилятора никогда не меняют своих значений. раз так - то и в главной функции поведение разных участков заранее известно, а другие никогда не будут исполняться. отсюда и выкидывание лишнего.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Здравствуйте Кошаки!!!
Я только начал изучать Си, до этого сидел на Асме.
Есть проблема и в Winavr и в AVRStudio, собственно она из-за компилятора, который выкидывает все задержки _delay_us() _delay_ms() из программы, что делать не знаю. WinAvr 20060421, но то же самое происходит и в других, оптимизацию ставил в 0 - не помагает. Ставил перед ними volatile - не помагает. Хотел,называется Си изучать Помогите пожалуйста!
Я только начал изучать Си, до этого сидел на Асме.
Есть проблема и в Winavr и в AVRStudio, собственно она из-за компилятора, который выкидывает все задержки _delay_us() _delay_ms() из программы, что делать не знаю. WinAvr 20060421, но то же самое происходит и в других, оптимизацию ставил в 0 - не помагает. Ставил перед ними volatile - не помагает. Хотел,называется Си изучать Помогите пожалуйста!
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
прежде всего: вы подключаете модуль avr/delay.h? затем: выводит ли компилятор какие-либо предупреждения?Kisik писал(а):Есть проблема и в Winavr и в AVRStudio, собственно она из-за компилятора, который выкидывает все задержки _delay_us() _delay_ms() из программы, что делать не знаю. WinAvr 20060421, но то же самое происходит и в других, оптимизацию ставил в 0 - не помагает. Ставил перед ними volatile - не помагает. Хотел,называется Си изучать Помогите пожалуйста!
смею вас заверить, что никогда такого не было, чтобы функции задержек выкидывались, и volatile к ним лепить незачем. для страховки установите свежую версию WinAVR, ваша на 3 года устарела.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
ARV писал(а):
смею вас заверить, что никогда такого не было, чтобы функции задержек выкидывались, и volatile к ним лепить незачем. для страховки установите свежую версию WinAVR, ваша на 3 года устарела.
К сожалению, изначально была установлена 20090313, из-за проблем я ставил остальные, результата - ноль. Задержки выкидываются во всех и в двух разных прогах, вторая чисто мигалка портом, и ничего более(чисто тест).Начинал я с выводом на LCD HD44780, когда он отказался работать(хотя до этого на асме проблем не было) прогнал в протусе, тот кричал, что команды и данные приходят при занятости контролллера индикатора, тогда я увеличивал задержки - никакого эффекта.В итоге написал маленькую прогу мигания светодиодами на порту - задержка была выкинута.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
перечислите, пожалуйста, проблемы.Kisik писал(а):К сожалению, изначально была установлена 20090313, из-за проблем я ставил остальные, результата - ноль.
что касается задержек - просто не могу поверить. уж не первый год пользуюсь WinAVR - всяко было, были и явные глюки компилятора, но чтобы задержки не отрабатывались - такого не было.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Synergetik
- Встал на лапы
- Сообщения: 117
- Зарегистрирован: Чт фев 28, 2008 23:54:35
- Откуда: Воскресенск, МО
- Контактная информация:
Здравствуйте!
Подскажите, пожалуйста, как бороться с ошибками "multiple definition"?
Лог там длинный, не хотел портить место.
Это повторяется для трёх функций, включая main и на различных версиях WinAVR (20060421, 20080610, 20090313).
Скрупулёзно проверил c-файл, а также подключаемые - больше объявлений этих функций нигде нет.
Первоисточник: http://www.rlocman.ru/shem/schematics.html?di=33473.
Подскажите, пожалуйста, как бороться с ошибками "multiple definition"?
Код: Выделить всё
C:/Temp/AVR/Projects/TouchSensor2/touchsensorv6.o: In function `sensor1':
C:\Temp\AVR\Projects\TouchSensor2/touchsensorv6.c:9: multiple definition of `sensor1'
touchsensorv6.o:C:\Temp\AVR\Projects\TouchSensor2/touchsensorv6.c:9: first defined here
Лог там длинный, не хотел портить место.
Это повторяется для трёх функций, включая main и на различных версиях WinAVR (20060421, 20080610, 20090313).
Скрупулёзно проверил c-файл, а также подключаемые - больше объявлений этих функций нигде нет.
Первоисточник: http://www.rlocman.ru/shem/schematics.html?di=33473.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
просто ради смеха собрал ваш проект для atmega32 - нет никаких ошибок. WinAVR-20090313. посмотрел код - и там ошибок нет.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Synergetik
- Встал на лапы
- Сообщения: 117
- Зарегистрирован: Чт фев 28, 2008 23:54:35
- Откуда: Воскресенск, МО
- Контактная информация:
ARV писал(а):просто ради смеха собрал ваш проект для atmega32 - нет никаких ошибок.
Я тоже ради смеха пересобрал проект и опля! Без ошибок, только пара предупреждений! Оказалось, вся проблема, как это часто бывает, в ошибке новичка - два раза подключил сишный файл - вот он и закономерно ругался. Спасибо за Вашу помощь - она резко ускорила процесс поиска ошибки. Хотя мне стыдно - должен был сам догадаться - достаточно было лишь более глубже вдуматься в процесс.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
не стыдно не знать, стыдно не учитьсяSynergetik писал(а):Хотя мне стыдно - должен был сам догадаться - достаточно было лишь более глубже вдуматься в процесс.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!