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);
После этой команды на ЖКИ выводится курсор в виде подстрочной не мигающей линии.
но встроить это в свой проект у меня не получается, почемуто бегает мигалка по всему экрану, потому и прошу сделать пример....
Garin писал(а):vitalik_1984 я конечно сейчас сделал попытку, из этих частей кода сложить программу, но скомплимировать не получилось, не могли бы вы сделать это в проекте, я в других проектах наблюдаю эти строки
а вы переменные объявили?И почему это Я! должен Вам за вас сделать?
Разве вам самому не интересно?
я и так уже для вас пол дела сделал.Киньте что там не компилируется.
С дисплеем еще не разбирался толком.По встроенным функциям не подскажу.
а примеры можно подсмотреть в проекте Danko
Привет. Помогите разобраться со следующим.
Это касается подключения к 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-адреса побитно).
И так...ещё раз повторюсь: как правильно записать цикл?
Вы же обращаетесь к RomCode[0][0] - т.е. к БАЙТУ, в нашем примере это С9. А вы пытаетесь long сравнить с char.
Все еще не пойму почему у вас адрес 4 байта вместо 8, может вы используете только младшие 4 байта, наверное это допустимо. Но я приведу пример все же для 8 байт. Где AdrLow это младшие 4 байта, а AdrHi старшие 4.
Я это назвал циклом не подумав. Просто оно относится в книгах к той же главе что и "while"...) А вобще верное замечание - это всего лишь условие на самом деле!
Вы же обращаетесь к 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;
}
Я так понял к этой функции надо обращаться в основной части программы, но я не умею ещё работать так - сори за возможно тупые вопросы по синтаксису в Си - просто хочу детально во всем разобраться с вашей помощью, а не с помощью учебников - мне с ними гораздо дольше сидеть придется, пока выцежу то, что мне надо...(
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;
}
потом вы просто можете использовать эту функцию у себя в программе
скажем
Подскажите, что не нравится CodeVision при компиляции. Что то с библиотекой 1wire.h или еще чего не хватает? Программа для МК Atmega16.
P.S. программирование у меня на 2 с минусом...
В CodeVision 2.05 действительно отсутствовали некоторые библиотеки. Перешел на 1.25, дает только одну ошибку, причем строка 36 день недели вторник. Непонятно, что ему не нравится? Вложил скрин.
А почему бы ему не ругаться, если вы инициализируете массив [7][12], первые два у вас по 12 элементов, а во вторнике только 7... Ессно он будет ругаться. Нужно все дополнить до 12 либо изменить структуру программы вообще (это лучше).
awawaw писал(а):Вообщем нужна помощь.
При компиляции возникает ошибка: Linker error: the program has no 'main' function.
При этом в ранее рабочих программах эта ошибка тоже возникает.
После переустановки CV AVR ошибка исчезает. Версия 2.05.2
Помогите советом, недоело переустанавливать.
это сообщение происходит тогда когда codevision установлен в папках имя которых содержат пробел или русские буквы
ставте всегда эту хрень в корень диска
с:\cvavreval
d:\cvavreval
e:\cvavreval