CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Garin
Потрогал лапой паяльник
Сообщения: 351
Зарегистрирован: Пн сен 12, 2011 12:13:46

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

Сообщение 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);
После этой команды на ЖКИ выводится курсор в виде подстрочной не мигающей линии.


но встроить это в свой проект у меня не получается, почемуто бегает мигалка по всему экрану, потому и прошу сделать пример....
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

Garin писал(а):vitalik_1984 я конечно сейчас сделал попытку, из этих частей кода сложить программу, но скомплимировать не получилось, не могли бы вы сделать это в проекте, я в других проектах наблюдаю эти строки

а вы переменные объявили?И почему это Я! должен Вам за вас сделать?
Разве вам самому не интересно?
я и так уже для вас пол дела сделал.Киньте что там не компилируется.

С дисплеем еще не разбирался толком.По встроенным функциям не подскажу.
а примеры можно подсмотреть в проекте Danko
В поисках истины человек развивается.
Аватара пользователя
Garin
Потрогал лапой паяльник
Сообщения: 351
Зарегистрирован: Пн сен 12, 2011 12:13:46

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

Сообщение 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);

курсор подчеркивает нужные цифры....
Аватара пользователя
Volgol_555
Потрогал лапой паяльник
Сообщения: 301
Зарегистрирован: Пт сен 23, 2011 13:13:51
Откуда: Минск
Контактная информация:

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

Сообщение 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-адреса побитно).
И так...ещё раз повторюсь: как правильно записать цикл?
Самое гениальное - всегда самое простое
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

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

Сообщение BCluster »

странный адрес у вас какой-то... там адрес должно быть число int64
Volgol_555 писал(а):if (RomCode[0][0]==C8C520) {}
хоть это и логически неправильно, но чтоб оно хоть компилировалось надо компилятору указать что это шестрадцатиричное число.

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

if (RomCode[0][0]==0xC8C520) {}

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 байта прееделаете если что...
Последний раз редактировалось BCluster Сб янв 07, 2012 01:21:59, всего редактировалось 1 раз.
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

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

Сообщение BCluster »

Volgol_555 писал(а):как правильно записать цикл?
блин и почему вы ЭТО называете циклом?)
Аватара пользователя
Volgol_555
Потрогал лапой паяльник
Сообщения: 301
Зарегистрирован: Пт сен 23, 2011 13:13:51
Откуда: Минск
Контактная информация:

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

Сообщение Volgol_555 »

BCluster писал(а):
Volgol_555 писал(а):как правильно записать цикл?
блин и почему вы ЭТО называете циклом?)

Я это назвал циклом не подумав. Просто оно относится в книгах к той же главе что и "while"...) А вобще верное замечание - это всего лишь условие на самом деле!
Самое гениальное - всегда самое простое
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

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

Сообщение BCluster »

С остальным разобрались?
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

что значит эта команда ?

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

PORTD.0=~PINB.0;
Tell Me The Truth
Аватара пользователя
Volgol_555
Потрогал лапой паяльник
Сообщения: 301
Зарегистрирован: Пт сен 23, 2011 13:13:51
Откуда: Минск
Контактная информация:

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

Сообщение Volgol_555 »

BCluster писал(а):странный адрес у вас какой-то... там адрес должно быть число int64
Volgol_555 писал(а):if (RomCode[0][0]==C8C520) {}
хоть это и логически неправильно, но чтоб оно хоть компилировалось надо компилятору указать что это шестрадцатиричное число.

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

if (RomCode[0][0]==0xC8C520) {}

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;
}
Я так понял к этой функции надо обращаться в основной части программы, но я не умею ещё работать так - сори за возможно тупые вопросы по синтаксису в Си - просто хочу детально во всем разобраться с вашей помощью, а не с помощью учебников - мне с ними гораздо дольше сидеть придется, пока выцежу то, что мне надо...(
Самое гениальное - всегда самое простое
Аватара пользователя
Volgol_555
Потрогал лапой паяльник
Сообщения: 301
Зарегистрирован: Пт сен 23, 2011 13:13:51
Откуда: Минск
Контактная информация:

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

Сообщение Volgol_555 »

FreshMan писал(а):что значит эта команда ?

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

PORTD.0=~PINB.0;

Это значит присвоить порту D.0 инвертированное значение порта B.0
~ - это инверсия
Самое гениальное - всегда самое простое
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

СПАСИБО
Tell Me The Truth
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

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

Сообщение 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...}


}
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

BCluster писал(а):Очень рекомендую вот этот труд: http://www.helloworld.ru/texts/comp/lang/c/c6/index.htm

читаю, читаю понемножку этот манускрипт...., после него начинаю себя чуствовать еще большим идиотом :))
Tell Me The Truth
Аватара пользователя
gosha66
Встал на лапы
Сообщения: 113
Зарегистрирован: Ср май 05, 2010 15:38:04
Откуда: Россия, Белгород

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

Сообщение gosha66 »

Подскажите, что не нравится CodeVision при компиляции. Что то с библиотекой 1wire.h или еще чего не хватает? Программа для МК Atmega16.
P.S. программирование у меня на 2 с минусом...
Вложения
Error.JPG
(90.65 КБ) 366 скачиваний
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

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

Сообщение BCluster »

А данный файл вообще присутсвует у вас?) По идее должен ибо это кусок libc... Но проверьте может куда его задевали...
Аватара пользователя
gosha66
Встал на лапы
Сообщения: 113
Зарегистрирован: Ср май 05, 2010 15:38:04
Откуда: Россия, Белгород

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

Сообщение gosha66 »

В CodeVision 2.05 действительно отсутствовали некоторые библиотеки. Перешел на 1.25, дает только одну ошибку, причем строка 36 день недели вторник. Непонятно, что ему не нравится? Вложил скрин.
Вложения
mega16.JPG
(124.08 КБ) 455 скачиваний
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

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

Сообщение BCluster »

А почему бы ему не ругаться, если вы инициализируете массив [7][12], первые два у вас по 12 элементов, а во вторнике только 7... Ессно он будет ругаться. Нужно все дополнить до 12 либо изменить структуру программы вообще (это лучше).
Аватара пользователя
gosha66
Встал на лапы
Сообщения: 113
Зарегистрирован: Ср май 05, 2010 15:38:04
Откуда: Россия, Белгород

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

Сообщение gosha66 »

BCluster Спасибо, буду дальше тренироваться.
Аватара пользователя
selevo
Открыл глаза
Сообщения: 41
Зарегистрирован: Чт ноя 26, 2009 13:44:03
Откуда: Ижевск
Контактная информация:

Re: Повторяющаяся ошибка в CV AVR

Сообщение selevo »

awawaw писал(а):Вообщем нужна помощь.
При компиляции возникает ошибка: Linker error: the program has no 'main' function.
При этом в ранее рабочих программах эта ошибка тоже возникает.
После переустановки CV AVR ошибка исчезает. Версия 2.05.2
Помогите советом, недоело переустанавливать.


это сообщение происходит тогда когда codevision установлен в папках имя которых содержат пробел или русские буквы
ставте всегда эту хрень в корень диска
с:\cvavreval
d:\cvavreval
e:\cvavreval
Ответить

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