|
|
  |
Сбылась мечта идиота - приехали программатор и SAM7S256, Теперь нужен ликбез. |
|
|
|
May 15 2010, 07:38
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Цитата А чем компилим-то? Компилим в KEIL uVisioin4. Цитата для ARM надо subs r0, r0, #1 и bne Я так понял, что дело не только в этом - компилятору само объявление ассемблерной строки не понравилось.
|
|
|
|
|
May 15 2010, 07:59
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(zheka @ May 15 2010, 10:38)  Компилим в 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 писать эти несколько строк - совсем никчему с этими диалектами разбираться в подавляющем большинстве случае.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 15 2010, 08:09
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Цитата Это оболочка поддерживающая разные компиляторы. А компилятор Вы не назвали Не знаю, там ли я смотрю: 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 - добавляю нужный хидер. Компилятор все равно выдает ту же ошибку. ВОпрос - где он ищет этот хидер? Как заставить его искать в корневой папке проекта?
|
|
|
|
|
May 15 2010, 08:30
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
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,
|
|
|
|
|
May 15 2010, 10:47
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(zheka @ May 15 2010, 11:36)  Еще такой вопросец, а как перенести из текстового файла в KEIL русский текст? В файле были русские комментарии, при включении в KEIL видны крякозяблики. Да, есть такая шняга. Решений 2: - изменить вид шрифта для комментариев с курсива на прямой - изменить в ключе реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage значение «1252» на «1251» Я пользовался первым до недавнего времени. Теперь перешел на второй способ.
|
|
|
|
|
May 15 2010, 11:05
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(AHTOXA @ May 15 2010, 11:33)  PROGMEM уберите, это от АВР. Если таскать исходники туда сюда, то лучше Код #define PROGMEM добавить.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 15 2010, 13:04
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
ПРодолжаю экспериментировать. Код 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[i]; Хм.. то что я хотел получилось так: Код 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 бит с замещением их предыдущего состояния, не трогая остальные биты?
|
|
|
|
|
May 15 2010, 17:08
|

Профессионал
    
Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634

|
Цитата(zheka @ May 14 2010, 22:29)  С помощью таймера можно было и в АВР. А можно было и библиотечной функцией Неужели нет каких-нибудь библиотек? если нет необходимости отдавать время други тредам (процессам) - я при переносе проекта с 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).
|
|
|
|
|
May 15 2010, 18:36
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Спасибо, Геннадий! Компилятор заругался на 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); } }
|
|
|
|
|
May 15 2010, 18:40
|

Профессионал
    
Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634

|
Цитата(zheka @ May 15 2010, 22:16)  Спасибо, Геннадий! Компилятор заругался на RAMFUNC_NONILINE. Я этор убрал, заменил CPU_FREQ на MCK и все заработало. Пощупал осциллографом - получилось точно. О! а попробуйте такой вариант расчёта - Код const int top = timeUS * 1625 / (CPU_FREQ / 100000); Макрос RAMFUNC_NONILINE запрещал подстановку (инлайн) функции и требовал размещения кода в ОЗУ. Это нужно для работы в конфигурации с основным кодом в более медленном ПЗУ для того, чобы не изменялись расчётные времена. Так что не убирайте, а замените на то, что в Вашем компиляторе делает те же действия. pgm_read_byte в AT91SAM7S заменить на соответствующее обращение к памяти по указателю - этот процессор фон-неймановский, в отличии от гавардского ATMega. (или правильнее писать гарвардский?).
Сообщение отредактировал Genadi Zawidowski - May 15 2010, 18:43
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|