Важная информация

User Tag List

Страница 4 из 36 ПерваяПервая 12345678 ... ПоследняяПоследняя
Показано с 31 по 40 из 354

Тема: Корвет: ExtROM Open Source extender

  1. #31
    R.I.P.
    Регистрация
    16.09.2009
    Адрес
    г. Харьков
    Сообщений
    1,466
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    4
    Поблагодарили
    4 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    понял, а то попалось "9 тактов", решил уточнить.

    кстати, можно и без pinchange обойтись ?
    тут я плавая, просто идея

    Скрытый текст


    Код:
    while( portb != 4)
    porta=B4
    while( portb == 4)
    porta=B5
    while( portb == 5)
    porta=B6
    while( portb == 6)
    porta=B7
    while( portb == 7)
    
    //crc
    dataptr=0
    do
    {
    	porta=data[dataptr]
    	while( portb == dataptr)
    	dataptr++
    } while ( dataptr != 0x100 );
    
    again load
    again compare
    [свернуть]
    Последний раз редактировалось esl; 22.06.2014 в 13:50.

  2. #31
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #32
    Activist
    Регистрация
    17.04.2011
    Адрес
    Санкт-Петербург
    Сообщений
    324
    Спасибо Благодарностей отдано 
    32
    Спасибо Благодарностей получено 
    200
    Поблагодарили
    48 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от esl Посмотреть сообщение
    тут я плавая, просто идея
    Ага, кажется понял. Вроде мы нечто подобное уже недавно обсуждали. То есть это одна из вариаций предложенного ранее

    Код:
    while(flag) { porta=data(pinb); }
    Ну и выход из цикла, когда внешний сигнал от запустившегося загрузчика перекинет flag. Работать оно, кончно, будет. Только тогда придется распаивать полный порт B на все 8 бит адреса. Иначе твоя красивая конструкция while( portb == dataptr) работать не будет. А мы же хотели обойтись одним проводом нулевого бита адреса. Тут путь видится другой - создавать таблицу последовательности адресов и первые байты выбрать по ней, а потом уже по порядку. Я уже прикинул получающийся код, может быть кривенько, но надо проверить.

    Блин. Пожалуй, завтра все же попробую взяться за паяльник. Пора начать проверять идеи в железе.

  4. #33
    R.I.P.
    Регистрация
    16.09.2009
    Адрес
    г. Харьков
    Сообщений
    1,466
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    4
    Поблагодарили
    4 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от forth32 Посмотреть сообщение
    Только тогда придется распаивать полный порт B на все 8 бит адреса. Иначе твоя красивая конструкция while( portb == dataptr) работать не будет.
    зачем 8, дочтаточно 1го

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

  5. #34
    Activist
    Регистрация
    17.04.2011
    Адрес
    Санкт-Петербург
    Сообщений
    324
    Спасибо Благодарностей отдано 
    32
    Спасибо Благодарностей получено 
    200
    Поблагодарили
    48 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от esl Посмотреть сообщение
    зачем 8, дочтаточно 1го

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

    Во-первых (на правах зануды, ты уж извини) portb вообще не поменяется никогда, пока сам его не запишешь. Если пин настроен на ввод (DDRB=0), то он определяет только состояние резистора подтяжки. Данные читают из PINB. Но это так, к слову.

    А по существу вот что. У тебя dataptr - указатель в массиве передаваемых данных. Он пробегает все значения от 00 до FF. PINB - у него подключен только младший пин. Он принимает занчения 0 или 1. Поэтому, например, при dataptr=5, условие dataptr==pinb НИКОГДА не выполнится. Ни разу. Ибо dataptr будет равен 5, а pinb при этом = 1. Твоя программа просто вытолкнет на максимально возможной скорости все 256 байтов в порт А, пролетая уловие dataptr==pinb за один машинный цикл. Без всякой синхронизации с корветом.

    Правильным будет такой вариант - while (pinb == (dataptr&1)); Вот так оно действительно будет работать. При этом мы просто от обработки адреса по прерыванию перешли на обработку по программному опросу. Ну, это нам сэкономит несколько тактов AVR, ибо вход в прерывание происходит достаточно медленно. Однако мы тут вроде посчитали, что у нас времени на выставление данных заложено с запасом. Так что, я думаю, можно делать хоть по прерыванию, хоть по опросу. Как легче писать.

    Или я не прав и просто неправильно понял твою идею? Поправь, если ошибаюсь...

  6. #35
    SaintTurnip
    Гость

    По умолчанию

    while (pinb == (dataptr&1))
    forth32, красиво!

  7. #36
    R.I.P.
    Регистрация
    16.09.2009
    Адрес
    г. Харьков
    Сообщений
    1,466
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    4
    Поблагодарили
    4 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от forth32 Посмотреть сообщение
    Так это...

    Во-первых (на правах зануды, ты уж извини) portb вообще не поменяется никогда, пока сам его не запишешь. Если пин настроен на ввод (DDRB=0), то он определяет только состояние резистора подтяжки. Данные читают из PINB. Но это так, к слову.
    ты прав конечно, эт я торможу, под portb я имел в виду данные из порта "B"

    собственно я даже имел в виду скорее такое
    Код:
    //crc
    dataptr=0
    prevvalue=portb
    do
    {
    	porta=data[dataptr]
    	while( portb == prevvalue)
    	prevvalue=portb
    	dataptr++
    } while ( dataptr != 0x100 );
    т.е. что просто ловить изменение порта,
    ловить не конкретный бит (тем более что не обязательно мапить A0 на бит0 контроллера, а можно мапить на удобный.

    похоже написал одно а думал про другое
    ну а вообще ты прав конечно, это уже вариации на тему

    хотя опять же, это оптимизации еще не существуюшего кода
    а как писал Вирт ...
    Последний раз редактировалось esl; 23.06.2014 в 00:01.

  8. #37
    Activist
    Регистрация
    17.04.2011
    Адрес
    Санкт-Петербург
    Сообщений
    324
    Спасибо Благодарностей отдано 
    32
    Спасибо Благодарностей получено 
    200
    Поблагодарили
    48 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Итак, рассказываю о первых опытах загрузки через боковой разъем корвета. Вначале предыстроия - о набитых по дороге шишках.

    Я собрал макетку с Atmega32, подключил порт A меги к каналу A корвета, прерывание int0 меги - к сигналу Control, in1 - к каналу PB0 (0 бит адреса). То есть я пошел по пути, предложенному ESL - стробироваться единственным адресным битом. Получилась шина из 12 проводов (8 данных, 2 строба, земля, питание). Выглядит это так:




    Написал программу для AVR, и небольшую тестовую программку для загрузки в корвет (она просто выводит строчку на экран и останавливает процессор). Запустил. И сразу огреб ошибку ОПТС - ОШИБКА ШИНЫ. Пришлось разбираться.

    Во-первых, я решил просимулировать процесс загрузки. Еще раз спасибо ESL за сорцы его эмулятора. Я приделал к эмулятору загрузку с внешнего ПЗУ (добавил ключ -r в командную строку), и получил ту же самую Ошибку Шины! Уже в эмуляторе. Оказалось (я это разбирал в свое время в IDA, но уже забыл), что сумрачные гении, писавшие ОПТС, додумались тестировать шину путем записи битовых образцов в канал А того самого ВВ55, который выведен на боковой разъем. Предварительно переключив этот канал в режим вывода. Они решили, что это хорошая идея - срать в порт, к которому неизвестно что подключено и который они же потом используют для ввода. В конце концов, если уж так хочется, есть же порт данных принтера, к которому точно ничего, кроме принтера, подключено быть не может. А боковой разъем они же сами позиционировали как универсальный для радиолюбителей (судя по статьям в том же журнале радио). За такое я бы яйца отрывал, причем медленно.

    Дело в том, что ВВ55 обладает интересной особенностью. При чтении порта он всегда выдает текущее состояние своих ножек. Независимо, работает канал на ввод или на вывод. В результате, если порт работает на вывод, в канал записана 1, а внешний сигнал подтянул ножку к земле - из канала прочитается 0. Отсюда и ошибка шины - моя бедная мега просто перетянула к земле некоторые биты порта. Оказалось, что переключать порт меги на вывод можно только после того, как сигнал Control станет 1. До этого порт должен быть в режиме ввода, чтобы не мешать ОПТС развлекаться с тестом шины. Проблема в том, что этот самый сигнал Control в момент включения питания может несколько раз дернуться вверх-вниз, и это все надо отслеживать.

    Далее я доработал эмулятор для отслеживания сигнала control, и заодно добавил туда сборку лога обращений к эмулируемой внешней ПЗУ. Оказалось, что с полследовательностью адресов мы не ошиблись - 4,5,6,7,0 и далее 3 раза по кольцу все 256 адресов. Заодно проверил свою тестовую программку - в эмуляторе она загрузилась и запустилась нормально.

    Теперь, зная о подводных камнях, я исправил программу в AVR. Приходится отслеживать оба перепада сигнала Control. Если он стал 0 - немедленно переводим порт А в режим ввода и ждем. Если стал 1 - выставляем в порт А первый в цепочке байт (по адресу 4) и начинаем отслеживать перепады PB0, выставляя по порядку байты в порт А. Вот и весь процесс загрузки.
    В результате я получил 2 варианта загрузчика для AVR - один использует прерывание от PB0 (типа Pinchange - по обоим перепадам сигнала), другой - программный опрос сигнала PB0. Работоспособны оба. Но программный опрос имеет, на мой взгляд, 2 преимущества - он короче на 14 байт и может работать с любым битом любого порта AVR, то есть освобождается ценное прерывание Int1. А в меге32 этих прерываний всего 3, не так уж и много. Прикладываю к посту архив с обоими вариантами загрузчика. exr.asm - вариант с прерываниями, exr-poll.asm - вариант с программным опросом. extrom.bin - загружаемый блок с тестовой программкой. Для тех, кто захочет повторить мой эксперимент (похоже, вряд ли такие найдутся, но а вдруг...) - надо выставить FUSE на тактирование от внутреннего генератора на 8 МГц, и включить детектор напряжения питания на 4.5 V - чтобы программа не сходила с ума в момент включения питания. Естественно, можно использовать любую мегу, не только 32, и даже тиньку. Только подправить программу на используемые порты.
    256-байтовый блок для загрузки в корвет размещается в NVRAM меги с адреса 0. Его можно прошить отдельно с помощью того же avrdude c ключем -U nvram. То есть можно менять эти блоки, не трогая основную флеш-память AVR. При страте программа переносит этот блок в основную SRAM с адреса 100, и оттуда уже выдает данные в порт по мере необходимости.

    Итак, загрузчик работает. Что дальше? Я вижу несколько этапов, которые придется пройти.

    1. Допаять еще несколько проводов - от канала С ВВ55 к какому-нибудь порту меги. Это буду сигнал управления двухсторонним обменом в режиме 2.

    2. Придумать протокол загрузки и написать вторичный загрузчик. Он должен будет перекинуть в корвет образ системы (сетевой BIOS + BDOS + CCP). Примерно как сейчас заливается по сети CP/N.SYS.

    3. Приделать к меге какое-нибдуь хранилище данных - хотя бы ту же SD-карту, хоть мне и очень не хочется связываться с драйвером VFAT. Кстати, на первых порах можно и без фата обойтись - просто разбить SD на несколько фиксированных зон и прописать туда данные с помощью обычного dd. Проблема еще в том, что SD требует 3v уровней - придется мудрить с согласованием, а я это очень не люблю...

    4. Ну и, наконец, придумать и реализовать протокол взаимодействия между сетевым биосом и программой в AVR. Это самая интересная, но при этом громоздкая часть работы. За основу можно взять исходные тексты стандартного биоса корвета, добавив туда перехват запросов READ и WRITE при обращении к эмулируемым дискам, и какой-нибудь командный протокол для монтирования образов KDI.
    Вложения Вложения

  9. Этот пользователь поблагодарил forth32 за это полезное сообщение:

    shapipovo (20.04.2020)

  10. #38
    R.I.P.
    Регистрация
    16.09.2009
    Адрес
    г. Харьков
    Сообщений
    1,466
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    4
    Поблагодарили
    4 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от forth32 Посмотреть сообщение
    ... сумрачные гении, писавшие ОПТС, ....
    5 балов !
    очень точное и емкое определение !

    кстати, в свое врем попалось, вроде в ОПТС от квана,
    он тестируют ВВ с принтером
    т.к. о них не распаян ext port
    и была вроде грабля, что установка стандартного пзу - вылетало с ошибкой шины.

    ---------- Post added at 14:21 ---------- Previous post was at 14:20 ----------

    Цитата Сообщение от forth32 Посмотреть сообщение
    Я приделал к эмулятору загрузку с внешнего ПЗУ (добавил ключ -r в командную строку),
    пачтиком поделись ! ??!?!
    плизззз

  11. #39
    Moderator Аватар для Serebriakov
    Регистрация
    06.04.2013
    Адрес
    г. Могилев, Беларусь
    Сообщений
    253
    Записей в дневнике
    3
    Спасибо Благодарностей отдано 
    109
    Спасибо Благодарностей получено 
    55
    Поблагодарили
    26 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Нечто похожее, кстати, делали для Апогея:
    http://vk.com/retropk?w=wall-41468278_22%2Fall
    https://github.com/vinxru/86RKSD

  12. #40
    R.I.P.
    Регистрация
    16.09.2009
    Адрес
    г. Харьков
    Сообщений
    1,466
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    4
    Поблагодарили
    4 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от forth32 Посмотреть сообщение
    2. Придумать протокол загрузки и написать вторичный загрузчик. Он должен будет перекинуть в корвет образ системы (сетевой BIOS + BDOS + CCP). Примерно как сейчас заливается по сети CP/N.SYS.
    то что я думал, протокол нужен
    что то типа
    Код:
    дай мне список образов на диске
    дай список того что смонтировано
    подключи образ XXX к диску Y
    загрузи бут с диска
    прочитай блок "NN" из образа c диска Y
    запиши блок в образ на диска Y
    прочитай конфиг
    запиши конфиг
    можно конечно и файловое апи отдать внутрь
    собственно моя идея была - грузим обычный бут, как биос
    потом патчим в нем bios call
    это при том что кол-во биосов ограничено,
    а во всех cp/m есть место
    если правильно посмотрел то размер дырки в байтах
    1018
    1077
    1077
    941
    1060
    825
    818
    801
    953
    762

    т.е. туда можно черта запихнуть

    p.s. я готовился

    ---------- Post added at 17:45 ---------- Previous post was at 17:43 ----------

    Цитата Сообщение от forth32 Посмотреть сообщение
    3. Приделать к меге какое-нибдуь хранилище данных - хотя бы ту же SD-карту, хоть мне и очень не хочется связываться с драйвером VFAT. Кстати, на первых порах можно и без фата обойтись - просто разбить SD на несколько фиксированных зон и прописать туда данные с помощью обычного dd. Проблема еще в том, что SD требует 3v уровней - придется мудрить с согласованием, а я это очень не люблю...
    так это уже всё решено

    http://vinxru.livejournal.com/177621.html

    https://github.com/vinxru/86RKSD

    даже на мега8
    Последний раз редактировалось esl; 25.06.2014 в 22:07.

Страница 4 из 36 ПерваяПервая 12345678 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Open source firmware for the Spectrum
    от zx-kit в разделе Разный софт
    Ответов: 60
    Последнее: 29.05.2014, 13:53
  2. open-source эмуляторы под .NET
    от Sawyer в разделе Эмуляторы
    Ответов: 1
    Последнее: 04.01.2011, 17:47
  3. GP2X F100 Open Source Gaming Console
    от CodeMaster в разделе Зарубежные компьютеры
    Ответов: 3
    Последнее: 12.06.2010, 23:51
  4. Open Source эмуль...
    от rg_software в разделе Эмуляторы
    Ответов: 50
    Последнее: 06.12.2006, 11:57

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •