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

Обсуждаем контроллеры компании Atmel.
Кот-тоК
Открыл глаза
Сообщения: 42
Зарегистрирован: Чт окт 28, 2010 19:33:35

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

Сообщение Кот-тоК »

Всем, привет!
Помогите пожалуйста! :)
Работаю с WinAVR + Code::Blocks, не могу справиться с функцией sprintf. В CVAVR всё работает.

Код: Выделить всё

sprintf(buf, "%u", temp);


Та же строка в 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 на месте :)
Кот-тоК
Открыл глаза
Сообщения: 42
Зарегистрирован: Чт окт 28, 2010 19:33:35

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

Сообщение Кот-тоК »

Привет, всем!!

Возникла новая проблема. :)

Уже писал, что использую WinAVR + Code::Blocks. Проблема с отладкой в Proteus.

В проекте у меня две папки: Release и Debug. В обоих папках есть .elf
Если добавляю в проект Proteus .elf из Release, то он не отображает ни изменение переменных, ни код программы.
Если добавляю в проект Proteus .elf из Debug, он отображает код программы, отображает изменение глобальных переменных, а вот изменение значения регистров (PORTB, ADCH и т.п.) нет.
Если добавляю проект который состоит из нескольких файлов .с, то ему вообще становится плохо: код он отображает, но даёт отлаживать только несколько строк, остальные ----.

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

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

Сообщение ARV »

то ли WinAVR в *.elf файл так пишет пути к файлам, то ли протеус так их оттуда читает, но для нормальной отладки надо сделать так, чтобы проект протеуса лежал в корневой папке проекта, т.е. вместе со всеми исходниками.

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

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

можно попытаться отлаживать в виде связки PROTEUS+AVR Studio: последние версии студии имеют плагин для отладки через протеус Proteus VSM Viewer. вам надо будет при выборе платформы для отладки выбрать не симулятор студии, а этот самый плагин, тогда у вас внутри студии откроется окно протеуса, в нем - схема со всеми навоторотами... и тогда вы будете код и регистры смотреть в студии, а всякие аналоговые штучки и прочие светодиоды-кнопочки нажимать в протеусе :)

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

Мой уютный бложик... заходите!
Кот-тоК
Открыл глаза
Сообщения: 42
Зарегистрирован: Чт окт 28, 2010 19:33:35

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

Сообщение Кот-тоК »

Спасибо! :))

Отключил оптимизацию, действительно, ---- ушли и переменные все появились.
Кстати, нашел, как смотреть регистры: и ADCSRA, и PORTB, любые.
Отладка -> Watch Window, в открывшемся окне правой кнопкой мыши -> Добавить элемент (по имени)... -> выбираешь любые регистры.

:)) :)) :))
TICLIR
Встал на лапы
Сообщения: 134
Зарегистрирован: Вс авг 01, 2010 16:05:25

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

Сообщение TICLIR »

Тоже напрягают ----, вот только после замкнутого цикла, типа
----while(1);
----perem_u=0x34;
----perem_q=45;
переменные видно но всегда 0. Отключил оптимизацию,т.е. поставил 0 результата нет, что могет быть.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

TICLIR писал(а):Тоже напрягают ----, вот только после замкнутого цикла, типа
----while(1);
----perem_u=0x34;
----perem_q=45;
переменные видно но всегда 0. Отключил оптимизацию,т.е. поставил 0 результата нет, что могет быть.

while(1); - это бесконечный цикл, дойдя до него, программа далее не пойдет ни при каких условиях - нафига тогда держать во флеши код нижеследующих операторов? нафига держать ячеки ОЗУ под переменные, в которые никогда ничего не запишется?! вот вам и минусы, вот вам и нули. все абсолютно правильно.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
TICLIR
Встал на лапы
Сообщения: 134
Зарегистрирован: Вс авг 01, 2010 16:05:25

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

Сообщение TICLIR »

Извините за не точный пример
----while(1){
----perem_u=0x34;
----perem_q=45;
};
А вот так чёто меняет?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

TICLIR писал(а):Извините за не точный пример
----while(1){
----perem_u=0x34;
----perem_q=45;
};
А вот так чёто меняет?
это не меняет вообще ничего - если переменные не volatile, но и для volatile соответствующие ячейки будут заполнены один раз, после чего будет пустой бесконечный цикл.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
TICLIR
Встал на лапы
Сообщения: 134
Зарегистрирован: Вс авг 01, 2010 16:05:25

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

Сообщение TICLIR »

ARV писал(а):это не меняет вообще ничего - если переменные не volatile, но и для volatile соответствующие ячейки будут заполнены один раз, после чего будет пустой бесконечный цикл.

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

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
TICLIR
Встал на лапы
Сообщения: 134
Зарегистрирован: Вс авг 01, 2010 16:05:25

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

Сообщение TICLIR »

Доброе время суток! Коректна такая запись " w|=(PIND&0x30);", а то она работает ,а то нет.Спасибо.
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

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

Сообщение AI_Disable »

TICLIR, запись то корректна, но я так понимаю вопрос в том "делает ли она так, как мне надо".
Этой записью вы устанавливаете в "w" 4-й бит в единицу, если он установлен в PIND, и 5-й бит единицу, если он установлен в PIND. Это ли вы хотите?
TICLIR
Встал на лапы
Сообщения: 134
Зарегистрирован: Вс авг 01, 2010 16:05:25

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

Сообщение TICLIR »

AI_Disable писал(а):TICLIR, запись то корректна, но я так понимаю вопрос в том "делает ли она так, как мне надо".Этой записью вы устанавливаете в "w" 4-й бит в единицу, если он установлен в PIND, и 5-й бит единицу, если он установлен в PIND. Это ли вы хотите?

Да, точно так мне интересны только 4-5 бит,и что бы другие оставались не тронутыми в переменной "w".Спасибо.
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

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

Сообщение AI_Disable »

Наверно, буду КЭП-ом, но, всегда лучше повториться, чем упустить из виду. Помимо того, что обращение идёт только к 4 и 5 биту, побитное "ИЛИ" не даст записать в эти биты нули.
LazyCat
Родился
Сообщения: 4
Зарегистрирован: Пн дек 21, 2009 02:10:38
Контактная информация:

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

Сообщение LazyCat »

Всем привет!!! С наступающим НГ!!!
мне нужна Ваша помощь)

Код: Выделить всё

itoa(convertanalog(6)/21,numstr,10);
- тут происходит преобразование int числа (величины АЦП) в строку.

Подскажите, пожалуйста, как сделать так, чтобы результат был дробным (необходимо получить десятые доли). Пример кода желателен :oops:

и ещё вопрос:

Код: Выделить всё

itoa(convertanalog(7)*100/137,numstr,10);
-при достижении результатом (convertanalog(7)*100/137) значения 235 дальнейшего увеличения не происходит, перед числом появляется "-" и значение убывает. Подскажите, пожалуйста, как исправить..
Сильно не пинайте, если что :roll:
Заранее спасибо!!!
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

LazyCat писал(а):

Код: Выделить всё

itoa(convertanalog(6)/21,numstr,10);
- тут происходит преобразование int числа (величины АЦП) в строку.
Подскажите, пожалуйста, как сделать так, чтобы результат был дробным (необходимо получить десятые доли). Пример кода желателен :oops:


itoa это не может делать по определению : Int to ASCII
Можно умножить это число на 10 ( 100 или 1000 ), а при выводе на индикатор поместить перед последними 1 ( или 2 или 3 ) цифрами десятичную точку.
LazyCat
Родился
Сообщения: 4
Зарегистрирован: Пн дек 21, 2009 02:10:38
Контактная информация:

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

Сообщение LazyCat »

Код: Выделить всё

itoa(convertanalog(7)*100/137,numstr,10);

такая попытка тоже была, при этом получается вот что: "при достижении результатом (convertanalog(7)*100/137) значения 235 дальнейшего увеличения не происходит, перед числом появляется "-" и значение убывает (с учётом минуса - растёт)"
а можно пример кода для того, чтобы вставить десятичную точку перед последними цифрами?
TICLIR
Встал на лапы
Сообщения: 134
Зарегистрирован: Вс авг 01, 2010 16:05:25

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

Сообщение TICLIR »

С наступающим НОВЫМ ГОДОМ!
03F6 w=PIND;
---- w=w|(1<<6);
03F8 w&=fol;
Вот опять эти чёрточки будоражат. Что не так? Я понимаю код долеко не идеален,но зато в середине программы
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

TICLIR писал(а):С наступающим НОВЫМ ГОДОМ!
03F6 w=PIND;
---- w=w|(1<<6);
03F8 w&=fol;
Вот опять эти чёрточки будоражат. Что не так? Я понимаю код долеко не идеален,но зато в середине программы

второй оператор лишний, т.к. на самом деле вы делаете
w = PIND | 0b01000000 & fol;
если fol у вас константа, в которой 6-й бит равен нулю, то его установка в 1 - бесполезна, и компилятор выкидывает ее.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
TICLIR
Встал на лапы
Сообщения: 134
Зарегистрирован: Вс авг 01, 2010 16:05:25

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

Сообщение TICLIR »

ARV писал(а):второй оператор лишний, т.к. на самом деле вы делаетеw = PIND | 0b01000000 & fol;если fol у вас константа, в которой 6-й бит равен нулю, то его установка в 1 - бесполезна, и компилятор выкидывает ее.

Спасибо. Но мне надо установить в переменной w 6-й бит,для того что бы потом в процессе выполнения программы, при выполнении определённых условий изменять переменную fol.А проще говоря есть две кнопки,при замыкании одной или двух или при замкнутой одной замыкается вторая должно произойти прерывание INT1,единоразово т.е при нажатии кнопки происходит прерывание один раз,а не всё время нажатии кнопки.Может есть готовые подсказки. Спасибо.
Ответить

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