Страница 33 из 111
Re: WinAvr в вопросах и ответах
Добавлено: Ср дек 15, 2010 22:33:20
Кот-тоК
Всем, привет!
Помогите пожалуйста!

Работаю с WinAVR + Code::Blocks, не могу справиться с функцией sprintf. В CVAVR всё работает.
Та же строка в WinAVR не работает. В stdio.h смотрел, есть такая функция. Может аналог какой-то есть???
Сообщение об ошибке следующего вида:
Код: Выделить всё
=== first, Release ===
C:\WinAVR\avr\lib\libc.a(vfprintf_std.o) In function `vfprintf':
(.text.avr-libc+0xd4) undefined reference to `__mulhi3'
C:\WinAVR\avr\lib\libc.a(vfprintf_std.o) In function `vfprintf':
(.text.avr-libc+0xd4) undefined reference to `__mulhi3'
=== Build finished: 2 errors, 0 warnings ===
libc.a на месте

Re: WinAvr в вопросах и ответах
Добавлено: Пт дек 17, 2010 09:56:48
Кот-тоК
Привет, всем!!
Возникла новая проблема.
Уже писал, что использую WinAVR + Code::Blocks. Проблема с отладкой в Proteus.
В проекте у меня две папки: Release и Debug. В обоих папках есть .elf
Если добавляю в проект Proteus .elf из Release, то он не отображает ни изменение переменных, ни код программы.
Если добавляю в проект Proteus .elf из Debug, он отображает код программы, отображает изменение глобальных переменных, а вот изменение значения регистров (PORTB, ADCH и т.п.) нет.
Если добавляю проект который состоит из нескольких файлов .с, то ему вообще становится плохо: код он отображает, но даёт отлаживать только несколько строк, остальные ----.
Как это преодолеть???

Re: WinAvr в вопросах и ответах
Добавлено: Пт дек 17, 2010 10:09:14
ARV
то ли WinAVR в *.elf файл так пишет пути к файлам, то ли протеус так их оттуда читает, но для нормальной отладки надо сделать так, чтобы проект протеуса лежал в корневой папке проекта, т.е. вместе со всеми исходниками.
протеус не считает порт ввода-вывода, а так же любой регистр управления периферией, за переменную, а WinAVR считает. поэтому отследить содерджимое PORTB, ADCSRA, TIMSK и т.п. вещей в протеусе можно только при помощи просмотра содержимого области памяти портов ввода-вывода - очень неудобно... но никуда не деться.
на счет --- в исходниках при отладке в протеусе - это вам "оптимизатор" подгадил

чтобы каждая строка имела соответствующий ей код, надо отключать любую оптимизацию в проекте, в противном случае оптимизатор обязательно часть кода вырежет, и протеус будет думать, что некоторые строки программы никогда не выполняются (возможно, оно так и будет).
можно попытаться отлаживать в виде связки
PROTEUS+AVR Studio: последние версии студии имеют плагин для отладки через протеус
Proteus VSM Viewer. вам надо будет при выборе платформы для отладки выбрать не симулятор студии, а этот самый плагин, тогда у вас внутри студии откроется окно протеуса, в нем - схема со всеми навоторотами... и тогда вы будете код и регистры смотреть в студии, а всякие аналоговые штучки и прочие светодиоды-кнопочки нажимать в протеусе
правда, у меня такой гибрид не очень стабильно работал, иной раз вылетал. возможно, уже все пофиксено - не проверял.
Re: WinAvr в вопросах и ответах
Добавлено: Пт дек 17, 2010 12:46:48
Кот-тоК
Спасибо!
Отключил оптимизацию, действительно, ---- ушли и переменные все появились.
Кстати, нашел, как смотреть регистры: и ADCSRA, и PORTB, любые.
Отладка -> Watch Window, в открывшемся окне правой кнопкой мыши -> Добавить элемент (по имени)... -> выбираешь любые регистры.

Re: WinAvr в вопросах и ответах
Добавлено: Вс дек 26, 2010 16:22:40
TICLIR
Тоже напрягают ----, вот только после замкнутого цикла, типа
----while(1);
----perem_u=0x34;
----perem_q=45;
переменные видно но всегда 0. Отключил оптимизацию,т.е. поставил 0 результата нет, что могет быть.
Re: WinAvr в вопросах и ответах
Добавлено: Вс дек 26, 2010 18:57:53
ARV
TICLIR писал(а):Тоже напрягают ----, вот только после замкнутого цикла, типа
----while(1);
----perem_u=0x34;
----perem_q=45;
переменные видно но всегда 0. Отключил оптимизацию,т.е. поставил 0 результата нет, что могет быть.
while(1); - это бесконечный цикл, дойдя до него, программа
далее не пойдет ни при каких условиях - нафига тогда держать во флеши код нижеследующих операторов? нафига держать ячеки ОЗУ под переменные, в которые никогда ничего не запишется?! вот вам и минусы, вот вам и нули. все абсолютно правильно.
Re: WinAvr в вопросах и ответах
Добавлено: Пн дек 27, 2010 16:22:13
TICLIR
Извините за не точный пример
----while(1){
----perem_u=0x34;
----perem_q=45;
};
А вот так чёто меняет?
Re: WinAvr в вопросах и ответах
Добавлено: Пн дек 27, 2010 16:24:58
ARV
TICLIR писал(а):Извините за не точный пример
----while(1){
----perem_u=0x34;
----perem_q=45;
};
А вот так чёто меняет?
это не меняет вообще ничего - если переменные не
volatile, но и для
volatile соответствующие ячейки будут заполнены один раз, после чего будет пустой бесконечный цикл.
Re: WinAvr в вопросах и ответах
Добавлено: Пн дек 27, 2010 18:08:05
TICLIR
ARV писал(а):это не меняет вообще ничего - если переменные не volatile, но и для volatile соответствующие ячейки будут заполнены один раз, после чего будет пустой бесконечный цикл.
Отлично,Спасибо!
Re: WinAvr в вопросах и ответах
Добавлено: Пн дек 27, 2010 19:13:30
ARV
ARV писал(а):это не меняет вообще ничего - если переменные не volatile, но и для volatile соответствующие ячейки будут заполнены один раз, после чего будет пустой бесконечный цикл.
пожалуй, я погорячился: для volatile-переменных значения все-таки будут тупо в цикле записываться...
Re: WinAvr в вопросах и ответах
Добавлено: Ср дек 29, 2010 18:02:04
TICLIR
Доброе время суток! Коректна такая запись " w|=(PIND&0x30);", а то она работает ,а то нет.Спасибо.
Re: WinAvr в вопросах и ответах
Добавлено: Ср дек 29, 2010 18:18:12
AI_Disable
TICLIR, запись то корректна, но я так понимаю вопрос в том "делает ли она так, как мне надо".
Этой записью вы устанавливаете в "w" 4-й бит в единицу, если он установлен в PIND, и 5-й бит единицу, если он установлен в PIND. Это ли вы хотите?
Re: WinAvr в вопросах и ответах
Добавлено: Ср дек 29, 2010 18:31:51
TICLIR
AI_Disable писал(а):TICLIR, запись то корректна, но я так понимаю вопрос в том "делает ли она так, как мне надо".Этой записью вы устанавливаете в "w" 4-й бит в единицу, если он установлен в PIND, и 5-й бит единицу, если он установлен в PIND. Это ли вы хотите?
Да, точно так мне интересны только 4-5 бит,и что бы другие оставались не тронутыми в переменной "w".Спасибо.
Re: WinAvr в вопросах и ответах
Добавлено: Ср дек 29, 2010 19:02:04
AI_Disable
Наверно, буду КЭП-ом, но, всегда лучше повториться, чем упустить из виду. Помимо того, что обращение идёт только к 4 и 5 биту, побитное "ИЛИ" не даст записать в эти биты нули.
Re: WinAvr в вопросах и ответах
Добавлено: Чт дек 30, 2010 17:25:55
LazyCat
Всем привет!!! С наступающим НГ!!!
мне нужна Ваша помощь)
- тут происходит преобразование int числа (величины АЦП) в строку.
Подскажите, пожалуйста, как сделать так, чтобы результат был дробным (необходимо получить десятые доли). Пример кода желателен
и ещё вопрос:
-при достижении результатом (convertanalog(7)*100/137) значения 235 дальнейшего увеличения не происходит, перед числом появляется "-" и значение убывает. Подскажите, пожалуйста, как исправить..
Сильно не пинайте, если что
Заранее спасибо!!!
Re: WinAvr в вопросах и ответах
Добавлено: Чт дек 30, 2010 18:37:38
Jack_A
LazyCat писал(а):
- тут происходит преобразование int числа (величины АЦП) в строку.
Подскажите, пожалуйста, как сделать так, чтобы результат был дробным (необходимо получить десятые доли). Пример кода желателен
itoa это не может делать по определению :
Int to ASCII
Можно умножить это число на 10 ( 100 или 1000 ), а при выводе на индикатор поместить перед последними 1 ( или 2 или 3 ) цифрами десятичную точку.
Re: WinAvr в вопросах и ответах
Добавлено: Чт дек 30, 2010 20:13:03
LazyCat
такая попытка тоже была, при этом получается вот что: "при достижении результатом (convertanalog(7)*100/137) значения 235 дальнейшего увеличения не происходит, перед числом появляется "-" и значение убывает (с учётом минуса - растёт)"
а можно пример кода для того, чтобы вставить десятичную точку перед последними цифрами?
Re: WinAvr в вопросах и ответах
Добавлено: Чт дек 30, 2010 20:41:59
TICLIR
С наступающим НОВЫМ ГОДОМ!
03F6 w=PIND;
---- w=w|(1<<6);
03F8 w&=fol;
Вот опять эти чёрточки будоражат. Что не так? Я понимаю код долеко не идеален,но зато в середине программы
Re: WinAvr в вопросах и ответах
Добавлено: Чт дек 30, 2010 22:21:21
ARV
TICLIR писал(а):С наступающим НОВЫМ ГОДОМ!
03F6 w=PIND;
---- w=w|(1<<6);
03F8 w&=fol;
Вот опять эти чёрточки будоражат. Что не так? Я понимаю код долеко не идеален,но зато в середине программы
второй оператор лишний, т.к. на самом деле вы делаете
w = PIND | 0b01000000 & fol;
если
fol у вас константа, в которой 6-й бит равен нулю, то его установка в 1 - бесполезна, и компилятор выкидывает ее.
Re: WinAvr в вопросах и ответах
Добавлено: Пт дек 31, 2010 06:07:12
TICLIR
ARV писал(а):второй оператор лишний, т.к. на самом деле вы делаетеw = PIND | 0b01000000 & fol;если fol у вас константа, в которой 6-й бит равен нулю, то его установка в 1 - бесполезна, и компилятор выкидывает ее.
Спасибо. Но мне надо установить в переменной w 6-й бит,для того что бы потом в процессе выполнения программы, при выполнении определённых условий изменять переменную fol.А проще говоря есть две кнопки,при замыкании одной или двух или при замкнутой одной замыкается вторая должно произойти прерывание INT1,единоразово т.е при нажатии кнопки происходит прерывание один раз,а не всё время нажатии кнопки.Может есть готовые подсказки. Спасибо.