реклама на сайте
подробности

 
 
9 страниц V  « < 5 6 7 8 9 >  
Reply to this topicStart new topic
> Сбылась мечта идиота - приехали программатор и SAM7S256, Теперь нужен ликбез.
zheka
сообщение May 15 2010, 07:38
Сообщение #91


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Цитата
А чем компилим-то?


Компилим в KEIL uVisioin4.

Цитата
для ARM надо subs r0, r0, #1 и bne


Я так понял, что дело не только в этом - компилятору само объявление ассемблерной строки не понравилось.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 15 2010, 07:59
Сообщение #92


Гуру
******

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



Цитата(zheka @ May 15 2010, 10:38) *
Компилим в KEIL uVisioin4.

Это оболочка поддерживающая разные компиляторы. А компилятор Вы не назвали sad.gif.
Для 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
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 15 2010, 08:02
Сообщение #93


Универсальный солдатик
******

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



Для 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--);
Go to the top of the page
 
+Quote Post
zheka
сообщение May 15 2010, 08:09
Сообщение #94


Гуру
******

Группа: Участник
Сообщений: 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 - добавляю нужный хидер.

Компилятор все равно выдает ту же ошибку. ВОпрос - где он ищет этот хидер? Как заставить его искать в корневой папке проекта?
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 15 2010, 08:18
Сообщение #95


Универсальный солдатик
******

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



Цитата(zheka @ May 15 2010, 11:09) *
ВОпрос - где он ищет этот хидер? Как заставить его искать в корневой папке проекта?

Project / Options for ... / C/C++ / IncludePath ...
Go to the top of the page
 
+Quote Post
zheka
сообщение May 15 2010, 08:30
Сообщение #96


Гуру
******

Группа: Участник
Сообщений: 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,
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение May 15 2010, 08:33
Сообщение #97


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



PROGMEM уберите, это от АВР.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
zheka
сообщение May 15 2010, 08:36
Сообщение #98


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Получилось. Идем дальше...

Еще такой вопросец, а как перенести из текстового файла в KEIL русский текст? В файле были русские комментарии, при включении в KEIL видны крякозяблики.

Сообщение отредактировал zheka - May 15 2010, 08:48
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 15 2010, 10:47
Сообщение #99


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 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»
Я пользовался первым до недавнего времени. Теперь перешел на второй способ.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 15 2010, 11:05
Сообщение #100


Гуру
******

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



Цитата(AHTOXA @ May 15 2010, 11:33) *
PROGMEM уберите, это от АВР.

Если таскать исходники туда сюда, то лучше
Код
#define PROGMEM

добавить.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
toweroff
сообщение May 15 2010, 11:14
Сообщение #101


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(ViKo @ May 15 2010, 14:47) *
Да, есть такая шняга.

есть в XP, в 7 нет (по крайней мере - W7 x64)
Go to the top of the page
 
+Quote Post
zheka
сообщение May 15 2010, 13:04
Сообщение #102


Гуру
******

Группа: Участник
Сообщений: 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 бит с замещением их предыдущего состояния, не трогая остальные биты?
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение May 15 2010, 17:08
Сообщение #103


Профессионал
*****

Группа: Участник
Сообщений: 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).
Go to the top of the page
 
+Quote Post
zheka
сообщение May 15 2010, 18:36
Сообщение #104


Гуру
******

Группа: Участник
Сообщений: 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);        
   }
}
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение May 15 2010, 18:40
Сообщение #105


Профессионал
*****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post

9 страниц V  « < 5 6 7 8 9 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 19:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.01507 секунд с 7
ELECTRONIX ©2004-2016