Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 03.08.2010, 11:27  
rear
Вид на жительство
 
Аватар для rear
 
Регистрация: 30.12.2006
Адрес: Junktown
Сообщений: 300
Сказал спасибо: 164
Сказали Спасибо 171 раз(а) в 59 сообщении(ях)
rear на пути к лучшему
По умолчанию Вопросы по AVR-LIBС

Помогите разобраться
в библиотеке pgmspace.h есть функция, обьявленная так:
extern int memcmp_P(const void *, PGM_VOID_P, size_t) __ATTR_PURE__;

она сравнивает строку в RAM из строкой в FLASH

как ее использовать в своей программе?
например:
PHP код:
const PROGMEM uint8_t _leda[] = "LEDA";
...
int main(void){
    
uint8_t buffer[buf_size];
    
int res
    
....
    
res memcmp_P  ??? -- что здесь должно быть
Реклама:
__________________
Всегда стремись к недоступному
rear вне форума  
Непрочитано 03.08.2010, 12:27  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Вопросы по AVR-LIBС

Как параметры ей передаются два указателя и размер сравниваемой области памяти в байтах.
Код:
uint8_t PROGMEM Text1[] = "RIGHT";
uint8_t PROGMEM Text2[] = "LEFT";

uint8_t Text[10];
...
if(memcmp_P(Text,Text1,5) ... // в Text лежит "RIGHT"
if(memcmp_P(Text,Text2,4) ... // в Text лежит "LEFT"
В Вашем варианте:
Код:
res = memcmp_P(buffer,_leda,4);
//Можно воспользоваться strlen_P для определения размера строки, если именно строки сравниваются
res = memcmp_P(buffer,_leda,strlen_P(_leda));
kison вне форума  
Сказали "Спасибо" kison
rear (03.08.2010)
Непрочитано 12.08.2010, 16:40  
rear
Вид на жительство
 
Аватар для rear
 
Регистрация: 30.12.2006
Адрес: Junktown
Сообщений: 300
Сказал спасибо: 164
Сказали Спасибо 171 раз(а) в 59 сообщении(ях)
rear на пути к лучшему
По умолчанию Re: Вопросы по AVR-LIBС

Есть еще один вопрос:
Например, есть у нас строка, помещенная в флеш:
Код:
const uint8_t PROGMEM some_data[] = "SOME DATA\n";
Также есть указатель:

Код:
PGM_P pMessage;
Нужно выгрузить все элементы строки в порт, правильно ли делать это таким образом:
Код:
pMessage = some_data;
while (pgm_read_byte_near(pMessage) != 0)
	PORTA = pgm_read_byte_near(pMessage++);  // ?
Можно ли это сделать более оптимальным способом?
__________________
Всегда стремись к недоступному
rear вне форума  
Непрочитано 13.08.2010, 15:08  
neiver
Временная регистрация
 
Регистрация: 30.07.2007
Сообщений: 51
Сказал спасибо: 1
Сказали Спасибо 12 раз(а) в 7 сообщении(ях)
neiver на пути к лучшему
По умолчанию Re: Вопросы по AVR-LIBС

Сообщение от rear Посмотреть сообщение
Код:

Код:
pMessage = some_data;
while (pgm_read_byte_near(pMessage) != 0)
	PORTA = pgm_read_byte_near(pMessage++);  // ?
Можно ли это сделать более оптимальным способом?
как-то так:

Код:
	uint8_t c;
	PGM_P pMessage;
	pMessage = some_data;
	while (c = pgm_read_byte_near(pMessage++) != 0)
		PORTA = c;
neiver вне форума  
Сказали "Спасибо" neiver
rear (13.08.2010)
Непрочитано 13.08.2010, 15:45  
rear
Вид на жительство
 
Аватар для rear
 
Регистрация: 30.12.2006
Адрес: Junktown
Сообщений: 300
Сказал спасибо: 164
Сказали Спасибо 171 раз(а) в 59 сообщении(ях)
rear на пути к лучшему
По умолчанию Re: Вопросы по AVR-LIBС

Спасибо, это то что нужно!
вопросов будет наверно еще много...
__________________
Всегда стремись к недоступному
rear вне форума  
Непрочитано 08.10.2010, 19:38  
rear
Вид на жительство
 
Аватар для rear
 
Регистрация: 30.12.2006
Адрес: Junktown
Сообщений: 300
Сказал спасибо: 164
Сказали Спасибо 171 раз(а) в 59 сообщении(ях)
rear на пути к лучшему
По умолчанию Re: Вопросы по AVR-LIBС

Уважаемые товарищи, подскажите, пожалуйста, еще по такому вопросу -
настройка SPI на двойную скорость передачи:
Код:
PORTB |= (1 ‹‹ PB6) | (1 ‹‹ PB4) | (1 ‹‹ PB3);
DDRB |= (1 ‹‹ PB3) | (1 ‹‹ PB4) | (1 ‹‹ PB5) | (1 ‹‹ PB7);

// master mode and Fosc/2 clock:
SPCR = (1‹‹SPE)|(1‹‹MSTR);
SPSR |= (1‹‹SPI2X);
МК - АТмега162

При симуляции в AVRStudio и VMlab скорость интерфейса отображается как fosc/4
Почему? Что-то не так в инициализации?
****
upd - это баг симуляторов....
__________________
Всегда стремись к недоступному

Последний раз редактировалось rear; 12.10.2010 в 09:27.
rear вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AVR JTAGICE MKII - проблемы firmware... Luxurious AVR 25 20.10.2014 10:50
БИНС на AVR grisha109 Микроконтроллеры, АЦП, память и т.д 30 15.06.2011 16:08


Часовой пояс GMT +4, время: 03:54.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot