nedoPC Sidekick на 40-ногом микроконтроллере PIC16F87x

8-битные микроконтроллеры PICmicro (ПИКи) от Microchip и совместимые, а также 16-битные PIC24 и 32-битные PIC32

Moderator: Shaos

User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

nedoPC Sidekick на 40-ногом микроконтроллере PIC16F87x

Post by Shaos »

Эта тема заведена как продолжение выкладывания мыслей (и обсуждение) на тему пиковского сопроцессора для ретро-компьютеров (началось тут), который я сегодня решил назвать nedoPC Sidekick :lol:

PIC16F871 это 3-долларовый 20-мегагерцовый 40-ногий микроконтроллер с 33 линиями ввода-вывода (6-битный порт A, 8-битные порты B/C/D, а также 3-битный порт E), который может работать в режиме PSP (Parallel Slave Port) и как бы совместим с кучей разнообразных ретро-компьютеров - в этом случае порт D подключается к шине данных, а порт E превращается в сигналы управления /RD,/WR и /CS.

У меня уже долгие годы зреет желание задействовать его как вспомогательный вычислитель:
viewtopic.php?p=104863#p104863 (май 2013)
viewtopic.php?p=107897#p107897 (сентябрь 2013)
viewtopic.php?p=112645#p112645 (февраль 2014)
viewtopic.php?p=133409#p133409 (январь 2017)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: nedoPC Sidekick на PIC16F871

Post by Shaos »

Подключать PIC16F871 в хост-систему предполагается так:

Code: Select all

RA0 - application specific (address bit 0, AN0)
RA1 - application specific (address bit 1, AN1)
RA2 - application specific (address bit 2, AN2)
RA3 - application specific (addressable input, AN3)
RA4 - open drain, output to host /INT
RA5 - output to red LED (usually to indicate an error)

RB0...RB7 - output data (read-only for host on 2nd port)

RC0 - application specific (T1OSO,T1CKI)
RC1 - application specific (T1OSI, and CCP2/PWM2 for higher PICs)
RC2 - application specific (CCP1/PWM1)
RC3 - application specific (SCK/SCL for higher PICs) 
RC4 - application specific (SDI/SDA for higher PICs)
RC5 - application specific (SDO for higher PICs)
RC6 - TX for RS-232
RC7 - RX for RS-232

RD0...RD7 - PSP data port

RE0 - PSP control /RD
RE1 - PSP control /WR
RE2 - PSP control /CS
Для хоста это выглядит как 2 порта - порт управления и порт данных:
- чтение снаружи всегда идёт раздельно - порт управления из PSP и порт данных из PORTB (через буфер на шину данных);
- запись извне всегда в PSP и снаружи должен быть триггер, который защёлкивает младший бит адреса при записи, передавая его в пик через RA3.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: nedoPC Sidekick на PIC16F871

Post by Shaos »

В интерфейсе на будущее также можно заложиться на более продвинутые пики из этого семейства вплоть до PIC16F877, у которого 8Кб флеша (все 4 банки), 368 байт ОЗУ и 256 байт EEPROM (получается надо туда обращаться 4 окнами по 64 байта)

P.S. У среднего брата PIC16F874 только 4Кб флеша (2 банки), 192 байта ОЗУ и 128 байт EEPROM (для нас это 2 окна по 64 байта). Кроме того у них обоих на RC3/RC4/RC5 могут быть посажены сигналы для возможного подключения SPI девайсов и даже I2C. Также имеются варианты с буковкой A - пока я только понял, что у них флеш перешивается не 1000 раз как у обычных пиков, а целых 100000! :o

P.P.S. Сегодняшние цены на DigiKey:

Code: Select all

PIC16F871  - $3.29 в DIP и $4.58 в PLCC
PIC16F874  - $5.68 в DIP и $7.75 в PLCC
PIC16F874A - $4.73 в DIP и $5.47 в PLCC
PIC16F877  - $5.93 в DIP и $8.37 в PLCC
PIC16F877A -  нету в DIP и $5.87 в PLCC
Есть ещё PIC16F877T и PIC16F877AT - но это просто другая упаковка (tape) и они чуть дороже...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
piotr433
Novelist
Posts: 49
Joined: 14 Aug 2018 14:30
Location: Szczecin, Польша

Re: nedoPC Sidekick на PIC16F871

Post by piotr433 »

Может PIC18F4520?
32Кб флеша, 1.5Кб ОЗУ, 256 байт EEPROM, совместимый с PIC16F87x по выводам и набору периферийных устройств, стоит $4.27 на DigiKey.
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: nedoPC Sidekick на PIC16F871

Post by Shaos »

PIC18 это ошибка природы, которой не должно было существовать ;)

Sidekick мне видится именно на PIC16, чтобы была возможность иметь средства разработки для него прямо на ретрокомпьютере :)
Я тут за главного - если что шлите мыло на me собака shaos точка net
aav8
Maniac
Posts: 287
Joined: 05 Nov 2008 19:47
Location: 81.28.208.238

Re: nedoPC Sidekick на PIC16F871

Post by aav8 »

У меня тоже была мысля (и пока ни чем не закончилась) прикрутить PIC
с PSP к 8-бит процу. С полной (по возможности) поддержкой
FAT(12-16-32) на SD карте. Может даже обмен данными через ПДП (РК86).
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: nedoPC Sidekick на 40-ногом микроконтроллере PIC16F87x

Post by Shaos »

Начал городить прототипчик для RC2014 из старой макетной платки:

Image
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: nedoPC Sidekick на 40-ногом микроконтроллере PIC16F87x

Post by Shaos »

Если у нас будет возможность писать с хоста в оба порта (запоминая младший бит адреса на триггере), то управляющий протокол может быть таким:

Code: Select all

xxxx xx00 - application specific
xxxx xx01 - application specific
xxxx xx10 - used by ACIA emulator
xxxx x011 - reset to application (00000011 - default app, otherwise one of 31 specific apps)
xxxx 0111 - set least significant nibble of the working address (and keep most significant nibble as is)
xxxx 1111 - set most significant nibble of the working address (least significant nibble is cleared in this case)
Данные вычитываемые из порта контроля и порта данных после перезагрузки приложения будет зависеть от приложения.
Чтение из порта данных после установки адреса будет выдавать байт по текущему адресу, смещая адрес на 1 после выдачи (порт контроля будет выдавать флаг готовности).
Запись в порт данных после установки адреса будет производить запись байта по текущему адресу, смещая адрес на 1 (порт контроля будет выдавать флаг вычитки).
Два обязательных бита в порту контроля:
бит 0 - флаг готовности входных данных
бит 1 - флаг пустоты выходного буфера

Диапазоны адресов:

Code: Select all

#00...#3F - EEPROM (64 bytes, read & write)
#40...#7F - reserved for future (2nd EEPROM area)
#80...#9F - function calls (32 functions, no address increment, ports behavior depends on function)
#A0...#BF - variables from dedicated area of data memory (32 bytes, read & writes)
#C0...#FF - constants from dedicated area of code memory (64 bytes, read only)
Начало области EEPROM будет доступно пользователю. Конец области будет использоваться системой, но пользователь все равно может туда что-то писать, например:
EEPROM ячейка с адресом #3F (63) может содержать номер приложения, запускаемого по умолчанию (при включении питания либо по дефолтному ресету 00000011).

Константы могут сообщать юзеру о конфигурации сайдкиковой системы, например:
#FF - байт, описывающий целевую систему: #00 - ошибка, #01 - PIC16F871, #02 - PIC16F874. #03 - PIC16F877 (сюда же можно писать количество покрываемых системой портов - скажем в старшие 2 бита: 01 это 2 порта, 10 это 4 порта и 11 это 8 портов - хотя это наверное уже вряд ли);
#FE - две старшие цифры версии прошивки (каждая 0...15);
#FD - младшая цифра версии (0...255);
#FC - количество предзашитых приложений (их запрещается стирать, в отличие от приложений, прошиваемых пользователем);
#C0... - тут может быть строка, идентифицирующая конкретную сборку, например "nedoPC Sidekick with nedoText for RC2014" (41 байт с нулём).
Имя автора и дату сборки наверное тоже можно, но наверное пока ненужно...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: nedoPC Sidekick на 40-ногом микроконтроллере PIC16F87x

Post by Shaos »

Приложения предположительно могут иметь имена и 2 точки входа - по ресету и по прерыванию (системное прерывание будет уходить в активное в данный момент приложение).

Функция #80 скажем может быть использована для выдачи списка приложений (начиная с первого и может быть даже с пометкой дефолтного приложения):

Code: Select all

aaa*
bbb
ccccc
abba
Может быть даже можно будет сделать переподцепления приложений к разным номерам, но наверное не сейчас...

Возможный формат расположения приложений в памяти - у каждого приложения будет заголовок:

Code: Select all

goto startapp
goto interrupt
goto nextapp
// тут будет имя в формате ДВА 7-битных символа на слово (последний символ 0)
startapp:
...
interrupt:
...
nextapp: // тут идёт следующее приложение
Если цепочка приложений заканчивается, то по адресу nextapp стоит переход на адрес 7FF (конец банки).

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

Пользовательские приложения будут компилироваться пользователем под конкретные адреса на хост-машине и писаться во флеш сайдкика через спец-функции пословно...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: nedoPC Sidekick на PIC16F871

Post by Shaos »

Shaos wrote:Подключать PIC16F871 в хост-систему предполагается так:

Code: Select all

RA0 - application specific (address bit 0, AN0)
RA1 - application specific (address bit 1, AN1)
RA2 - application specific (address bit 2, AN2)
RA3 - application specific (addressable input, AN3)
RA4 - open drain, output to host /INT
RA5 - output to red LED (usually to indicate an error)

RB0...RB7 - output data (read-only for host on 2nd port)
...
Для хоста это выглядит как 2 порта - порт управления и порт данных:
- чтение снаружи всегда идёт раздельно - порт управления из PSP и порт данных из PORTB (через буфер на шину данных);
- запись извне всегда в PSP и снаружи должен быть триггер, который защёлкивает младший бит адреса при записи, передавая его в пик через RA3.
Читать состояние этого триггера предполагается через "addressable input", к которому будет подключаться один из 8 произвольных входных сигналов в зависимости от адреса на адресных битах RA0...RA2 - в простейшем случае когда адрес входа 000, то на RA3 будет состояние триггера защелкнувшего нулевой бит адреса с шины при записи в порт извне, а когда адрес 111, то пользовательский вход. В будущем можно на 001 посадить второй триггер, защелкивающий первый бит адреса с шины (тогда мы сможем отличить друг от друга записи в 4 порта), а на 010 и 011 посадить 2 регистра, куда будут защелкиваться данные с порта RB - таким образом мы расширим и чтение до 4 портов. Входы 100 и 101 могут быть аналоговыми (RA3 может быть использован как вход АЦП AN3) ну и оставшийся адрес 110 может быть использован для другого пользовательского входа...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: nedoPC Sidekick на 40-ногом микроконтроллере PIC16F87x

Post by Shaos »

Shaos wrote:Начал городить прототипчик для RC2014 из старой макетной платки
Продолжаю городить...
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net