Страница 170 из 421
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср янв 04, 2012 19:02:59
Garin
vitalik_1984 я конечно сейчас сделал попытку, из этих частей кода сложить программу, но скомплимировать не получилось, не могли бы вы сделать это в проекте, я в других проектах наблюдаю эти строки
_lcd_ready(); // Вкл. мигающеее знакоместо
_lcd_write_data(0x0D);
или вот такие команды
Код: Выделить всё
Сдвиг курсора вправо (0х06) ,Сдвиг курсора влево (0х04) , Выключение курсора (0х0c)
Линейная форма курсора (0х0e), Комплексная форма курсора (0х0f) ,
Установка позиции курсора (0х89-0хcf (второе значение определяет позицию на ЖКИ, в данном случае курсор выводится в нижней строке в крайнем правом знакоместе))
_lcd_ready();
_lcd_write_data(0x0e);
После этой команды на ЖКИ выводится курсор в виде подстрочной не мигающей линии.
но встроить это в свой проект у меня не получается, почемуто бегает мигалка по всему экрану, потому и прошу сделать пример....
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср янв 04, 2012 19:35:36
vitalik_1984
Garin писал(а):vitalik_1984 я конечно сейчас сделал попытку, из этих частей кода сложить программу, но скомплимировать не получилось, не могли бы вы сделать это в проекте, я в других проектах наблюдаю эти строки
а вы переменные объявили?И почему это Я! должен Вам за вас сделать?
Разве вам самому не интересно?
я и так уже для вас пол дела сделал.Киньте что там не компилируется.
С дисплеем еще не разбирался толком.По встроенным функциям не подскажу.
а примеры можно подсмотреть в
проекте Danko
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср янв 04, 2012 23:11:21
Garin
Наверное я не так выразился, что получилось все так сложно , в общем решил таким образом
Код: Выделить всё
lcd_gotoxy(4,0);
_lcd_ready();
_lcd_write_data(0x0e);
delay_ms(20);
lcd_gotoxy(5,0);
_lcd_ready();
_lcd_write_data(0x0e);
delay_ms(20);
_lcd_write_data(0x0c);
курсор подчеркивает нужные цифры....
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт янв 06, 2012 15:51:08
Volgol_555
Привет. Помогите разобраться со следующим.
Это касается подключения к ATmega8 2-х температурных датчиков DS18S20.
Умею выводить rom-адрес устройства и температуру на LCD, но не могу до сих пор обратиться к конкретному адресу, т.е.
я знаю конкретные rom-адреса 2-х датчиков (С8С520 и C8C530 соотвественно)...мне нужно не обращаться по принципу: нашел 2 датчика и записал их в массив, где я выбираю датчик, зная порядок его адреса в этом массиве (т.е. 1-ый и 2-ой адрес)...
а по принципу обращения к датчику именно по адресу напрямую....
Объясню понятнее на примере: МК нашел 2 датчика с адресами RomCode[1][0] и RomCode[0][0]. Т.е. это на самом деле 1 массив, где записан rom каждого....Но мне нужен не "датчик первый, датчик второй и т.д.", а именно выбор датчика, зная его rom-адрес.
как мне записать правильно цикл обращения к датчику по номеру rom'а?
if (RomCode[0][0]==C8C520) {} - это вариант не работает, CodeVision выдает ошибку о том, что он не понимает запись C8C520
пробовал записать так if (RomCode[0][1]==20) {}, но цикл не срабатывает. Цифру 20 я "выцедил" путем вывода на экран rom-адреса побитно).
И так...ещё раз повторюсь: как правильно записать цикл?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт янв 06, 2012 16:25:14
BCluster
странный адрес у вас какой-то... там адрес должно быть число int64
Volgol_555 писал(а):if (RomCode[0][0]==C8C520) {}
хоть это и логически неправильно, но чтоб оно хоть компилировалось надо компилятору указать что это шестрадцатиричное число.
Volgol_555 писал(а): МК нашел 2 датчика с адресами RomCode[1][0]
У вас двумерный массив. То есть адрес хранится в одном из измерений )
Пример:
Код: Выделить всё
C9 C0 EE FF DA A7 E0 09 //адрес 1 датчика
C1 D2 C3 FE 7D C1 00 02 // адрес 2 датчика
00 00 00 00 00 00 00 00 // адрес 3 датчика
00 00 00 00 00 00 00 00 // адрес 4 датчика
00 00 00 00 00 00 00 00 ...
00 00 00 00 00 00 00 00 ...
00 00 00 00 00 00 00 00 ...
00 00 00 00 00 00 00 00 // адрес n датчика
Вы же обращаетесь к RomCode[0][0] - т.е. к БАЙТУ, в нашем примере это С9. А вы пытаетесь long сравнить с char.
Все еще не пойму почему у вас адрес 4 байта вместо 8, может вы используете только младшие 4 байта, наверное это допустимо. Но я приведу пример все же для 8 байт. Где AdrLow это младшие 4 байта, а AdrHi старшие 4.
Код: Выделить всё
unsigned char CompareAddr (unsigned long AdrLo, unsigned long AdrHi, char SensorIdx)
{
unsigned long * pHi = (unsigned long *)&RomCode[SensorIdx][0];
unsigned long * pLo = (unsigned long *)&RomCode[SensorIdx][4];
if (*pLo == AdrLo)
if (*pHi == AdrHi)
return true;
return false;
}
Думаю на 4 байта прееделаете если что...
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт янв 06, 2012 16:26:06
BCluster
Volgol_555 писал(а):как правильно записать цикл?
блин и почему вы ЭТО называете циклом?)
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт янв 06, 2012 23:59:23
Volgol_555
BCluster писал(а):Volgol_555 писал(а):как правильно записать цикл?
блин и почему вы ЭТО называете циклом?)
Я это назвал циклом не подумав. Просто оно относится в книгах к той же главе что и "while"...) А вобще верное замечание - это всего лишь условие на самом деле!
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб янв 07, 2012 00:02:10
BCluster
С остальным разобрались?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб янв 07, 2012 00:06:14
FreshMan
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб янв 07, 2012 00:21:09
Volgol_555
BCluster писал(а):странный адрес у вас какой-то... там адрес должно быть число int64
Volgol_555 писал(а):if (RomCode[0][0]==C8C520) {}
хоть это и логически неправильно, но чтоб оно хоть компилировалось надо компилятору указать что это шестрадцатиричное число.
Volgol_555 писал(а): МК нашел 2 датчика с адресами RomCode[1][0]
У вас двумерный массив. То есть адрес хранится в одном из измерений )
Пример:
Код: Выделить всё
C9 C0 EE FF DA A7 E0 09 //адрес 1 датчика
C1 D2 C3 FE 7D C1 00 02 // адрес 2 датчика
00 00 00 00 00 00 00 00 // адрес 3 датчика
00 00 00 00 00 00 00 00 // адрес 4 датчика
00 00 00 00 00 00 00 00 ...
00 00 00 00 00 00 00 00 ...
00 00 00 00 00 00 00 00 ...
00 00 00 00 00 00 00 00 // адрес n датчика
Вы же обращаетесь к RomCode[0][0] - т.е. к БАЙТУ, в нашем примере это С9. А вы пытаетесь long сравнить с char.
Все еще не пойму почему у вас адрес 4 байта вместо 8, может вы используете только младшие 4 байта, наверное это допустимо. Но я приведу пример все же для 8 байт. Где AdrLow это младшие 4 байта, а AdrHi старшие 4.
Код: Выделить всё
unsigned char CompareAddr (unsigned long AdrLo, unsigned long AdrHi)
{
unsigned long * pHi = (unsigned long *)&RomCode[SensorIdx][0];
unsigned long * pLo = (unsigned long *)&RomCode[SensorIdx][4];
if (*pLo == AdrLo)
if (*pHi == AdrHi)
return true;
return false;
}
Думаю на 4 байта прееделаете если что...
1) На счет 4-х байт - я просто пытался выделить конкретный кусок адреса, т.е. вообще мне известен адрес: С8С520, который МК выдает на экран как 10 20 С5 С8 00 00 00 09, отсюда логично выделить кусок в С5 С8 20....
Можно ли сделать именно так, т.е. выделить из адреса в МК "20C5C8" и сравнить его с "С8С520" который указан на датчике????
Но сделать это максимально просто без всяких лишних операторов - вопрос, в принципе, заключается в преобразовании переменных.
2) Что касательно несоответствия типов переменных уже ясно. Но с учетом того, что я в Си новичок, то некоторые записи понятны только интуитивно, поэтому прошу объяснить на каждом символе или хотя бы строке:
unsigned char CompareAddr (unsigned long AdrLo, unsigned long AdrHi) //что это за функция?
{
unsigned long * pHi = (unsigned long *)&RomCode[SensorIdx][0]; //здесь непонятно все после знака "=", особенно знак * и "&"....
unsigned long * pLo = (unsigned long *)&RomCode[SensorIdx][4];// также неясно что означает [SensorIdx];
if (*pLo == AdrLo) //здесь понятно, что идет сравнение старшей и младшей части
if (*pHi == AdrHi)
return true;
return false;
}
Я так понял к этой функции надо обращаться в основной части программы, но я не умею ещё работать так - сори за возможно тупые вопросы по синтаксису в Си - просто хочу детально во всем разобраться с вашей помощью, а не с помощью учебников - мне с ними гораздо дольше сидеть придется, пока выцежу то, что мне надо...(
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб янв 07, 2012 00:24:36
Volgol_555
FreshMan писал(а):что значит эта команда ?
Это значит присвоить порту D.0 инвертированное значение порта B.0
~ - это инверсия
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб янв 07, 2012 01:00:20
FreshMan
СПАСИБО
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб янв 07, 2012 01:21:19
BCluster
Ну уважаемый, хоть немного матчасть знать надо. Снабегу вряд ли что-то получится толковое.
Очень рекомендую вот этот труд:
http://www.helloworld.ru/texts/comp/lang/c/c6/index.htm
Можно осилить за пару вечеров.
Пока что попробую в кратце объяснить.
Volgol_555 писал(а):Можно ли сделать именно так, т.е. выделить из адреса в МК "20C5C8" и сравнить его с "С8С520" который указан на датчике????
Ну подход неверный.
Ибо - значимый адрес все же 48 бит.
То есть там организация такая
8 бит CRC - 48 бит адрес - 8 бит код семейства
CRC и код семейства вам вряд ли нужны, а вот адрес лучше использовать целиком. Однако поскольку там все равно в один лонг не влезет, уже лучше весь адрес проверять
Код: Выделить всё
unsigned char CompareAddr (unsigned long AdrLo, unsigned long AdrHi, char SensorIdx) // это собственно название функции которую я написал :)
{
unsigned long * pHi = (unsigned long *)&RomCode[SensorIdx][0]; // читать матчасть на предмет: приведение типов, указатели
unsigned long * pLo = (unsigned long *)&RomCode[SensorIdx][4]; // SensorIdx собсно номер датчика адрес которого вы хотите сравнить
if (*pLo == AdrLo)
if (*pHi == AdrHi)
return true;
return false;
}
потом вы просто можете использовать эту функцию у себя в программе
скажем
Код: Выделить всё
main()
{
...
if (CompareAddr(0xC0C82010, 0xFFFFFFFF, 1)) {do something...}
}
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб янв 07, 2012 16:11:43
FreshMan
читаю, читаю понемножку этот манускрипт...., после него начинаю себя чуствовать еще большим идиотом

Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс янв 08, 2012 08:38:42
gosha66
Подскажите, что не нравится CodeVision при компиляции. Что то с библиотекой 1wire.h или еще чего не хватает? Программа для МК Atmega16.
P.S. программирование у меня на 2 с минусом...
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс янв 08, 2012 10:22:00
BCluster
А данный файл вообще присутсвует у вас?) По идее должен ибо это кусок libc... Но проверьте может куда его задевали...
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс янв 08, 2012 12:51:22
gosha66
В CodeVision 2.05 действительно отсутствовали некоторые библиотеки. Перешел на 1.25, дает только одну ошибку, причем строка 36 день недели вторник. Непонятно, что ему не нравится? Вложил скрин.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс янв 08, 2012 13:26:10
BCluster
А почему бы ему не ругаться, если вы инициализируете массив [7][12], первые два у вас по 12 элементов, а во вторнике только 7... Ессно он будет ругаться. Нужно все дополнить до 12 либо изменить структуру программы вообще (это лучше).
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс янв 08, 2012 13:48:52
gosha66
BCluster Спасибо, буду дальше тренироваться.
Re: Повторяющаяся ошибка в CV AVR
Добавлено: Вс янв 08, 2012 22:34:58
selevo
awawaw писал(а):Вообщем нужна помощь.
При компиляции возникает ошибка: Linker error: the program has no 'main' function.
При этом в ранее рабочих программах эта ошибка тоже возникает.
После переустановки CV AVR ошибка исчезает. Версия 2.05.2
Помогите советом, недоело переустанавливать.
это сообщение происходит тогда когда codevision установлен в папках имя которых содержат пробел или русские буквы
ставте всегда эту хрень в корень диска
с:\cvavreval
d:\cvavreval
e:\cvavreval