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

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

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

Всем, привет!
Помогите пожалуйста! :)
Работаю с 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

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

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

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

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

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

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

Сообщение ARV »

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

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

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

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

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

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

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

Спасибо! :))

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

:)) :)) :))
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Сообщения: 134
Зарегистрирован: Вс авг 01, 2010 16:05:25

Сообщение TICLIR »

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

Сообщение ARV »

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

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

Сообщение TICLIR »

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

Сообщение ARV »

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

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

Сообщение TICLIR »

ARV писал(а):это не меняет вообще ничего - если переменные не volatile, но и для volatile соответствующие ячейки будут заполнены один раз, после чего будет пустой бесконечный цикл.
Отлично,Спасибо!
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18679
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

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

Сообщение TICLIR »

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

Сообщение AI_Disable »

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

Сообщение TICLIR »

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

Сообщение AI_Disable »

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

Сообщение LazyCat »

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

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

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

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

и ещё вопрос:

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

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

Сообщение Jack_A »

LazyCat писал(а):

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

itoa(convertanalog(6)/21,numstr,10);
- тут происходит преобразование int числа (величины АЦП) в строку.
Подскажите, пожалуйста, как сделать так, чтобы результат был дробным (необходимо получить десятые доли). Пример кода желателен :oops:
itoa это не может делать по определению : Int to ASCII
Можно умножить это число на 10 ( 100 или 1000 ), а при выводе на индикатор поместить перед последними 1 ( или 2 или 3 ) цифрами десятичную точку.
Родился
Сообщения: 4
Зарегистрирован: Пн дек 21, 2009 02:10:38

Сообщение LazyCat »

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

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

Сообщение TICLIR »

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

Сообщение ARV »

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

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

Сообщение TICLIR »

ARV писал(а):второй оператор лишний, т.к. на самом деле вы делаетеw = PIND | 0b01000000 & fol;если fol у вас константа, в которой 6-й бит равен нулю, то его установка в 1 - бесполезна, и компилятор выкидывает ее.
Спасибо. Но мне надо установить в переменной w 6-й бит,для того что бы потом в процессе выполнения программы, при выполнении определённых условий изменять переменную fol.А проще говоря есть две кнопки,при замыкании одной или двух или при замкнутой одной замыкается вторая должно произойти прерывание INT1,единоразово т.е при нажатии кнопки происходит прерывание один раз,а не всё время нажатии кнопки.Может есть готовые подсказки. Спасибо.
Ответить

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