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

 
 
> ATMega128 - проблема с SPI Master, при выводе строки видеоизображения
Lisitsin
сообщение Oct 3 2012, 15:35
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 227
Регистрация: 1-10-10
Из: Рязань
Пользователь №: 59 868



Здравствуйте. Помогите разобраться с проблемой ...
Формирую на ATMega128 видеосигнал при помощи SPI. Устанавливаю режим Master, двойная скорость. Одна точка изображения занимает два такта. Необходимо выводить байт за байтом непрерывно. Всего 48 байт.
Инициализация:
LDI BUF,(1<<SPE)|(1<<MSTR)|(1<<CPHA); 4
OUT SPCR,BUF ; SPI
LDI BUF,1<<SPI2X ; CONFIGURATION
OUT SPSR,BUF ;
(BUF - временный регистр)
SS устанавливаю на вывод единицы. MOSI устанавливаю на выход.

Начинаю вывод строки:
VSTRLOOP: OUT SPDR,VDATA24 ; 1 - начинаю вывод данных
OUT ATTRPORT,ATTR ; 2 - это вывод аттрибутов цвета изображения
LD VDATA24,X+ ; 4 - читвю из ОЗУ очередной байт данных
LD ATTR,Y+ ; 6 - и очередной аттрибут цвета
NOP ; 7 - выравниваю время нопами
NOP ; 8
NOP ; 9
NOP ; 10
NOP ; 11
NOP ; 12
NOP ; 13
CPI XL,0X40 ; 14 - в конце проверяю на предмет передачи последнего байта
BRNE VSTRLOOP ; 15 /> 16 - цикл
NOP ; 16

Такты подсчитываю в комментариях.

В результате: первый байт передаётся правильно. Второй - не передаётся, вместо него на экране вижу последний переданный бит - белую черту в случае если последним битом была единица и тёмную - если был ноль. Третий байт опять корректный, четвёртый - как второй и так далее до конца строки.
В общем пока не понял что это такое и как добиться задуманного.

Сообщение отредактировал Lisitsin - Oct 3 2012, 16:47


--------------------
с Уважением,
Lisitsin
Vasil.Lisitsin@yandex.ru
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Палыч
сообщение Oct 3 2012, 16:07
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Lisitsin @ Oct 3 2012, 19:35) *
Формирую на ATMega128 видеосигнал при помощи SPI. Устанавливаю режим Master, двойная скорость. Одна точка изображения занимает два такта. Необходимо выводить байт за байтом непрерывно. Всего 48 байт.

ИМХО, это принципиально невозможно. Новые данные в SPDR можно загрузить только после передачи предыдущего байта (т.е. на семнадцатом такте).

Цитата(Lisitsin @ Oct 3 2012, 19:35) *
В результате: первый байт передаётся правильно. Второй - не передаётся, вместо него на экране вижу последний переданный бит - белую черту в случае если последним битом была единица и тёмную - если был ноль. Третий байт опять корректный, четвёртый - как второй и так далее до конца строки.

Эти симптомы подтверждают сказанное мной выше.

Чтобы убедится в этом окончательно - добавьте один NOP к группе пустых операторов в "выравнивании времени". Думаю, что тут же появятся и четные байты, а вот последние пикселы каждого байта будут в полтора раза "длиннее" остальных...
Go to the top of the page
 
+Quote Post
Lisitsin
сообщение Oct 3 2012, 16:12
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 227
Регистрация: 1-10-10
Из: Рязань
Пользователь №: 59 868



Цитата(Палыч @ Oct 3 2012, 20:07) *
ИМХО, это принципиально невозможно. Новые данные в SPDR можно загрузить только после передачи предыдущего байта (т.е. на семнадцатом такте).


Эти симптомы подтверждают сказанное мной выше.

Чтобы убедится в этом окончательно - добавьте один NOP к группе пустых операторов в "выравнивании времени". Думаю, что тут же появятся и четные байты, а вот последние пикселы каждого байта будут в полтора раза "длиннее" остальных...

Так я и передаю следующий байт семнадцатым тактом. Там я в комментариях каждый такт считаю (см. выше). А ноп втыкать пробовал, и не один - результат тот же (в смысле нет результата).


--------------------
с Уважением,
Lisitsin
Vasil.Lisitsin@yandex.ru
Go to the top of the page
 
+Quote Post
Палыч
сообщение Oct 3 2012, 16:18
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Lisitsin @ Oct 3 2012, 20:12) *
Так я и передаю следующий байт семнадцатым тактом.
Нет, шестнадцатым - считать нужно с команды, следующей за OUT SPDR,VDATA24. Вставьте, в конце концов, ещё один NOP и убедитесь, что отображение четных байт появиться...
Go to the top of the page
 
+Quote Post
Lisitsin
сообщение Oct 3 2012, 16:21
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 227
Регистрация: 1-10-10
Из: Рязань
Пользователь №: 59 868



Цитата(Палыч @ Oct 3 2012, 20:18) *
Нет, шестнадцатым - считать нужно с команды, следующей за OUT SPDR,VDATA24. Вставьте, в конце концов, ещё один NOP и убедитесь, что отображение четных байт появиться...

Я их там три штуки пробовал ставить. Ничего. Строчная синхронизация уже слетать начинает. Да и делу это не поможет - мне нужно непрерывное изображение, без затягиваний ...

Сообщение отредактировал Lisitsin - Oct 3 2012, 16:23


--------------------
с Уважением,
Lisitsin
Vasil.Lisitsin@yandex.ru
Go to the top of the page
 
+Quote Post
Палыч
сообщение Oct 4 2012, 02:02
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Lisitsin @ Oct 3 2012, 20:21) *
Я их там три штуки пробовал ставить. Ничего.
Кстати! Возможно, их там и нужно вставить три штуки! Согласно с комментарием к команде
Цитата
LD VDATA24,X+ ; 4 - читвю из ОЗУ очередной байт данных
данные выбираются не из памяти программ (как я это отчего-то подумал), а из ОЗУ. В этом случае команда LD Rd,X+ выполняется за один такт, а таких команд у Вас в программе две.
Но! И в этом случае может быть неудача! Обратите внимание на рисунок "SPI Block Diagram", приведенный в DS. Тактирование SPI осуществляется от делителя сигнала XTAL. C этим сигналом тактирования SPI выполнение Вашей программы нигде не синхронизируется. Т.е. работа SPI при выводе первого байта может начаться не в следующий такт за командой загрузки данных в регистр SPDR, а при поступлении от делителя тактового импульса (поскольку у Вас деление на 2, то больше чем на такт он задержаться не может).
Таким образом, следует добавить в "выравнивание времени" три пустых оператора, и если не изменилась картина на выводе, то перед циклом вывода добавить ещё один пустой оператор для синхронизации с импульсами тактирования SPI.

P.S. Извеняюсь - недодумал... Если вставить в "выравнивание времени" три пустых оператора, то выполнение цикла будет производиться за нечетное число тактов XTAL и произайдёт рассинхронизация с тактовыми импульсами SPI (т.е. цикл должен всегда выполняться за четное число тактов). Следовательно в цикл следует добавить четыре пустых оператора (ну, или, возможно, и два, в чём я лично сомневаюсь).

P.P.S. Я, конечно, понимаю, что Вам не хочется вставлять такое число пустых операторов - последний пиксел, соответствующий последниму биту в байте будет в два раза "длиннее" остальных... Я в своем первом сообщении в этой теме и предупреждал о вероятной невозможности обеспечения непрерывной передачи по SPI. Если Вы намеревались выводить графическую информацию, то, конечно, при таком выводе она будет неприятно искажена. А для вывода символной информации - такой эффект может оказаться маленьким плюсом, если у Вас символы будут иметь ширину 7 пикселов: удвоенный восьмой бит можно использовать как промежуток между символами...
Go to the top of the page
 
+Quote Post
zombi
сообщение Oct 4 2012, 04:47
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(Палыч @ Oct 4 2012, 05:02) *
В этом случае команда LD Rd,X+ выполняется за один такт, а таких команд у Вас в программе две.

Может я кончно чего и не знаю, но согласно DS на мегу128 все LD Rd,X... выполняются минимум за ДВА такта.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Lisitsin   ATMega128 - проблема с SPI Master   Oct 3 2012, 15:35
- - chernenko   я бы проверил осциллографом что там физически выхо...   Oct 3 2012, 15:37
|- - Lisitsin   Цитата(chernenko @ Oct 3 2012, 19:37) я б...   Oct 3 2012, 15:55
|- - Палыч   Цитата(Lisitsin @ Oct 3 2012, 20:21) Я их...   Oct 3 2012, 16:31
||- - Lisitsin   Цитата(Палыч @ Oct 3 2012, 20:31) В том, ...   Oct 3 2012, 16:41
- - ILYAUL   ЦитатаИз 48 байт ... КодCPI XL,0X40 = 64 или первы...   Oct 3 2012, 17:56
- - Maik-vs   Непрерывную строку пикселов выводить не получается...   Oct 4 2012, 09:24
|- - Lisitsin   Спасибо. Да, действительно. Сегодня плотно повозил...   Oct 4 2012, 15:12
- - ILYAUL   А какая частота строчной развёртки?   Oct 5 2012, 08:10
|- - Lisitsin   Цитата(ILYAUL @ Oct 5 2012, 12:10) А кака...   Oct 6 2012, 06:08
|- - Палыч   Цитата(Lisitsin @ Oct 6 2012, 10:08) Имее...   Oct 6 2012, 07:18
- - rx3apf   В новых мегах можно настроить USART как SPI Master...   Oct 5 2012, 20:24
- - rx3apf   Да, и в младших (48/88/168). Если нужно что-то мно...   Oct 6 2012, 08:24
- - ILYAUL   Ну, вот полмысли Вам уже высказали- UART - и это ...   Oct 6 2012, 18:37
|- - Lisitsin   Не, USART не пойдёт. Там старт и стоп биты. Ещё ху...   Oct 7 2012, 07:05
||- - ILYAUL   Цитата(Lisitsin @ Oct 7 2012, 11:05) Там ...   Oct 7 2012, 09:34
|||- - Палыч   Цитата(ILYAUL @ Oct 7 2012, 13:34) Какие ...   Oct 7 2012, 12:43
|||- - Lisitsin   Цитата(Палыч @ Oct 7 2012, 16:43) Не знак...   Oct 7 2012, 14:54
||- - Палыч   Цитата(Lisitsin @ Oct 7 2012, 11:05) ... ...   Oct 8 2012, 15:29
||- - Lisitsin   Цитата(Палыч @ Oct 8 2012, 19:29) Заменит...   Oct 11 2012, 15:34
|- - Палыч   Цитата(ILYAUL @ Oct 6 2012, 22:37) ...дел...   Oct 7 2012, 07:41
- - ILYAUL   А вот Вы меня по настоящему пугаете. Я уж воспольз...   Oct 7 2012, 16:29
|- - Палыч   Цитата(ILYAUL @ Oct 7 2012, 20:29) на ..н...   Oct 7 2012, 16:45
- - ILYAUL   Да нет там ни старта ни стопа. Ну посмотрите внима...   Oct 7 2012, 17:09
|- - Lisitsin   Народ, я уже готов поверить в отсутствие старт/сто...   Oct 7 2012, 17:23
- - Палыч   Цитата(ILYAUL @ Oct 7 2012, 21:09) Вся си...   Oct 7 2012, 17:39
- - ILYAUL   Вот первая из приведённых мной диаграмм - пересыла...   Oct 7 2012, 18:09
|- - Палыч   Цитата(ILYAUL @ Oct 7 2012, 22:09) PIC16F...   Oct 7 2012, 18:16
|- - ILYAUL   Цитата(Палыч @ Oct 7 2012, 22:16) Этот по...   Oct 7 2012, 18:42
- - rx3apf   Примите за данность - синхронный режим в AVR не та...   Oct 7 2012, 18:51
|- - ILYAUL   Цитата(rx3apf @ Oct 7 2012, 22:51) Примит...   Oct 7 2012, 19:14
- - ILYAUL   Как это не смешно но у support нет диаграм работы ...   Oct 8 2012, 12:41


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 12:42
Рейтинг@Mail.ru


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