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

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

Компилятор ругается на функцию pgm_read_byte (оригинальный проект вроде бы под WinAVR). Как вызвать эту функцию в KEIL?

Подумайте сначала, зачем ее вызывать. Поле памяти-то общее.

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


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

Блин, zheka, ну ведь дал же я образец переноса проекта... скачайте, посмотрите как сделано... Эти все вопросы там сделаны...

 

typedef uint32_t prog_uint32_t;
typedef char prog_char;
#define PROGMEM /* */
#define pgm_read_byte(val) ((unsigned char) (* (val)))

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

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


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

#define PROGMEM /* */

 

Это для игнорирования компилятором? Я уже и так все поубирал)))

А вот #define pgm_read_byte(val) ((unsigned char) (* (val))) помогло - в смысле компилятор не ругается. Проверить пока не могу - нет дисплея.

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


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

Но все равно мне не дает покоя - как одной командой на однородно настроенном порту записать данные в первые 8 бит с замещением их предыдущего состояния, не трогая остальные биты?

 

Зачем "однородно" настраивать?

Выделите в порту те биты, которые работают шиной - в регистр PIO_OWER запишите единицы в эти биты.

Это сделать при настройке.

А в "быстрой" части программы писать в регистр PIO_ODSR нужное значение.

Битики стробов и адресов дёргать через PIO_SODR и PIO_CODR

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


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

Я так и сделал.

 

Кстати, слышал я байку, будто бы ногодрыганье на SAM7 возможно на частоте всего 3 МГц, и это якобы меньше чем в АВР. Это правда?

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


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

Я так и сделал.

 

Кстати, слышал я байку, будто бы ногодрыганье на SAM7 возможно на частоте всего 3 МГц, и это якобы меньше чем в АВР. Это правда?

 

в том проекте, на который я ссылаюсь, есть кусочек теста скорости.

Находящийся в ОЗУ (тактовая - 48 МГц, 1WS) кусочек кода переключает состояние выхода. Минимальный интервал между изменениями состояния - около 55 наносекунд. Максимальный побольше (переход в цикле добавляет пару тактов). Частота сигнала на выводе получается 8 с чем-то мегагерц.

Это в процессоре питаемом от 3.3 вольта - атмеги при этом тактовую 8 МГц позволяют. Надо бы конечно и потребление сраавнить. Но мне кажется, удобства программирования (фон-нейман! 32-бита арифметика!) велики.

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


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

Кстати, слышал я байку, будто бы ногодрыганье на SAM7 возможно на частоте всего 3 МГц, и это якобы меньше чем в АВР. Это правда?

3 такта на запись в порт, так что теоретический предел - MCK/6.

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


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

Для сравнения.

Для STM32F103, чуть-чуть измененный код, по сравнению с тем, что уже приводил (чтобы получить скважность 50%)

  while (1) {
    GPIOB->BSRR = 0x0002;
    __nop(), __nop(), __nop();
    GPIOB->BRR = 0x0002;

Лично видел осциллографом на ноге частоту 6.0 MHz. Т.е., 12 тактов. А в симуляторе было 10. На записи в порт приходилось по 2 такта, на переход 3 такта, nop'ы по 1 такту. И два такта добавились при чтении команды из flash.

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


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

Для сравнения.

Для STM32F103, чуть-чуть измененный код, по сравнению с тем, что уже приводил (чтобы получить скважность 50%)

  while (1) {
    GPIOB->BSRR = 0x0002;
    __nop(), __nop(), __nop();
    GPIOB->BRR = 0x0002;

Лично видел осциллографом на ноге частоту 6.0 MHz. Т.е., 12 тактов. А в симуляторе было 10. На записи в порт приходилось по 2 такта, на переход 3 такта, nop'ы по 1 такту. И два такта добавились при чтении команды из flash.

Хе, на LPC1768 на 100 МГц ногодрыжством организован 8 битный CPU интерфейс для LCD.

Макс. частота строба получается около 9 МГц - за 17 миллисекунд производится заливка 320*240 пикселей 16 бит.

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


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

Хе, на LPC1768 на 100 МГц ногодрыжством организован 8 битный CPU интерфейс для LCD.

Макс. частота строба получается около 9 МГц - за 17 миллисекунд производится заливка 320*240 пикселей 16 бит.

Пропорция примерно та же - 11,11. Потому что архитектура близкая. А 100 MHz тактовой частоты - конечно лучше, кто ж спорит.

К тому же, у меня есть еще 3 nop'а. Я просто показал, на что можно рассчитывать с этим процессором.

upd. А на MCO я вывел все 36 MHz :)

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


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

Таки делаю успехи - уже получается выводить на экран дисплея от NOKIA 6280 (QVGA 320x240) текст. Правда медленно как-то получается.

 

Скажите, одинаковы ли по количеству тактов два этих варианта или нет?

 

1. ...SODR=(1<<4);

2. ... SODR=0x10;

 

При условии что эти операции прописаны в #define. Короче вот так:

// первый вариант
#define CS_ON AT91C_BASE_PIOA->PIO_SODR=(1<<4);

int void main()
{
CS_ON;
}


// второй вариант
#define CS_ON AT91C_BASE_PIOA->PIO_SODR=0x10;

int void main()
{
CS_ON;
}

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


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

Скажите, одинаковы ли по количеству тактов два этих варианта или нет?

 

1. ...SODR=(1<<4);

2. ... SODR=0x10;

Абсолютно. При том, что компилятор превращает константное выражение (1<<4) в 0x10, а потом он же или ассемблер может задействовать сдвигатель и превратить 0x10 обратно в сдвиг 1 на 4 разряда.

P.S. А скомпилировать оба варианта и в листинг посмотреть?

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


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

P.S. А скомпилировать оба варианта и в листинг посмотреть?

Лучше в симулятор

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


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

эээ... понимаете... сижу я на работе. Работы сегодня нет. Отладочная плата дома. Фантазирую. ДОма конечно же посмотрю в листинг.

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


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

Лучше в симулятор
Да там и в листинге будут видны две идентичные команды.

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


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

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

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

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

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

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

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

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

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

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