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

Обсуждаем контроллеры компании Atmel.
Ответить
lix
Опытный кот
Сообщения: 703
Зарегистрирован: Вс янв 17, 2010 15:32:19
Откуда: Курган

Сообщение lix »

надо добавлять исходник в дерево проекта, а существующий там удалять. как-то так.
Реклама
QQQ
Нашел транзистор. Понюхал.
Сообщения: 168
Зарегистрирован: Пт сен 18, 2009 11:42:24
Откуда: г. Тверь

Сообщение QQQ »

сделал так: создал новый проект, добавил в него sourse файл. В sours файл вставил содержимое программы. Выдаёт такую ошибку при компиляции:
Вложения
Архив WinRAR.rar
(10.7 КБ) 236 скачиваний
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18704
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

QQQ писал(а):сделал так: создал новый проект, добавил в него sourse файл. В sours файл вставил содержимое программы. Выдаёт такую ошибку при компиляции:
вы пытаетесь работать с WinAVR, но почему-то впихиваете проект в Code Vision. вас это не смущает?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
QQQ
Нашел транзистор. Понюхал.
Сообщения: 168
Зарегистрирован: Пт сен 18, 2009 11:42:24
Откуда: г. Тверь

Сообщение QQQ »

:shock: смущает, я не заметил :oops: . Спасибо за замечание буду юзать WinAvr
Реклама
Эиком - электронные компоненты и радиодетали
Мявтор!
Аватара пользователя
Сообщения: 2057
Зарегистрирован: Чт ноя 30, 2006 12:27:46
Откуда: Челябинск

Сообщение dt_andrew »

Я никогда не говорил что я крутой программист
Си вроде знаю неплохо, но поучиться у более опытных и знающих никогда не стеснялся
недавно здесь обсуждалось про оптимизацию

и вот сижу я значит отлаживаю очередную прошивку
кода написал уже не мало

компилятор мне выдает что обьем памяти МК использован на 42%
а сделать надо еще не мало

решил перечитать еще раз эту ветку форума и в одном из постов от уважаемого ARV читаю фразу "никогда не используйте функцию _delay_ms() и _delay_us() c параметром в виде переменной - только константа"
сначала не обратил на это внимания но при очередном ползанью по своему коду наткнулся на одну из функций где как раз использовалась эти функции в качестве параметра выступала как раз переменная
их было там всего 2

решил убрать и поставил константы
компилирую...
компилятор мне выдал что обьем памяти МК использован на 22%

Я в ШОКЕ :o :shock:
не верю своим глазам
снова ставлю переменную = 42% ставлю константу = 22%
в 2 раза код уменьшился

Хочу выразить свою благодарность ARV а начинающим почаще заглядывать в эту ветку и перечитывать
учиться учиться и еще раз учиться
Реклама
Родился
Аватара пользователя
Сообщения: 9
Зарегистрирован: Сб июл 17, 2010 14:16:00

Сообщение skef »

программа вывода чисел на семисигментный индикатор через сдвиговый регистр HC595.
и там такой кусочек:

data = ~(maska[1]);//инвертировать для вывода
//в сдвиговый регистр, вывести число "1"
send_data(data); //передать символ

вот как вот здесь сделать чтобы можно было выводить числа
от 0 до 9 на индикатор. (не maska[1] а например значением
переменной (допустим значение переменной от 0 до 9))
Вложения
7_сег_индикатор.txt
(1.67 КБ) 235 скачиваний
на любой элемент найдется мощность, которая его сожжет.
Реклама
Прорезались зубы
Сообщения: 225
Зарегистрирован: Сб мар 10, 2007 20:05:39
Откуда: валуйки

Сообщение alexval2006 »

Доброй ночи всем. Переписую код с IAR на WinAVR. Увидел в коде незнакомую строку extern bool b; я так понимаю это нечто типа volatile переменые эти используютса внутри обработчика прирывания по уарт.
И еще изврат нашол true и false присваиваютса переменным как значения нигде необявлены в пром контролерах это серавно что присвоит переменой 1 или сбросить ее в 0 тут также?
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18704
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

с точки зрения поведения оптимизатора extern и volatile приводят к почти одинаковым результатам, однако, это не одно и то же! extern означает, что переменная определена и существует в "чужом модуле", т.е. не там, где используется, в то время как volatile обозначает, что переменная может поменять свое значение в любой момент из-за действия "внешних неизвестных сил". даже extern-переменные должны объявляться volatile, если используются в прерываниях!

что касается true, false и bool, то это константы и типы, которых по стандарту Си нет, то есть это введенные пользователем константы и типы. часто можно видеть такое определение этого (можно использовать и вам, но лучше докопаться до определения этих вещей в вашем проекте):

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

typedef int bool;
#define true (1 == 1)
#define false !true
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна

Сообщение avreal »

В C99 есть тип _Bool
6.2.5 Types
2 An object declared as type _Bool is large enough to store the values 0 and 1.
и заголовочный файл stdbool.h предопределённого вида

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

#define bool	_Bool
#define true	1
#define false	0
Я не проверял специально, но кажется, что gcc поддерживает тип _Bool независимо от ключа -std и stdbool.h всегда даёт нужный результат.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Контактная информация:
Прорезались зубы
Сообщения: 225
Зарегистрирован: Сб мар 10, 2007 20:05:39
Откуда: валуйки

Сообщение alexval2006 »

в том то и дело что таково #define true (1 == 1) дефайна в коде я не нашёл наверно извраты IAR ну да ладно пропишу либо свои дефайны либо перепишу на нули и 1 бол по идеи тип данных в один бит если я правильно понял а раз в вин арвр он не предусмотрен значит объявим в один байт
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18704
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

alexval2006 писал(а):в том то и дело что таково #define true (1 == 1) дефайна в коде я не нашёл наверно извраты IAR ну да ладно пропишу либо свои дефайны либо перепишу на нули и 1 бол по идеи тип данных в один бит если я правильно понял а раз в вин арвр он не предусмотрен значит объявим в один байт
тип данных в 1 бит вообще не существует в Си. более того, тип bool или BOOL или их аналоги в базовом Си так же не существуют. следуя логике Си можно предположить, что все-таки под введенный в С99 тип _Bool выделен int, который является базовым типом для всего Си.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Прорезались зубы
Сообщения: 225
Зарегистрирован: Сб мар 10, 2007 20:05:39
Откуда: валуйки

Сообщение alexval2006 »

там используется какая то библиотека #include "stdbool.h"
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна

Сообщение avreal »

stdbool.h — это и есть С99 заголовочный файл для ипользования типа _Bool как bool через прокладку из #define, фрагмент этого файла я привёл выше.
ARV писал(а):можно предположить, что все-таки под введенный в С99 тип _Bool выделен int, который является базовым типом для всего Си.
Стандарт отдаёт это на откуп реализации. Требует только одного — чтобы выделенного места хватало для хранения значений 0 и 1. И, кстати, отдельно говорит, что ранг типа _Bool ниже ранга любого целочисленного (впрочем, это следует из того, что диапазон изменения значения типа _Bool простирается аж от 0 до 1).
Это, конечно, не означает, что компилятор может выделять память размером в один бит, так как минимальной адресуемой единицей является char. Но он и не обязан выделять int.
gcc что для avr, что для x86_64, использует байт.

А вот требование «места должно хватать для хранения 0 и 1» означает, что оставшиеся семь бит в байте могут быть мусором, не анализируемым компилятором (padding bits согласно терминологии стандарта). Но это неудобно с точки зрения совместимости с обычнм подходом С, когда значение логических операторов имеет тип int и значения 0 и 1 и для преобразований _Bool к другим целочисленным типам. Так что не думаю, что на обычных архитектурах кто-либо будет так делать.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Контактная информация:
Прорезались зубы
Сообщения: 225
Зарегистрирован: Сб мар 10, 2007 20:05:39
Откуда: валуйки

Сообщение alexval2006 »

спасибо за пояснение :)
Контактная информация:
Родился
Сообщения: 5
Зарегистрирован: Вт ноя 16, 2010 13:37:28

Сообщение PILS1396 »

Я в микроконтролерном деле новачок, но у меня курсовая по которой нужно сделать устройство ЧПУ.
И проблема в том что когда я отправляю с терминала (COM Port Toolkit 3.9) координату положения 150 то по программе устройство ищет заданное положение, но у меня в программе есть условие:
if (rx_buffer [0]> 2) {
[Группа операторов]
};
и это условие выполняется, хотя по идеи не должно, и соответственно устройство работает неправильно.
Подскажите пожалуйста в чем ошибка. Заранее спасибо.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18704
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

1. при чем тут WinAVR? здесь элементарное незнание Си или собственной аппаратуры.
2. вы не сказали, что у вас в rx_buffer[0] хранится, что вообще туда попадает и т.д.
3. в каком формате вы отправляете задание: в символьном или бинарном?

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

Мой уютный бложик... заходите!
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 493
Зарегистрирован: Вт апр 21, 2009 13:31:27
Откуда: Санкт-Петербург

Сообщение AlexFisher »

Он же в микроконтроллерах новачок и не знает про волшебное слово имулатор 8)
[i]Да здравствует всё то, благодаря чему мы не смотря ни на что![/i]
Контактная информация:
Родился
Сообщения: 5
Зарегистрирован: Вт ноя 16, 2010 13:37:28

Сообщение PILS1396 »

ARV писал(а):1. при чем тут WinAVR? здесь элементарное незнание Си или собственной аппаратуры.
2. вы не сказали, что у вас в rx_buffer[0] хранится, что вообще туда попадает и т.д.
3. в каком формате вы отправляете задание: в символьном или бинарном?

я подозреваю, что ваш оператор выполняется правильно, т.е. в вашем массиве как раз число больше двух, а вот вы не доконца правильно понимаете, что у вас происходит, отсюда ожидаете не тех действий от программы.
Извиняюсь, ошибся темой пишу в cvavr. Но в прерывании (при переполнении буфера приема) каждый байт записывается в массиве rx_buffer [], а нумерации начинается с нуля.
То есть как я понимаю переданы 150 записываются в массиве как:
rx_buffer [0] = 1
rx_buffer [1] = 5
rx_buffer [2] = 0
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18704
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

PILS1396 писал(а):Извиняюсь, ошибся темой пишу в cvavr. Но в прерывании (при переполнении буфера приема) каждый байт записывается в массиве rx_buffer [], а нумерации начинается с нуля.
То есть как я понимаю переданы 150 записываются в массиве как:
rx_buffer [0] = 1
rx_buffer [1] = 5
rx_buffer [2] = 0
так вот хренушки! если вы послали "150" из терминальной программы, то у вас будет
rx_buffer [0] = '1'
rx_buffer [1] = '5'
rx_buffer [2] = '0'

а это совершенно не то!
с другой стороны, я не знаю, что у вас за терминалка, но ежели она вдруг посылает именно ЧИСЛО 150, то у вас будет еще лучше:
rx_buffer [0] = 150
rx_buffer [1] = неизвестно что
rx_buffer [2] = неизвестно что


собственно, о чем я и писал: вы не знаете Си и своих собственных инструментов. бегом читать букварь! :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 493
Зарегистрирован: Вт апр 21, 2009 13:31:27
Откуда: Санкт-Петербург

Сообщение AlexFisher »

Ошибок может быть по крайней мере 2:
1. Группа операторов начнет работать, когда передан всего один символ из трех (то есть уже не правильно)
2. Группа операторов не вычищает за собой вышеозначенный буфер, то есть не заносит туда 0х00
[i]Да здравствует всё то, благодаря чему мы не смотря ни на что![/i]
Контактная информация:
Ответить

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