WinAvr в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
otmyavrozok
Нашел транзистор. Понюхал.
Сообщения: 195
Зарегистрирован: Вт ноя 18, 2008 22:38:13
Откуда: Я просто странник...

Сообщение otmyavrozok »

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

Сообщение ARV »

в некоторых случаях можно использовать такой метод "псевдопрерывания" по изменению состояния пина ЛЮБОГО порта. например, для прерывания по нажатию кнопки.

допустим, к PORTA у вас подключены 8 кнопок, прерывания по изменению уровня пина этого порта аппаратно не поддерживаются. вы хотите, чтобы МК спал все время, а при нажатии кнопки просыпался и обрабатывал ее. соединяете кнопки вместе, резистором подтягиваете их к земле или питанию и подключаете к INT0 (например, или к любому входу, инициирующему прерывание - ICP, вход компаратора и т.п.), в PORTА выводите все единички или нолики (это уж как вы впоследствии алгоритмом реализуете) - главное, чтобы уровень "подтяжки" кнопок (т.е. входа INT) был противоположным уровню на пинах PORTA. все, теперь можете усыплять МК.

что будет, если нажать любую кнопку? естественно, уровень с PORTA поступит на вход INT, что непременно сгенерирует прерывание, пробудит МК - вам останется только резво считать PINA, чтобы узнать, какая именно кнопка нажата - в соответствующем бите будет "не тот" уровень, что на остальных :)))

по этому принципу работают практически все пульты ДУ - пока кнопки не нажаты, там все усыплено и практически не кушает батарейки :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
otmyavrozok
Нашел транзистор. Понюхал.
Сообщения: 195
Зарегистрирован: Вт ноя 18, 2008 22:38:13
Откуда: Я просто странник...

Сообщение otmyavrozok »

В этом девайсе одна из задач МК-отслеживание состояния 8 информационных линий,для определения аварийных состояний,также матрица кнопок и индикация,в авторском варианте,аварию во время работы с кнопками МК пропускает,попробую включить другой МК,чтоб за шиной следил.
Сергей69
Родился
Сообщения: 5
Зарегистрирован: Вт июл 14, 2009 11:45:37

Сообщение Сергей69 »

Уважаемые форумчане, знатоки 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);
}
}
Аватара пользователя
br.misha
Родился
Сообщения: 12
Зарегистрирован: Пн мар 31, 2008 13:23:08
Контактная информация:

Сообщение br.misha »

#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
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

br.misha или Сергей69, а что приведенный вами код должен делать? если хорошо подумать - то ничего абсолютно! значения переменных а и b нигде никем не используются - значит, их содержимое нафиг никому не нужно, так зачем их вычислять вообще?!

вот компилятор и выбросил все бесполезное :)

если так хочется выполнять бесполезную работу - отключите оптимизацию WinAVR. или объявите эти переменные как volatile - об этом уже миллион раз говорилось.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Сергей69
Родился
Сообщения: 5
Зарегистрирован: Вт июл 14, 2009 11:45:37

Сообщение Сергей69 »

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

Сообщение ARV »

Сергей69 писал(а):Программа изначально была в разы больше. Во всех функциях, в том числе и в прерывании нужные мне переменные вычислялись как и положено по условиям, но в главной функции программа на эти же переменные не обращала внимания.
я вам ответил. единственный гарантированный способ заставить компилятор не выбрасывать то, что по его мнению лишнее (а он, как правило, не ошибается) - это объявить это volatile.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Сергей69
Родился
Сообщения: 5
Зарегистрирован: Вт июл 14, 2009 11:45:37

Сообщение Сергей69 »

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

Сообщение ARV »

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

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

Мой уютный бложик... заходите!
Сергей69
Родился
Сообщения: 5
Зарегистрирован: Вт июл 14, 2009 11:45:37

Сообщение Сергей69 »

Спасибо большое. Теперь понял. :))
Аватара пользователя
Kisik
Родился
Сообщения: 10
Зарегистрирован: Пт июл 17, 2009 10:26:33

Сообщение Kisik »

Здравствуйте Кошаки!!!

Я только начал изучать Си, до этого сидел на Асме.
Есть проблема и в Winavr и в AVRStudio, собственно она из-за компилятора, который выкидывает все задержки _delay_us() _delay_ms() из программы, что делать не знаю. WinAvr 20060421, но то же самое происходит и в других, оптимизацию ставил в 0 - не помагает. Ставил перед ними volatile - не помагает. Хотел,называется Си изучать Помогите пожалуйста! :cry:
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

Kisik писал(а):Есть проблема и в Winavr и в AVRStudio, собственно она из-за компилятора, который выкидывает все задержки _delay_us() _delay_ms() из программы, что делать не знаю. WinAvr 20060421, но то же самое происходит и в других, оптимизацию ставил в 0 - не помагает. Ставил перед ними volatile - не помагает. Хотел,называется Си изучать Помогите пожалуйста! :cry:
прежде всего: вы подключаете модуль avr/delay.h? затем: выводит ли компилятор какие-либо предупреждения?

смею вас заверить, что никогда такого не было, чтобы функции задержек выкидывались, и volatile к ним лепить незачем. для страховки установите свежую версию WinAVR, ваша на 3 года устарела.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Kisik
Родился
Сообщения: 10
Зарегистрирован: Пт июл 17, 2009 10:26:33

Сообщение Kisik »

ARV писал(а):
смею вас заверить, что никогда такого не было, чтобы функции задержек выкидывались, и volatile к ним лепить незачем. для страховки установите свежую версию WinAVR, ваша на 3 года устарела.

К сожалению, изначально была установлена 20090313, из-за проблем я ставил остальные, результата - ноль. Задержки выкидываются во всех и в двух разных прогах, вторая чисто мигалка портом, и ничего более(чисто тест).Начинал я с выводом на LCD HD44780, когда он отказался работать(хотя до этого на асме проблем не было) прогнал в протусе, тот кричал, что команды и данные приходят при занятости контролллера индикатора, тогда я увеличивал задержки - никакого эффекта.В итоге написал маленькую прогу мигания светодиодами на порту - задержка была выкинута.
Сергей69
Родился
Сообщения: 5
Зарегистрирован: Вт июл 14, 2009 11:45:37

Сообщение Сергей69 »

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

Сообщение ARV »

Kisik писал(а):К сожалению, изначально была установлена 20090313, из-за проблем я ставил остальные, результата - ноль.
перечислите, пожалуйста, проблемы.

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

Мой уютный бложик... заходите!
Аватара пользователя
Synergetik
Встал на лапы
Сообщения: 117
Зарегистрирован: Чт фев 28, 2008 23:54:35
Откуда: Воскресенск, МО
Контактная информация:

Сообщение Synergetik »

Здравствуйте!

Подскажите, пожалуйста, как бороться с ошибками "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
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

просто ради смеха собрал ваш проект для atmega32 - нет никаких ошибок. WinAVR-20090313. посмотрел код - и там ошибок нет.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Synergetik
Встал на лапы
Сообщения: 117
Зарегистрирован: Чт фев 28, 2008 23:54:35
Откуда: Воскресенск, МО
Контактная информация:

Сообщение Synergetik »

ARV писал(а):просто ради смеха собрал ваш проект для atmega32 - нет никаких ошибок.

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

Сообщение ARV »

Synergetik писал(а):Хотя мне стыдно - должен был сам догадаться - достаточно было лишь более глубже вдуматься в процесс.
не стыдно не знать, стыдно не учиться
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Ответить

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