Решил сделать что-то подобное на каноничном PIC16@20МГц. Основная цель - выводить много (относительно LCD1602) текста на большой экран с микроконтроллерной системы через ПАРАЛЛЕЛЬНУЮ шину. Но никаких внешних регистров и внешней памяти, все исключительно на внутренних ресурсах PIC16 (нездоровый минимализм), знакогенератор в памяти программ, на стороне ПИКа задействован PSP. В реальном железе пока не воплотил, только код и наброски схемы. Генерация видеосигнала путем выдачи байта данных в USART, работающий в синхронном режиме. Можно будет переделать на выдачу данных через SPI, это не принципиально, пиксельклок получается точно такой же - 5 МГц. Столкнулся с тем, что выдача 1 байта из регистра сдвига занимает 1,6 мкс (8*0,2мкс), а выборку 1 байта из памяти программ не могу осуществить быстрее 1,8 мкс. Между символами получается естественная граница в 1 темный "пиксель" (1,8 - 1,6 = 0,2 мкс). Зато можно использовать полных 8 бит для прорисовки 1 символа, не теряя 1 пиксель скраю знакоместа на создание искусственной границы между символами. Ну и общее быстродействие ПИКа не позволяет выводить более 29 символов в одной строке (для PAL 52мкс/1,8мкс = почти 29). Некрасивое число, получаются сильные потери в банках памяти, ведь времени переключать их во время вывода строки просто не остаётся. Ограничился 24 символами в строке. Получается по 4 строки на каждые 96 байт памяти (размер одного банка для PIC16F77). Задействовал 3 банка по 96 байт, итого 4*3=12 строк отображаемых символов. 24*12=288 байт ОЗУ задействовано под видеопамять. Остаётся 368-288=80 байт под программные нужды. Нулевой банк задействовать под видеопамять нельзя, для вывода в сдвиговый регистр USART, как впрочем и SPI, должен быть выбран именно банк 0, а под переменные в нем места не останется, если разместить там видеопамять. Значит видеопамять находится в банках 1-3. Причем если для последних 2 все ок, то для банка 1 есть нюанс. У него обьем всего 80 независимых байт, а нижние 16 байт shared memory, в которые отображаются старшие 16 байт банка 0. Получается старшие 16 байт видеопамяти банка 1 отображаются на ВСЕ банки, и теряется возможность использовать shared memory. Ну ничего, как-то переживём. Все равно все переменные в банке 0, только регистр выбора банка для косвенной адресации иногда надо переключить. Все манипуляции с видесигналом исключительно в прерывании по таймеру. Пока даже не уверен, что прием данных буду делать по прерыванию PSP, возможно слишком высоки будут накладные расходы на отдельный вызов прерывания PSP, и прием будет осуществляться исключительно опросом пина WR в моменты вывода пустых строк. Но тогда теряется сама суть PSP... Вот такие ухищрения, чтобы втиснуть все в 1 корпус МК.
П.С. Для VGA все ещё грустные, там максимум 14 строк успевает вывестись при 20 МГц. Выбрал для красоты 12 символов, и 8 строк. Как раз 12*8=96 байт, 1 банк под видеопамять, так что хватит даже PIC16F74 с его жалкими 192 байтами в 2 банках.
П.П.С. Посоветуйте, до скольки разогнать ПИК, и какое разрешение при Вашей предложенной частоте выбрать ? Потому что у меня соотношение ширины к высоте разрешения в лучшем случае 2 :1, тогда как в классическом терминале более 3:1, и мои шрифты будут просто уродски широкими.
Вывод текста на TV или VGA с помощью PIC16
Moderator: Shaos
-
- Junior
- Posts: 5
- Joined: 22 Nov 2016 10:55
-
- Admin
- Posts: 24027
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: nedoText/SX - вывод текста 80x25 на экран ТВ с помощью S
На PIC16 я 20 лет назад делал 32x24 на NTSC и PAL - см. viewtopic.php?f=67&t=7533
Но там снаружи были кое-какие микросхемы в помощь...
Но там снаружи были кое-какие микросхемы в помощь...
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Novelist
- Posts: 43
- Joined: 15 Sep 2014 22:32
- Location: Пермь
Re: nedoText/SX - вывод текста 80x25 на экран ТВ с помощью S
я больше к VGA склоняюсь, мониторов сейчас много остается и с цветами проще. На AVR получил 64х25, знакоместо 5х7, без внешних микросхем. Правда AVR китайский аналог 328, он на 32МГц работает.
-
- Admin
- Posts: 24027
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: nedoText/SX - вывод текста 80x25 на экран ТВ с помощью S
Старых пиков на VGA не хватит - медленные они (20 МГц это только 5 миллионов операций в секунду)
P.S. Хотя есть PIC16 посовременнее аж на 48 МГц:
P.P.S. Предлагаю отделить беседу в новую тему "Вывод текста на VGA с помощью PIC16"
P.S. Хотя есть PIC16 посовременнее аж на 48 МГц:
Там даже есть USB v2.0 и наряду с привычным АЦП имеется один 5-битный ЦАПPIC16F1455-I/SL
IC MCU 8BIT 14KB FLASH 14SOIC

P.P.S. Предлагаю отделить беседу в новую тему "Вывод текста на VGA с помощью PIC16"
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Junior
- Posts: 5
- Joined: 22 Nov 2016 10:55
Re: nedoText/SX - вывод текста 80x25 на экран ТВ с помощью S
Да, медленные . Но именно поэтому захотелось реализовать это на PIC16. Не PIC18 (уже есть реализация от Тимофеева), не AVR (куча реализаций), а именно эти старички на 20МГц (можно под небольшим разгоном). Их есть у меня. Спортивный интерес - что смогу выжать из них?Shaos wrote:Старых пиков на VGA не хватит - медленные они...
P.S. Хотя есть PIC16 посовременнее аж на 48 МГц:
P.P.S. Предлагаю отделить беседу в новую тему "Вывод текста на VGA с помощью PIC16"
Уже вижу, что в VGA очень уж скромно по разрешению получается. Может хоть ТВ юзабельно получится.
Тему пока создавать не надо. Даже макета рабочего ещё нет, все времянки отлаживаю в симуляторе MPLABa.
Как сделаю и запущу (очень надеюсь, что хватит силы воли и терпения), так создам отдельную тему. Просто по своему скромному опыту знаю, что если спаяю макет, то как правило довожу проект до стадии "оно что-то может", а если нет макета, то очень много идей остаётся в голове, так и не реализовавшись. А сейчас на службе, не до пайки макетов тут, максимум программировать пару часов в свободное время. Может хоть Протеус наконец освою. Как гляжу какие схемы в нем Lavr отлаживает, аж уважение пробирает...
-
- Admin
- Posts: 24027
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Вывод текста на TV или VGA с помощью PIC16
Тему всё-таки отделил
Ради спортивного интереса я PIC12 заставил видео NTSC генерировать в 2016 году
viewtopic.php?f=67&t=16610
Правда до чего-то полезного типа текста так дело и не дошло...

Ради спортивного интереса я PIC12 заставил видео NTSC генерировать в 2016 году

viewtopic.php?f=67&t=16610
Правда до чего-то полезного типа текста так дело и не дошло...
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Junior
- Posts: 5
- Joined: 22 Nov 2016 10:55
Re: Вывод текста на TV или VGA с помощью PIC16
Вот только сейчас понял, что я не учел, как себя ведёт ножка RX (через которую осуществляется вывод данных в синхронном режиме USART), между передачами, когда последний бит отправляемого байта был лог. 1. Если она остаётся в лог. 1 (не могу что-то найти точную инфу, но по логике так должно быть), то я получу светящийся пиксель между символами. Обидно однако, возможно придется ограничить видимую ширину символа до 7 бит, а последний всегда передавать погашенным, получая 2 "пикселя" темноты между символами - 1 собственно сам погашеный пиксель, а за ним 1 такт ожидания (с таким же лог. уровнем) поступления нового байта в сдвиговый регистр передатчика.
Первоначальные наброски кода делал на ассемблере, выверял такты, чтобы определить самый быстрый способ выборки байтов знакогенератора из Flash. Потом попробовал компилятор CC5X (бесплатная версия) и остался доволен им. После внимательного чтении документации (и отключении авто переключения банков и прочих удобностей типа авто сохранения кучи регистров при вызове прерывания) я добился того, что он генерировал код, точно такой же, как я написал на асме - я остался доволен. Кстати, самый быстрый способ выборки байта из Flash и закидывание этого байта в TXREG оказался через старые добрые поисковые таблицы, а не через нововведений Microchip способ чтения из Flash как памяти данных, с помощью регистров PMADDR и PMDATA. А все потому, что эти регистры находятся в 3 банке памяти, а регистр готовности флеш к вычитке в 4 банке, а TXREG (как впрочем и SSPBUF) в 0 банке. И это переключение банков туда сюда при вычитке-отправке КАЖДОГО байта убивает быстродействие в 0. А так да, способ хранения хороший, позволяет упаковывать по 2шт. 7 битных ASCII символа в 1 слово памяти программ, делая таблицы знакогенератоов в 2 раза меньше. Но конкретно для этого приминения способ не подошёл из-за тормознутости.
И я смог вписаться в 9 тактов только благодаря размещения знакогенератора, как в проекте на PIC18 от Тимофеева - знакогенератор в виде 256 байтных массивов в количестве строк на символ (в моем случае - 12).
П.С. Кстати, в AVR этот способ вывода через USART/SPI, не везде можно реализовать, например в AT90S2313 не USART, а просто UART, без синхронного режима, а SPI вообще нет. Он в пролете.
Первоначальные наброски кода делал на ассемблере, выверял такты, чтобы определить самый быстрый способ выборки байтов знакогенератора из Flash. Потом попробовал компилятор CC5X (бесплатная версия) и остался доволен им. После внимательного чтении документации (и отключении авто переключения банков и прочих удобностей типа авто сохранения кучи регистров при вызове прерывания) я добился того, что он генерировал код, точно такой же, как я написал на асме - я остался доволен. Кстати, самый быстрый способ выборки байта из Flash и закидывание этого байта в TXREG оказался через старые добрые поисковые таблицы, а не через нововведений Microchip способ чтения из Flash как памяти данных, с помощью регистров PMADDR и PMDATA. А все потому, что эти регистры находятся в 3 банке памяти, а регистр готовности флеш к вычитке в 4 банке, а TXREG (как впрочем и SSPBUF) в 0 банке. И это переключение банков туда сюда при вычитке-отправке КАЖДОГО байта убивает быстродействие в 0. А так да, способ хранения хороший, позволяет упаковывать по 2шт. 7 битных ASCII символа в 1 слово памяти программ, делая таблицы знакогенератоов в 2 раза меньше. Но конкретно для этого приминения способ не подошёл из-за тормознутости.
И я смог вписаться в 9 тактов только благодаря размещения знакогенератора, как в проекте на PIC18 от Тимофеева - знакогенератор в виде 256 байтных массивов в количестве строк на символ (в моем случае - 12).
П.С. Кстати, в AVR этот способ вывода через USART/SPI, не везде можно реализовать, например в AT90S2313 не USART, а просто UART, без синхронного режима, а SPI вообще нет. Он в пролете.