zheka 1 15 мая, 2010 Опубликовано 15 мая, 2010 · Жалоба А чем компилим-то? Компилим в KEIL uVisioin4. для ARM надо subs r0, r0, #1 и bne Я так понял, что дело не только в этом - компилятору само объявление ассемблерной строки не понравилось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 15 мая, 2010 Опубликовано 15 мая, 2010 · Жалоба Компилим в KEIL uVisioin4. Это оболочка поддерживающая разные компиляторы. А компилятор Вы не назвали :(. Для ARM: __asm void __loopx( unsigned long cnt ) { subs r0, r0, #1; bne __loopx; bx lr; } для GCC: void __attribute__((naked)) __loopx( unsigned long cnt ) { __asm(" subs r0, r0, #1\n" " bne __loopx\n" " bx lr"); } Ну а лучше, как уже писал где-нибудь в чисто ASM писать эти несколько строк - совсем никчему с этими диалектами разбираться в подавляющем большинстве случае. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 15 мая, 2010 Опубликовано 15 мая, 2010 · Жалоба Для Cortex у меня есть такая штука. Ассемблер тут ни к чему, я думаю. /*! ******************************************************************************* * @brief Delay (in sec) * @details Программа задержки * @note предполагается частота процессора 72000000 Hz \n * при задержке до 3.640 ms программа занимает 3 команды \n * при большей задержке используется 4-5 команд ассемблера * @param TIME - время в секундах (максимум 238.609 сек) * @return нет *******************************************************************************/ #define Delay(TIME) for (uint32 i = (72000000 / 4 * TIME); i; i--); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 15 мая, 2010 Опубликовано 15 мая, 2010 · Жалоба Это оболочка поддерживающая разные компиляторы. А компилятор Вы не назвали Не знаю, там ли я смотрю: Project->manage->Components,Environments,Books->Вкладка Folders,Extensions и две галки - "Use RealView COmpiler" и "Use GNU COmpiler". У меня выбран RealView. ЕЩе один вопрос: в папке с проектом у меня есть хидер. ПОдключаю его #include "TimesNR_8.h" КОмпилятор пишет: "Blinky.c(14): error: #5: cannot open source input file "TimesNR_8.h": No such file or directory" Ковыряюсь, лезу в Project->manage->Components,Environments,Books->Project COmponents. Там выбираю Project targets - SAM7 RAM ULINK; Groups - Source COde; Files - добавляю нужный хидер. Компилятор все равно выдает ту же ошибку. ВОпрос - где он ищет этот хидер? Как заставить его искать в корневой папке проекта? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 15 мая, 2010 Опубликовано 15 мая, 2010 · Жалоба ВОпрос - где он ищет этот хидер? Как заставить его искать в корневой папке проекта? Project / Options for ... / C/C++ / IncludePath ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 15 мая, 2010 Опубликовано 15 мая, 2010 · Жалоба VIKO спасибо, помогло. Смотрим дальше, что ему не нравится: #define TimesNR_8_WIDTH 10 #define TimesNR_8_HEIGHT 8 const char TimesNR_8[] PROGMEM = { // В ЭТОЙ СТРОКЕ ОШИБКА: "..\..\..\..\Examples\Blinky\TimesNR_8.h(7): error: #65: expected a ";" " 0x04, 0x1E, 0x0A, 0x08, 0x01, 0x20, 0xFF, 0x05, 0x03, 0x03, 0x05, 0x05, 0x06, 0x05, 0x01, 0x02, 0x02, 0x05, 0x05, 0x01, 0x05, 0x01, 0x05, Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 15 мая, 2010 Опубликовано 15 мая, 2010 · Жалоба PROGMEM уберите, это от АВР. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 15 мая, 2010 Опубликовано 15 мая, 2010 (изменено) · Жалоба Получилось. Идем дальше... Еще такой вопросец, а как перенести из текстового файла в KEIL русский текст? В файле были русские комментарии, при включении в KEIL видны крякозяблики. Изменено 15 мая, 2010 пользователем zheka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 15 мая, 2010 Опубликовано 15 мая, 2010 · Жалоба Еще такой вопросец, а как перенести из текстового файла в KEIL русский текст? В файле были русские комментарии, при включении в KEIL видны крякозяблики. Да, есть такая шняга. Решений 2: - изменить вид шрифта для комментариев с курсива на прямой - изменить в ключе реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage значение «1252» на «1251» Я пользовался первым до недавнего времени. Теперь перешел на второй способ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 15 мая, 2010 Опубликовано 15 мая, 2010 · Жалоба PROGMEM уберите, это от АВР. Если таскать исходники туда сюда, то лучше #define PROGMEM добавить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 15 мая, 2010 Опубликовано 15 мая, 2010 · Жалоба Да, есть такая шняга. есть в XP, в 7 нет (по крайней мере - W7 x64) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 15 мая, 2010 Опубликовано 15 мая, 2010 · Жалоба ПРодолжаю экспериментировать. unsigned char data[8] = {0xFF,0xAA,0xBB,0x00,0x80,0x7F,0x5B,0xAC}; ................................................................................ ................................. // Enable the Clock of the PIO AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOA; // Configure the PIO Lines corresponding to LED1..LED4 as Outputs AT91C_BASE_PIOA->PIO_PER = 0xFFFFFFFF; AT91C_BASE_PIOA->PIO_OER = 0xFFFFFFFF; AT91C_BASE_PIOA->PIO_OWER = 0xFFFFFFFF; AT91C_BASE_PIOA->PIO_ODSR =0xAA00AA00; while(1) { for(i=0;i<8;i++) { AT91C_BASE_PIOA->PIO_ODSR |= data[i]; wait(); } } Я включил в нужном мне сочетании биты 8-31, а в биты 0-7 хочу в цикле писать байт data, не меняя остальные биты. Так как я сделал, не получается, последующий байт миксуется с предыдущим. Как сделать это, манипулируя OWER я догадываюсь. А можно это сделать изменив лишь строку AT91C_BASE_PIOA->PIO_ODSR |= data; Хм.. то что я хотел получилось так: AT91C_BASE_PIOA->PIO_PER = 0xFFFFFFFF; AT91C_BASE_PIOA->PIO_OER = 0xFFFFFFFF; AT91C_BASE_PIOA->PIO_OWER = 0x000000FF; AT91C_BASE_PIOA->PIO_SODR =0xAA00AA00; while(1) { for(i=0;i<8;i++) { AT91C_BASE_PIOA->PIO_ODSR = data[i]; wait(); } } Но все равно мне не дает покоя - как одной командой на однородно настроенном порту записать данные в первые 8 бит с замещением их предыдущего состояния, не трогая остальные биты? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 15 мая, 2010 Опубликовано 15 мая, 2010 · Жалоба С помощью таймера можно было и в АВР. А можно было и библиотечной функцией Неужели нет каких-нибудь библиотек? если нет необходимости отдавать время други тредам (процессам) - я при переносе проекта с ATMega на AT91SAM7S сделал просто так: // for 48 MHz CPU clock, execute from RAM rom with 1 read wait state // void RAMFUNC_NONILINE _delay_us(int timeUS) { // CPU_FREQ / 6500000 = 7 const int top = timeUS * 25 / (CPU_FREQ / 6500000); volatile int n; for (n = 0; n < top; ++ n) { } } // exactly as required // void _delay_ms(int timeMS) { volatile int n; for (n = 0; n < timeMS; ++ n) { _delay_us(1000); } } а вообще - пример переноса проекта в аттачменте (продолжает работать и на атмеге и на ARM). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 15 мая, 2010 Опубликовано 15 мая, 2010 · Жалоба Спасибо, Геннадий! Компилятор заругался на RAMFUNC_NONILINE. Я этор убрал, заменил CPU_FREQ на MCK и все заработало. Пощупал осциллографом - получилось точно. Почти перенес нужный мне проект. Компилятор ругается на функцию pgm_read_byte (оригинальный проект вроде бы под WinAVR). Как вызвать эту функцию в KEIL? Какой хидер подключить, или может есть аналоги? ПРимер использования ее в проекте: void lcd_bitmap(uint8_t *data) { uint16_t x,y; uint16_t bmp_x = (pgm_read_byte(data++) << 8) + pgm_read_byte(data++); uint16_t bmp_y = (pgm_read_byte(data++) << 8) + pgm_read_byte(data++); lcd_set_window(lcd_window.X1, lcd_window.Y1, lcd_window.X2, lcd_window.Y2); lcd_write_byte(RAMWR,0); for(y = 0; y < bmp_y; y++) for(x = 0; x < bmp_x; x++) { lcd_write_byte(pgm_read_byte(data++), 1); lcd_write_byte(pgm_read_byte(data++), 1); lcd_write_byte(pgm_read_byte(data++), 1); } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 15 мая, 2010 Опубликовано 15 мая, 2010 (изменено) · Жалоба Спасибо, Геннадий! Компилятор заругался на RAMFUNC_NONILINE. Я этор убрал, заменил CPU_FREQ на MCK и все заработало. Пощупал осциллографом - получилось точно. О! а попробуйте такой вариант расчёта - const int top = timeUS * 1625 / (CPU_FREQ / 100000); Макрос RAMFUNC_NONILINE запрещал подстановку (инлайн) функции и требовал размещения кода в ОЗУ. Это нужно для работы в конфигурации с основным кодом в более медленном ПЗУ для того, чобы не изменялись расчётные времена. Так что не убирайте, а замените на то, что в Вашем компиляторе делает те же действия. pgm_read_byte в AT91SAM7S заменить на соответствующее обращение к памяти по указателю - этот процессор фон-неймановский, в отличии от гавардского ATMega. (или правильнее писать гарвардский?). Изменено 15 мая, 2010 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться