WinAvr в вопросах и ответах
Re: WinAvr в вопросах и ответах
надо добавлять исходник в дерево проекта, а существующий там удалять. как-то так.
-
QQQ
- Нашел транзистор. Понюхал.
- Сообщения: 168
- Зарегистрирован: Пт сен 18, 2009 11:42:24
- Откуда: г. Тверь
Re: WinAvr в вопросах и ответах
сделал так: создал новый проект, добавил в него sourse файл. В sours файл вставил содержимое программы. Выдаёт такую ошибку при компиляции:
- Вложения
-
- Архив WinRAR.rar
- (10.7 КБ) 236 скачиваний
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: WinAvr в вопросах и ответах
вы пытаетесь работать с WinAVR, но почему-то впихиваете проект в Code Vision. вас это не смущает?QQQ писал(а):сделал так: создал новый проект, добавил в него sourse файл. В sours файл вставил содержимое программы. Выдаёт такую ошибку при компиляции:
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
QQQ
- Нашел транзистор. Понюхал.
- Сообщения: 168
- Зарегистрирован: Пт сен 18, 2009 11:42:24
- Откуда: г. Тверь
Re: WinAvr в вопросах и ответах
Re: WinAvr в вопросах и ответах
Я никогда не говорил что я крутой программист
Си вроде знаю неплохо, но поучиться у более опытных и знающих никогда не стеснялся
недавно здесь обсуждалось про оптимизацию
и вот сижу я значит отлаживаю очередную прошивку
кода написал уже не мало
компилятор мне выдает что обьем памяти МК использован на 42%
а сделать надо еще не мало
решил перечитать еще раз эту ветку форума и в одном из постов от уважаемого ARV читаю фразу "никогда не используйте функцию _delay_ms() и _delay_us() c параметром в виде переменной - только константа"
сначала не обратил на это внимания но при очередном ползанью по своему коду наткнулся на одну из функций где как раз использовалась эти функции в качестве параметра выступала как раз переменная
их было там всего 2
решил убрать и поставил константы
компилирую...
компилятор мне выдал что обьем памяти МК использован на 22%
Я в ШОКЕ
не верю своим глазам
снова ставлю переменную = 42% ставлю константу = 22%
в 2 раза код уменьшился
Хочу выразить свою благодарность ARV а начинающим почаще заглядывать в эту ветку и перечитывать
учиться учиться и еще раз учиться
Си вроде знаю неплохо, но поучиться у более опытных и знающих никогда не стеснялся
недавно здесь обсуждалось про оптимизацию
и вот сижу я значит отлаживаю очередную прошивку
кода написал уже не мало
компилятор мне выдает что обьем памяти МК использован на 42%
а сделать надо еще не мало
решил перечитать еще раз эту ветку форума и в одном из постов от уважаемого ARV читаю фразу "никогда не используйте функцию _delay_ms() и _delay_us() c параметром в виде переменной - только константа"
сначала не обратил на это внимания но при очередном ползанью по своему коду наткнулся на одну из функций где как раз использовалась эти функции в качестве параметра выступала как раз переменная
их было там всего 2
решил убрать и поставил константы
компилирую...
компилятор мне выдал что обьем памяти МК использован на 22%
Я в ШОКЕ
не верю своим глазам
снова ставлю переменную = 42% ставлю константу = 22%
в 2 раза код уменьшился
Хочу выразить свою благодарность ARV а начинающим почаще заглядывать в эту ветку и перечитывать
учиться учиться и еще раз учиться
Re: WinAvr в вопросах и ответах
программа вывода чисел на семисигментный индикатор через сдвиговый регистр HC595.
и там такой кусочек:
data = ~(maska[1]);//инвертировать для вывода
//в сдвиговый регистр, вывести число "1"
send_data(data); //передать символ
вот как вот здесь сделать чтобы можно было выводить числа
от 0 до 9 на индикатор. (не maska[1] а например значением
переменной (допустим значение переменной от 0 до 9))
и там такой кусочек:
data = ~(maska[1]);//инвертировать для вывода
//в сдвиговый регистр, вывести число "1"
send_data(data); //передать символ
вот как вот здесь сделать чтобы можно было выводить числа
от 0 до 9 на индикатор. (не maska[1] а например значением
переменной (допустим значение переменной от 0 до 9))
- Вложения
-
- 7_сег_индикатор.txt
- (1.67 КБ) 235 скачиваний
на любой элемент найдется мощность, которая его сожжет.
-
alexval2006
- Прорезались зубы
- Сообщения: 225
- Зарегистрирован: Сб мар 10, 2007 20:05:39
- Откуда: валуйки
- Контактная информация:
Re: WinAvr в вопросах и ответах
Доброй ночи всем. Переписую код с IAR на WinAVR. Увидел в коде незнакомую строку extern bool b; я так понимаю это нечто типа volatile переменые эти используютса внутри обработчика прирывания по уарт.
И еще изврат нашол true и false присваиваютса переменным как значения нигде необявлены в пром контролерах это серавно что присвоит переменой 1 или сбросить ее в 0 тут также?
И еще изврат нашол true и false присваиваютса переменным как значения нигде необявлены в пром контролерах это серавно что присвоит переменой 1 или сбросить ее в 0 тут также?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: WinAvr в вопросах и ответах
с точки зрения поведения оптимизатора extern и volatile приводят к почти одинаковым результатам, однако, это не одно и то же! extern означает, что переменная определена и существует в "чужом модуле", т.е. не там, где используется, в то время как volatile обозначает, что переменная может поменять свое значение в любой момент из-за действия "внешних неизвестных сил". даже extern-переменные должны объявляться volatile, если используются в прерываниях!
что касается true, false и bool, то это константы и типы, которых по стандарту Си нет, то есть это введенные пользователем константы и типы. часто можно видеть такое определение этого (можно использовать и вам, но лучше докопаться до определения этих вещей в вашем проекте):
что касается true, false и bool, то это константы и типы, которых по стандарту Си нет, то есть это введенные пользователем константы и типы. часто можно видеть такое определение этого (можно использовать и вам, но лучше докопаться до определения этих вещей в вашем проекте):
Код: Выделить всё
typedef int bool;
#define true (1 == 1)
#define false !trueесли рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- avreal
- Опытный кот
- Сообщения: 842
- Зарегистрирован: Чт дек 31, 2009 19:27:45
- Откуда: Бровари, Україна
- Контактная информация:
Re: WinAvr в вопросах и ответах
В C99 есть тип _Bool
Я не проверял специально, но кажется, что gcc поддерживает тип _Bool независимо от ключа -std и stdbool.h всегда даёт нужный результат.
и заголовочный файл stdbool.h предопределённого вида6.2.5 Types
2 An object declared as type _Bool is large enough to store the values 0 and 1.
Код: Выделить всё
#define bool _Bool
#define true 1
#define false 0Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
-
alexval2006
- Прорезались зубы
- Сообщения: 225
- Зарегистрирован: Сб мар 10, 2007 20:05:39
- Откуда: валуйки
- Контактная информация:
Re: WinAvr в вопросах и ответах
в том то и дело что таково #define true (1 == 1) дефайна в коде я не нашёл наверно извраты IAR ну да ладно пропишу либо свои дефайны либо перепишу на нули и 1 бол по идеи тип данных в один бит если я правильно понял а раз в вин арвр он не предусмотрен значит объявим в один байт
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: WinAvr в вопросах и ответах
тип данных в 1 бит вообще не существует в Си. более того, тип bool или BOOL или их аналоги в базовом Си так же не существуют. следуя логике Си можно предположить, что все-таки под введенный в С99 тип _Bool выделен int, который является базовым типом для всего Си.alexval2006 писал(а):в том то и дело что таково #define true (1 == 1) дефайна в коде я не нашёл наверно извраты IAR ну да ладно пропишу либо свои дефайны либо перепишу на нули и 1 бол по идеи тип данных в один бит если я правильно понял а раз в вин арвр он не предусмотрен значит объявим в один байт
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
alexval2006
- Прорезались зубы
- Сообщения: 225
- Зарегистрирован: Сб мар 10, 2007 20:05:39
- Откуда: валуйки
- Контактная информация:
Re: WinAvr в вопросах и ответах
там используется какая то библиотека #include "stdbool.h"
- avreal
- Опытный кот
- Сообщения: 842
- Зарегистрирован: Чт дек 31, 2009 19:27:45
- Откуда: Бровари, Україна
- Контактная информация:
Re: WinAvr в вопросах и ответах
stdbool.h — это и есть С99 заголовочный файл для ипользования типа _Bool как bool через прокладку из #define, фрагмент этого файла я привёл выше.
Это, конечно, не означает, что компилятор может выделять память размером в один бит, так как минимальной адресуемой единицей является char. Но он и не обязан выделять int.
gcc что для avr, что для x86_64, использует байт.
А вот требование «места должно хватать для хранения 0 и 1» означает, что оставшиеся семь бит в байте могут быть мусором, не анализируемым компилятором (padding bits согласно терминологии стандарта). Но это неудобно с точки зрения совместимости с обычнм подходом С, когда значение логических операторов имеет тип int и значения 0 и 1 и для преобразований _Bool к другим целочисленным типам. Так что не думаю, что на обычных архитектурах кто-либо будет так делать.
Стандарт отдаёт это на откуп реализации. Требует только одного — чтобы выделенного места хватало для хранения значений 0 и 1. И, кстати, отдельно говорит, что ранг типа _Bool ниже ранга любого целочисленного (впрочем, это следует из того, что диапазон изменения значения типа _Bool простирается аж от 0 до 1).ARV писал(а):можно предположить, что все-таки под введенный в С99 тип _Bool выделен int, который является базовым типом для всего Си.
Это, конечно, не означает, что компилятор может выделять память размером в один бит, так как минимальной адресуемой единицей является char. Но он и не обязан выделять int.
gcc что для avr, что для x86_64, использует байт.
А вот требование «места должно хватать для хранения 0 и 1» означает, что оставшиеся семь бит в байте могут быть мусором, не анализируемым компилятором (padding bits согласно терминологии стандарта). Но это неудобно с точки зрения совместимости с обычнм подходом С, когда значение логических операторов имеет тип int и значения 0 и 1 и для преобразований _Bool к другим целочисленным типам. Так что не думаю, что на обычных архитектурах кто-либо будет так делать.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
-
alexval2006
- Прорезались зубы
- Сообщения: 225
- Зарегистрирован: Сб мар 10, 2007 20:05:39
- Откуда: валуйки
- Контактная информация:
Re: WinAvr в вопросах и ответах
спасибо за пояснение 
Помогите разобратьса с UARTом
Я в микроконтролерном деле новачок, но у меня курсовая по которой нужно сделать устройство ЧПУ.
И проблема в том что когда я отправляю с терминала (COM Port Toolkit 3.9) координату положения 150 то по программе устройство ищет заданное положение, но у меня в программе есть условие:
if (rx_buffer [0]> 2) {
[Группа операторов]
};
и это условие выполняется, хотя по идеи не должно, и соответственно устройство работает неправильно.
Подскажите пожалуйста в чем ошибка. Заранее спасибо.
И проблема в том что когда я отправляю с терминала (COM Port Toolkit 3.9) координату положения 150 то по программе устройство ищет заданное положение, но у меня в программе есть условие:
if (rx_buffer [0]> 2) {
[Группа операторов]
};
и это условие выполняется, хотя по идеи не должно, и соответственно устройство работает неправильно.
Подскажите пожалуйста в чем ошибка. Заранее спасибо.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: WinAvr в вопросах и ответах
1. при чем тут WinAVR? здесь элементарное незнание Си или собственной аппаратуры.
2. вы не сказали, что у вас в rx_buffer[0] хранится, что вообще туда попадает и т.д.
3. в каком формате вы отправляете задание: в символьном или бинарном?
я подозреваю, что ваш оператор выполняется правильно, т.е. в вашем массиве как раз число больше двух, а вот вы не доконца правильно понимаете, что у вас происходит, отсюда ожидаете не тех действий от программы.
2. вы не сказали, что у вас в rx_buffer[0] хранится, что вообще туда попадает и т.д.
3. в каком формате вы отправляете задание: в символьном или бинарном?
я подозреваю, что ваш оператор выполняется правильно, т.е. в вашем массиве как раз число больше двух, а вот вы не доконца правильно понимаете, что у вас происходит, отсюда ожидаете не тех действий от программы.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- AlexFisher
- Мучитель микросхем
- Сообщения: 493
- Зарегистрирован: Вт апр 21, 2009 13:31:27
- Откуда: Санкт-Петербург
- Контактная информация:
Re: WinAvr в вопросах и ответах
Он же в микроконтроллерах новачок и не знает про волшебное слово имулатор 
[i]Да здравствует всё то, благодаря чему мы не смотря ни на что![/i]
Re: WinAvr в вопросах и ответах
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
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: WinAvr в вопросах и ответах
так вот хренушки! если вы послали "150" из терминальной программы, то у вас будетPILS1396 писал(а):Извиняюсь, ошибся темой пишу в cvavr. Но в прерывании (при переполнении буфера приема) каждый байт записывается в массиве rx_buffer [], а нумерации начинается с нуля.
То есть как я понимаю переданы 150 записываются в массиве как:
rx_buffer [0] = 1
rx_buffer [1] = 5
rx_buffer [2] = 0
rx_buffer [0] = '1'
rx_buffer [1] = '5'
rx_buffer [2] = '0'
а это совершенно не то!
с другой стороны, я не знаю, что у вас за терминалка, но ежели она вдруг посылает именно ЧИСЛО 150, то у вас будет еще лучше:
rx_buffer [0] = 150
rx_buffer [1] = неизвестно что
rx_buffer [2] = неизвестно что
собственно, о чем я и писал: вы не знаете Си и своих собственных инструментов. бегом читать букварь!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- AlexFisher
- Мучитель микросхем
- Сообщения: 493
- Зарегистрирован: Вт апр 21, 2009 13:31:27
- Откуда: Санкт-Петербург
- Контактная информация:
Re: WinAvr в вопросах и ответах
Ошибок может быть по крайней мере 2:
1. Группа операторов начнет работать, когда передан всего один символ из трех (то есть уже не правильно)
2. Группа операторов не вычищает за собой вышеозначенный буфер, то есть не заносит туда 0х00
1. Группа операторов начнет работать, когда передан всего один символ из трех (то есть уже не правильно)
2. Группа операторов не вычищает за собой вышеозначенный буфер, то есть не заносит туда 0х00
[i]Да здравствует всё то, благодаря чему мы не смотря ни на что![/i]