Страница 31 из 111

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

Добавлено: Сб окт 23, 2010 14:08:07
lix
надо добавлять исходник в дерево проекта, а существующий там удалять. как-то так.

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

Добавлено: Пн окт 25, 2010 22:47:24
QQQ
сделал так: создал новый проект, добавил в него sourse файл. В sours файл вставил содержимое программы. Выдаёт такую ошибку при компиляции:

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

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

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

Добавлено: Вт окт 26, 2010 09:48:29
QQQ
:shock: смущает, я не заметил :oops: . Спасибо за замечание буду юзать WinAvr

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

Добавлено: Ср окт 27, 2010 07:18:41
dt_andrew
Я никогда не говорил что я крутой программист
Си вроде знаю неплохо, но поучиться у более опытных и знающих никогда не стеснялся
недавно здесь обсуждалось про оптимизацию

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

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

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

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

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

Хочу выразить свою благодарность ARV а начинающим почаще заглядывать в эту ветку и перечитывать
учиться учиться и еще раз учиться

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

Добавлено: Сб ноя 20, 2010 19:06:23
skef
программа вывода чисел на семисигментный индикатор через сдвиговый регистр HC595.
и там такой кусочек:

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

вот как вот здесь сделать чтобы можно было выводить числа
от 0 до 9 на индикатор. (не maska[1] а например значением
переменной (допустим значение переменной от 0 до 9))

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

Добавлено: Пн ноя 22, 2010 01:53:52
alexval2006
Доброй ночи всем. Переписую код с IAR на WinAVR. Увидел в коде незнакомую строку extern bool b; я так понимаю это нечто типа volatile переменые эти используютса внутри обработчика прирывания по уарт.
И еще изврат нашол true и false присваиваютса переменным как значения нигде необявлены в пром контролерах это серавно что присвоит переменой 1 или сбросить ее в 0 тут также?

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

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

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

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

typedef int bool;
#define true (1 == 1)
#define false !true

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

Добавлено: Пн ноя 22, 2010 11:09:37
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 всегда даёт нужный результат.

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

Добавлено: Пн ноя 22, 2010 15:36:49
alexval2006
в том то и дело что таково #define true (1 == 1) дефайна в коде я не нашёл наверно извраты IAR ну да ладно пропишу либо свои дефайны либо перепишу на нули и 1 бол по идеи тип данных в один бит если я правильно понял а раз в вин арвр он не предусмотрен значит объявим в один байт

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

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

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

Добавлено: Пн ноя 22, 2010 18:21:31
alexval2006
там используется какая то библиотека #include "stdbool.h"

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

Добавлено: Пн ноя 22, 2010 20:12:34
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 к другим целочисленным типам. Так что не думаю, что на обычных архитектурах кто-либо будет так делать.

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

Добавлено: Ср ноя 24, 2010 22:05:12
alexval2006
спасибо за пояснение :)

Помогите разобратьса с UARTом

Добавлено: Чт ноя 25, 2010 11:03:19
PILS1396
Я в микроконтролерном деле новачок, но у меня курсовая по которой нужно сделать устройство ЧПУ.
И проблема в том что когда я отправляю с терминала (COM Port Toolkit 3.9) координату положения 150 то по программе устройство ищет заданное положение, но у меня в программе есть условие:
if (rx_buffer [0]> 2) {
[Группа операторов]
};
и это условие выполняется, хотя по идеи не должно, и соответственно устройство работает неправильно.
Подскажите пожалуйста в чем ошибка. Заранее спасибо.

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

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

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

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

Добавлено: Чт ноя 25, 2010 11:26:41
AlexFisher
Он же в микроконтроллерах новачок и не знает про волшебное слово имулатор 8)

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

Добавлено: Чт ноя 25, 2010 11:39:36
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

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

Добавлено: Чт ноя 25, 2010 11:56:19
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] = неизвестно что


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

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

Добавлено: Чт ноя 25, 2010 12:04:40
AlexFisher
Ошибок может быть по крайней мере 2:
1. Группа операторов начнет работать, когда передан всего один символ из трех (то есть уже не правильно)
2. Группа операторов не вычищает за собой вышеозначенный буфер, то есть не заносит туда 0х00