Страница 17 из 111
Добавлено: Пт июл 03, 2009 01:00:01
otmyavrozok
Понял,я уже думал,с даташитом разобраться не могу

обойдусь тупым опросом портов,в оригинальной версии прерывание было внешнее...
Добавлено: Пт июл 03, 2009 08:01:40
ARV
в некоторых случаях можно использовать такой метод "псевдопрерывания" по изменению состояния пина
ЛЮБОГО порта. например, для прерывания по нажатию кнопки.
допустим, к
PORTA у вас подключены 8 кнопок, прерывания по изменению уровня пина этого порта
аппаратно не поддерживаются. вы хотите, чтобы МК спал все время, а при нажатии кнопки просыпался и обрабатывал ее. соединяете кнопки вместе, резистором подтягиваете их к земле или питанию и подключаете к
INT0 (например, или к любому входу, инициирующему прерывание -
ICP, вход компаратора и т.п.), в
PORTА выводите все единички или нолики (это уж как вы впоследствии алгоритмом реализуете) - главное, чтобы уровень "подтяжки" кнопок (т.е. входа
INT) был противоположным уровню на пинах
PORTA. все, теперь можете усыплять МК.
что будет, если нажать любую кнопку? естественно, уровень с
PORTA поступит на вход
INT, что непременно сгенерирует прерывание, пробудит МК - вам останется только резво считать
PINA, чтобы узнать, какая именно кнопка нажата - в соответствующем бите будет "не тот" уровень, что на остальных
по этому принципу работают практически все пульты ДУ - пока кнопки не нажаты, там все усыплено и практически не кушает батарейки

Добавлено: Сб июл 04, 2009 00:37:29
otmyavrozok
В этом девайсе одна из задач МК-отслеживание состояния 8 информационных линий,для определения аварийных состояний,также матрица кнопок и индикация,в авторском варианте,аварию во время работы с кнопками МК пропускает,попробую включить другой МК,чтоб за шиной следил.
Добавлено: Вт июл 14, 2009 12:20:19
Сергей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);
}
}
Добавлено: Вт июл 14, 2009 12:28:12
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);
}
}
Добавлено: Вт июл 14, 2009 14:00:45
ARV
br.misha или
Сергей69, а что приведенный вами код должен делать? если хорошо подумать - то ничего абсолютно! значения переменных
а и
b нигде никем не используются - значит, их содержимое нафиг никому не нужно, так зачем их вычислять вообще?!
вот компилятор и выбросил все бесполезное
если так хочется выполнять бесполезную работу - отключите оптимизацию WinAVR. или объявите эти переменные как
volatile - об этом уже миллион раз говорилось.
Добавлено: Вт июл 14, 2009 16:14:56
Сергей69
Программа изначально была в разы больше. Во всех функциях, в том числе и в прерывании нужные мне переменные вычислялись как и положено по условиям, но в главной функции программа на эти же переменные не обращала внимания.
Добавлено: Вт июл 14, 2009 19:33:46
ARV
Сергей69 писал(а):Программа изначально была в разы больше. Во всех функциях, в том числе и в прерывании нужные мне переменные вычислялись как и положено по условиям, но в главной функции программа на эти же переменные не обращала внимания.
я вам ответил. единственный гарантированный способ заставить компилятор не выбрасывать то, что по его мнению лишнее (а он, как правило, не ошибается) - это объявить это
volatile.
Добавлено: Ср июл 15, 2009 15:27:08
Сергей69
Спасибо, вроде работает.

Правда не понял почему компилятор эти переменные считает лишними. В прерывании они тоже обрабатываются и в главной функции от их значения тоже должны выполняться определенные действия.
Добавлено: Ср июл 15, 2009 15:31:24
ARV
Сергей69 писал(а):не понял почему компилятор эти переменные считает лишними. В прерывании они тоже обрабатываются и в главной функции от их значения тоже должны выполняться определенные действия.
уж сколько раз твердили миру...
читайте книжки, изучайте язык, которым пользуетесь...
прерывание - это функция, про которую компилятор не может знать, будет ли она вызвана или нет. то есть с его точки зрения эта функция никогда не вызывается, т.е. лишняя. все, что делает лишняя функция - лишнее. переменные, которые она якобы изменяет, с точки зрения компилятора никогда не меняют своих значений. раз так - то и в главной функции поведение разных участков заранее известно, а другие никогда не будут исполняться. отсюда и выкидывание лишнего.
Добавлено: Ср июл 15, 2009 15:47:21
Сергей69
Спасибо большое. Теперь понял.

Добавлено: Пт июл 17, 2009 17:13:29
Kisik
Здравствуйте Кошаки!!!
Я только начал изучать Си, до этого сидел на Асме.
Есть проблема и в Winavr и в AVRStudio, собственно она из-за компилятора, который выкидывает все задержки _delay_us() _delay_ms() из программы, что делать не знаю. WinAvr 20060421, но то же самое происходит и в других, оптимизацию ставил в 0 - не помагает. Ставил перед ними volatile - не помагает. Хотел,называется Си изучать Помогите пожалуйста!

Добавлено: Пт июл 17, 2009 20:25:35
ARV
Kisik писал(а):Есть проблема и в Winavr и в AVRStudio, собственно она из-за компилятора, который выкидывает все задержки _delay_us() _delay_ms() из программы, что делать не знаю. WinAvr 20060421, но то же самое происходит и в других, оптимизацию ставил в 0 - не помагает. Ставил перед ними volatile - не помагает. Хотел,называется Си изучать Помогите пожалуйста!

прежде всего: вы подключаете модуль
avr/delay.h? затем: выводит ли компилятор какие-либо предупреждения?
смею вас заверить, что никогда такого не было, чтобы функции задержек выкидывались, и
volatile к ним лепить незачем. для страховки установите свежую версию
WinAVR, ваша на 3 года устарела.
Добавлено: Пт июл 17, 2009 23:43:34
Kisik
ARV писал(а):
смею вас заверить, что никогда такого не было, чтобы функции задержек выкидывались, и volatile к ним лепить незачем. для страховки установите свежую версию WinAVR, ваша на 3 года устарела.
К сожалению, изначально была установлена 20090313, из-за проблем я ставил остальные, результата - ноль. Задержки выкидываются во всех и в двух разных прогах, вторая чисто мигалка портом, и ничего более(чисто тест).Начинал я с выводом на LCD HD44780, когда он отказался работать(хотя до этого на асме проблем не было) прогнал в протусе, тот кричал, что команды и данные приходят при занятости контролллера индикатора, тогда я увеличивал задержки - никакого эффекта.В итоге написал маленькую прогу мигания светодиодами на порту - задержка была выкинута.
Добавлено: Сб июл 18, 2009 09:36:50
Сергей69
Приведи текст этой маленькой программы.
Добавлено: Сб июл 18, 2009 19:44:02
ARV
Kisik писал(а):К сожалению, изначально была установлена 20090313, из-за проблем я ставил остальные, результата - ноль.
перечислите, пожалуйста, проблемы.
что касается задержек - просто не могу поверить. уж не первый год пользуюсь
WinAVR - всяко было, были и явные глюки компилятора, но чтобы задержки не отрабатывались - такого не было.
Добавлено: Вс июл 19, 2009 23:08:44
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.
Добавлено: Пн июл 20, 2009 07:18:55
ARV
просто ради смеха собрал ваш проект для atmega32 - нет никаких ошибок. WinAVR-20090313. посмотрел код - и там ошибок нет.
Добавлено: Пн июл 20, 2009 10:12:03
Synergetik
ARV писал(а):просто ради смеха собрал ваш проект для atmega32 - нет никаких ошибок.
Я тоже ради смеха пересобрал проект и опля! Без ошибок, только пара предупреждений! Оказалось, вся проблема, как это часто бывает, в ошибке новичка - два раза подключил сишный файл - вот он и закономерно ругался. Спасибо за Вашу помощь - она резко ускорила процесс поиска ошибки. Хотя мне стыдно - должен был сам догадаться - достаточно было лишь более глубже вдуматься в процесс.
Добавлено: Пн июл 20, 2009 11:13:42
ARV
Synergetik писал(а):Хотя мне стыдно - должен был сам догадаться - достаточно было лишь более глубже вдуматься в процесс.
не стыдно не знать, стыдно не учиться