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

Обсуждаем контроллеры компании Atmel.
Ответить
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

unalex, Вы бы проверили для начала свой код, а потом бы уже утверждали. Не будет Ваш код работать.
Поясню.
Без макросов (которые, кстати, просто-напросто тупо заменяют текст), Ваш код будет выглядеть примерно так:

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

for(i=0;i<8;i++){
  x##i();
  y##i();
}
Как Вы думаете, что произойдёт ? :)
Контактная информация:
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

Аlex писал(а):Как Вы думаете, что произойдёт
почитайте про конкатенацию(объединение строк)
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Символом "##" строки объединяются на этапе компиляции препроцессором, а не на этапе выполнения программы :)
Этот код тупо превратится в этот :

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

for(i=0;i<8;i++){
  xi();
  yi();
}
И затем компилятор обматерит программера, что он забыл где-то в коде написать тела функций xi и yi :)
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

Аlex писал(а):Символом "##"строки объединяются на этапе компиляции препроцессором, а не на этапе выполнения программы
вот с этим полностью согласен, упустил из виду

но хоть с решетками разобрались
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Реклама
Эиком - электронные компоненты и радиодетали
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

тогда вижу наиболее подходящим ваш метод, с указателями на функции

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

void x0();
void x1();
//...

int main (void)
{
	void(*array[2])();

	array[0] = x0;
	array[1] = x1;

	for(unsigned char i = 0; i < 2; i++)
	{
		array[i]();
	}

	return 0;
}
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Ну да, это пожалуй единственный способ. Можно ещё массив заполнить указателями при объявлении, тогда вообще получится всё в одну строку и компактно.

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

void x0(), x1(), x2(), x3(), x4(), x5(), x6(), x7(), x8();
void(*array[])() = {x0, x1, x2, x3, x4, x5, x6, x7, x8};

........
........

for( i = 0; i < 8; i++){
   array[i]();
}
вот как-то примерно так...
Контактная информация:
Реклама
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

Сообщение Сериг »

День!
4-х лапые,подскажите пожалуйста!
Работаю с дисплеем wh2004,создал свои символы,записал их в память дисплея.
В чем проблема:
Формирую выводимый текст с помощью функции "sprintf();",как мне вывести в этой же функции символ,который я записал дисплей?
Спасибо!
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Вопрос немного непонятен. Что означает фраза
символ,который я записал дисплей
?
Какой Вы символ хотите вывести ?
Контактная информация:
Родился
Сообщения: 13
Зарегистрирован: Вс июн 14, 2009 00:34:38

Сообщение hubble »

Здравствуйте.
Есть такая проблема.
Имеется проект для работы с SD-картой. Практически из хелпа к CodeVision. Main-файл простейший. Файл в том виде, который приложил во вложении, SD-карту открывает в режиме отладки в Proteus . Время читается и записывается на флешку. Как только раскомментировать строки инициализации порта А (строки 81-86), SD-карта открываться отказывается (в Proteus) и заходит в ошибку. В общем, если comment/uncomment строки 81-86, то станем ясно, что/когда не работает. Почему я привязался к инициализации порта? В моем проекте необходимо управлять направлением передачи в mcu/из mcu по одним и тем же пинам.

CodeVisionAVR 2.05.3 Standart

Не могу разобраться, в чем дело.
Прошу помощи.
Вложения
err.rar
(226.52 КБ) 146 скачиваний
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

закоротите PA0 на землю (логический "0") и будет вам счастье
Родился
Сообщения: 13
Зарегистрирован: Вс июн 14, 2009 00:34:38

Сообщение hubble »

Спасибо. Это помогло.
Но в моем схеме (не тестовой) будет задействован этот pin (вернее, весь порт А) на вход. Посадил PA0 через резистор 1к на землю.

P.S. Поднял datasheet. Не смог найти, почему необходимо сделать так? Подскажите, пожалуйста.
Последний раз редактировалось hubble Пт авг 16, 2013 09:15:23, всего редактировалось 2 раза.
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

У вас там в настройках проекта этот пин использован для сигнала /CD (card detect). Этот пин проверяется в прерывании таймера с частотой 100 Гц (если не ошибаюсь), если там "1" (должен быть подтянут к +U резистором, в хэлпе схема ) - значит карты нет в картоприемнике. Еще обратите внимание на сигнал WP.
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

Сообщение Сериг »

Аlex писал(а):Вопрос немного непонятен. Что означает фраза
символ,который я записал дисплей
?
Какой Вы символ хотите вывести ?
Тот,который я записал в память дисплей,ему в память. Что бы вывести мне один символ в простом режиме,я посылаю команду вывести на позицию содержимое ечейки памяти под номером 9 : lcd_putchar(9);
Я могу в функции sprintf() вывести содержимое ячейки 9?
Встал на лапы
Сообщения: 107
Зарегистрирован: Сб июл 27, 2013 10:52:37
Откуда: Украина

Сообщение Aмstroн »

Сериг писал(а):Я могу в функции sprintf() вывести содержимое ячейки 9?
Никогда! вплоть до 8 символа, ДА.
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

Сообщение Сериг »

Ок,спасибо! Каким образом выводить символы хотя бы до 8?
Родился
Сообщения: 13
Зарегистрирован: Вс июн 14, 2009 00:34:38

Сообщение hubble »

Здравствуйте.
Есть проблема по SD-карте.
Условие if ((res = f_write(&file, byte, sizeof(byte), &nbytes)) == FR_OK) каждый 64 раз (count = 64) выполняется не десятки микросекунд, а пару миллисекунд. Первая проверка условия также занимает миллисекунды ?????. В моем проекте это НЕ ПРИЕМЛЕМО!!!. Понял только то, что это начинается новый сектор (64 * 8 = 512 байт). Все, что смог себе предложить, так это принудительно переходить на следующий сектор (в программе закомментировано). Это не помогло.
Прошу помощи в решении этого вопроса.
Заранее благодарен.
Вложения
err2.rar
(227.39 КБ) 149 скачиваний
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

А может попробовать карту классом повыше?
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

не, ну все правильно - между секторами происходит поиск готовности и считывание 2 байт кс, не 2 миллисекунды, правда, а микросекунд 150 -200 набегало. Буфер спасет. Кольцевой который.
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Вт авг 26, 2008 00:38:28
Откуда: г. Бобруйск

Сообщение fan2005 »

Добрый день, котаны!
Написал прогу в CVAVR 1.25.9 для ATmega8, управляет двумя релюшками в зависимости от положения 4-х датчиков (оптопары по входу МК). Программа почти работает так как нужно, но периодически включает, то не ту релюшку, то датчика не видит.... Начал тестировать в VMlab'е и появились ошибки типа:" SBIC instruction: bit in I/O=X (unknown)". Я так понимаю что жалуется на то что я в программе часто использую PIN_X.n.... Как можно исправить баг?
все мы учились - чему-нибудь и как-нибудь
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Сообщение demiurg301 »

Здраствуйте.
У кого нибудь есть кряк на CV, чтобы открыть 64 битные типы данных?

Или подскажите как реализовать на ASM или С эти форматы. Перерыд тырнеты. Ничего конкретного нету.
Ответить

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