Перейти к содержанию
    

Сбылась мечта идиота - приехали программатор и SAM7S256

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

 

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

 

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

 

Я так понял, что дело не только в этом - компилятору само объявление ассемблерной строки не понравилось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Компилим в 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 писать эти несколько строк - совсем никчему с этими диалектами разбираться в подавляющем большинстве случае.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для 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--);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это оболочка поддерживающая разные компиляторы. А компилятор Вы не назвали

 

Не знаю, там ли я смотрю: 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 - добавляю нужный хидер.

 

Компилятор все равно выдает ту же ошибку. ВОпрос - где он ищет этот хидер? Как заставить его искать в корневой папке проекта?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ВОпрос - где он ищет этот хидер? Как заставить его искать в корневой папке проекта?

Project / Options for ... / C/C++ / IncludePath ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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,

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Изменено пользователем zheka

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Да, есть такая шняга.

Решений 2:

- изменить вид шрифта для комментариев с курсива на прямой

- изменить в ключе реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage значение «1252» на «1251»

Я пользовался первым до недавнего времени. Теперь перешел на второй способ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

#define PROGMEM

добавить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ПРодолжаю экспериментировать.

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 бит с замещением их предыдущего состояния, не трогая остальные биты?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С помощью таймера можно было и в АВР. А можно было и библиотечной функцией

Неужели нет каких-нибудь библиотек?

если нет необходимости отдавать время други тредам (процессам) - я при переносе проекта с 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).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, Геннадий!

Компилятор заругался на 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);        
   }
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, Геннадий!

Компилятор заругался на RAMFUNC_NONILINE. Я этор убрал, заменил CPU_FREQ на MCK и все заработало. Пощупал осциллографом - получилось точно.

 

О! а попробуйте такой вариант расчёта -

 

const int top = timeUS * 1625 / (CPU_FREQ / 100000);

 

Макрос RAMFUNC_NONILINE запрещал подстановку (инлайн) функции и требовал размещения кода в ОЗУ.

Это нужно для работы в конфигурации с основным кодом в более медленном ПЗУ для того, чобы не изменялись расчётные времена. Так что не убирайте, а замените на то, что в Вашем компиляторе делает те же действия.

 

pgm_read_byte в AT91SAM7S заменить на соответствующее обращение к памяти по указателю - этот процессор фон-неймановский, в отличии от гавардского ATMega. (или правильнее писать гарвардский?).

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...