Lisitsin 0 3 октября, 2012 Опубликовано 3 октября, 2012 (изменено) · Жалоба Здравствуйте. Помогите разобраться с проблемой ... Формирую на 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 Такты подсчитываю в комментариях. В результате: первый байт передаётся правильно. Второй - не передаётся, вместо него на экране вижу последний переданный бит - белую черту в случае если последним битом была единица и тёмную - если был ноль. Третий байт опять корректный, четвёртый - как второй и так далее до конца строки. В общем пока не понял что это такое и как добиться задуманного. Изменено 3 октября, 2012 пользователем Lisitsin Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
chernenko 0 3 октября, 2012 Опубликовано 3 октября, 2012 · Жалоба я бы проверил осциллографом что там физически выходит по SPI может там все так как и задумалось а проблема в другом месте Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lisitsin 0 3 октября, 2012 Опубликовано 3 октября, 2012 (изменено) · Жалоба я бы проверил осциллографом что там физически выходит по SPI может там все так как и задумалось а проблема в другом месте Проблема точно не в другом. Видеосигнал я принимаю USB TV тюнером Beholder по нч видеовходу. Есть другая программа, где я вывод делаю вручную, и и она работает отлично, но там получается три такта на пиксел, а мне недо 2. А вот если в конце передачи байта выключть SPI и тут же включить, то всё становится на свои места. Но только на место этого включения/выключения смотреть неприятно. Пиксел затянут. Схемка во вложении) ASpect128.sch Изменено 3 октября, 2012 пользователем Lisitsin Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 6 3 октября, 2012 Опубликовано 3 октября, 2012 · Жалоба Формирую на ATMega128 видеосигнал при помощи SPI. Устанавливаю режим Master, двойная скорость. Одна точка изображения занимает два такта. Необходимо выводить байт за байтом непрерывно. Всего 48 байт. ИМХО, это принципиально невозможно. Новые данные в SPDR можно загрузить только после передачи предыдущего байта (т.е. на семнадцатом такте). В результате: первый байт передаётся правильно. Второй - не передаётся, вместо него на экране вижу последний переданный бит - белую черту в случае если последним битом была единица и тёмную - если был ноль. Третий байт опять корректный, четвёртый - как второй и так далее до конца строки. Эти симптомы подтверждают сказанное мной выше. Чтобы убедится в этом окончательно - добавьте один NOP к группе пустых операторов в "выравнивании времени". Думаю, что тут же появятся и четные байты, а вот последние пикселы каждого байта будут в полтора раза "длиннее" остальных... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lisitsin 0 3 октября, 2012 Опубликовано 3 октября, 2012 · Жалоба ИМХО, это принципиально невозможно. Новые данные в SPDR можно загрузить только после передачи предыдущего байта (т.е. на семнадцатом такте). Эти симптомы подтверждают сказанное мной выше. Чтобы убедится в этом окончательно - добавьте один NOP к группе пустых операторов в "выравнивании времени". Думаю, что тут же появятся и четные байты, а вот последние пикселы каждого байта будут в полтора раза "длиннее" остальных... Так я и передаю следующий байт семнадцатым тактом. Там я в комментариях каждый такт считаю (см. выше). А ноп втыкать пробовал, и не один - результат тот же (в смысле нет результата). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 6 3 октября, 2012 Опубликовано 3 октября, 2012 · Жалоба Так я и передаю следующий байт семнадцатым тактом.Нет, шестнадцатым - считать нужно с команды, следующей за OUT SPDR,VDATA24. Вставьте, в конце концов, ещё один NOP и убедитесь, что отображение четных байт появиться... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lisitsin 0 3 октября, 2012 Опубликовано 3 октября, 2012 (изменено) · Жалоба Нет, шестнадцатым - считать нужно с команды, следующей за OUT SPDR,VDATA24. Вставьте, в конце концов, ещё один NOP и убедитесь, что отображение четных байт появиться... Я их там три штуки пробовал ставить. Ничего. Строчная синхронизация уже слетать начинает. Да и делу это не поможет - мне нужно непрерывное изображение, без затягиваний ... Изменено 3 октября, 2012 пользователем Lisitsin Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 6 3 октября, 2012 Опубликовано 3 октября, 2012 · Жалоба Я их там три штуки пробовал ставить. Ничего. В том, что Вы пытаетесь записать данные раньше положенного времени, можно убедиться, посмотрев на флаг WCOL Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lisitsin 0 3 октября, 2012 Опубликовано 3 октября, 2012 (изменено) · Жалоба В том, что Вы пытаетесь записать данные раньше положенного времени, можно убедиться, посмотрев на флаг WCOL Не раньше. Проблема совсем не в этом. SPI по скорости настроен как надо: 2 такта процессора не точку, и на экране я вижу то же самое ...Передаю 0B10101010 и вижу 4 точки и 4 пробела. Из 48 байт вижу ровно 24 корректных и 24 некоректных. Изменено 3 октября, 2012 пользователем Lisitsin Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 3 октября, 2012 Опубликовано 3 октября, 2012 · Жалоба Из 48 байт ... CPI XL,0X40 = 64 или первые 16 чем-то ещё заняты? И схему выложите в pdf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 6 4 октября, 2012 Опубликовано 4 октября, 2012 · Жалоба Я их там три штуки пробовал ставить. Ничего.Кстати! Возможно, их там и нужно вставить три штуки! Согласно с комментарием к команде 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 пикселов: удвоенный восьмой бит можно использовать как промежуток между символами... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 4 октября, 2012 Опубликовано 4 октября, 2012 · Жалоба В этом случае команда LD Rd,X+ выполняется за один такт, а таких команд у Вас в программе две. Может я кончно чего и не знаю, но согласно DS на мегу128 все LD Rd,X... выполняются минимум за ДВА такта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maik-vs 0 4 октября, 2012 Опубликовано 4 октября, 2012 · Жалоба Непрерывную строку пикселов выводить не получается. Между двумя байтами минимальный зазор 1,5 такта spi, на загрузку нового значения. Долго возился в своё время с мегой16 - не получилось. И в даташите в общем так и нарисовано. Разве что переделали SPI в 128-й меге, но вряд ли. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lisitsin 0 4 октября, 2012 Опубликовано 4 октября, 2012 · Жалоба Спасибо. Да, действительно. Сегодня плотно повозился с этим делом. Наилучший эффект получается только с двумя дополнительными нопами плюс к 16 тактам. Последний бит неизбежно затягивается. Я разозлился и сделал следующее: начинаю делать вывод данных через SPI. Пока они выводятся вывожу в порт B: MOSI последний - нулевой бит данных. Когда доходит дело до вывода этого самого бита через SPI жестоко выключаю SPI по питанию. В этот момент конфигурация порта В:MOSI изменяется и на линии оказывается записанное прежде в порт В последнего бита. Тут же включаю SPI. В результате портятся пол точки на экране. Затем повторяю весь цикл. Но и тут возникает загвоздка. Всё равно корректность работы SPI зависит от ДАННЫХ, которые я передаю. И при определённых данных опять чётные передачки ломаются. Короче после этого я окончательно разозлился на SPI и стал выводить данные вручную по 3 такта на точку. Как раз 48 байт умещаются в строке, но на экране я вижу только 43, а 5 по-моему оказываются в зоне сигналов гашения TV тюнера. Вот такая вот история.А код такой: .MACRO VIDEOSTRING_ OUT PORTB,VDATA1 ; 7 OUT ATTRPORT,ATTR ; 7 LSL VDATA1 ; 7 OUT PORTB,VDATA1 ; 6 BST VDATA1,1 ; 6 SAVE BIT 0 LSL VDATA1 ; 6 OUT PORTB,VDATA1 ; 5 BLD VDATA10,PIXEL ; 5 TO VDATA10:PIXEL LSL VDATA1 ; 5 OUT PORTB,VDATA1 ; 4 BST VDATA1,4 ; 4 SAVE BIT 1 LSL VDATA1 ; 4 OUT PORTB,VDATA1 ; 3 BLD VDATA11,PIXEL ; 3 TO VDATA11:PIXEL LSL VDATA1 ; 3 OUT PORTB,VDATA1 ; 2 LD VDATA1,X+ ; 2 OUT PORTB,VDATA11 ; 1 ;LD ATTR,Y+ ; 1 LDI BUF,0B01000111 MOV ATTR,BUF OUT PORTB,VDATA10 ; 0 NOP ; 0 NOP ; 0 OUT PORTB,VDATA1 ; 7 OUT ATTRPORT,ATTR ; 7 LSL VDATA1 ; 7 OUT PORTB,VDATA1 ; 6 BST VDATA1,1 ; 6 SAVE BIT 0 LSL VDATA1 ; 6 OUT PORTB,VDATA1 ; 5 BLD VDATA10,PIXEL ; 5 TO VDATA10:PIXEL LSL VDATA1 ; 5 OUT PORTB,VDATA1 ; 4 BST VDATA1,4 ; 4 SAVE BIT 1 LSL VDATA1 ; 4 OUT PORTB,VDATA1 ; 3 BLD VDATA11,PIXEL ; 3 TO VDATA11:PIXEL LSL VDATA1 ; 3 OUT PORTB,VDATA1 ; 2 LD VDATA1,X+ ; 2 OUT PORTB,VDATA11 ; 1 ;LD ATTR,Y+ ; 1 LDI BUF,0B01000111 MOV ATTR,BUF OUT PORTB,VDATA10 ; 0 NOP ; 0 CLR BUF ; 0 .ENDMACRO А схема есть в ворде (вложение). ASpect_128.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 5 октября, 2012 Опубликовано 5 октября, 2012 · Жалоба А какая частота строчной развёртки? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться