|
|
  |
Сбылась мечта идиота - приехали программатор и SAM7S256, Теперь нужен ликбез. |
|
|
|
May 15 2010, 19:35
|

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

|
Цитата(zheka @ May 15 2010, 17:04)  Но все равно мне не дает покоя - как одной командой на однородно настроенном порту записать данные в первые 8 бит с замещением их предыдущего состояния, не трогая остальные биты? Зачем "однородно" настраивать? Выделите в порту те биты, которые работают шиной - в регистр PIO_OWER запишите единицы в эти биты. Это сделать при настройке. А в "быстрой" части программы писать в регистр PIO_ODSR нужное значение. Битики стробов и адресов дёргать через PIO_SODR и PIO_CODR
|
|
|
|
|
May 15 2010, 20:07
|

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

|
Цитата(zheka @ May 16 2010, 00:00)  Я так и сделал.
Кстати, слышал я байку, будто бы ногодрыганье на SAM7 возможно на частоте всего 3 МГц, и это якобы меньше чем в АВР. Это правда? в том проекте, на который я ссылаюсь, есть кусочек теста скорости. Находящийся в ОЗУ (тактовая - 48 МГц, 1WS) кусочек кода переключает состояние выхода. Минимальный интервал между изменениями состояния - около 55 наносекунд. Максимальный побольше (переход в цикле добавляет пару тактов). Частота сигнала на выводе получается 8 с чем-то мегагерц. Это в процессоре питаемом от 3.3 вольта - атмеги при этом тактовую 8 МГц позволяют. Надо бы конечно и потребление сраавнить. Но мне кажется, удобства программирования (фон-нейман! 32-бита арифметика!) велики.
|
|
|
|
|
May 16 2010, 11:53
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(ViKo @ May 16 2010, 01:58)  Для сравнения. Для 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 бит.
|
|
|
|
|
May 18 2010, 10:15
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Таки делаю успехи - уже получается выводить на экран дисплея от 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; }
|
|
|
|
|
May 18 2010, 10:57
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(zheka @ May 18 2010, 13:15)  Скажите, одинаковы ли по количеству тактов два этих варианта или нет?
1. ...SODR=(1<<4); 2. ... SODR=0x10; Абсолютно. При том, что компилятор превращает константное выражение (1<<4) в 0x10, а потом он же или ассемблер может задействовать сдвигатель и превратить 0x10 обратно в сдвиг 1 на 4 разряда. P.S. А скомпилировать оба варианта и в листинг посмотреть?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|