Решил пусть это будет модуль с троичными переключателями и светодиодами (объединёнными в матрицу), куда будет втыкаться плата nedoCPU-16 (на основе PIC16F780) в которую опционально может быть воткнут модуль RS-232 (для связи с компьютером). nedoCPU имеет интерфейс 3x8 - 6 пинов из порта A (плюс земля и питание), 8 пинов из порта B и 8 пинов из порта С (2 из которых в нашем случае могут быть заюзаны на RS-232). Для опроса матрицы кнопок и светодиодов воспользуемся 5 выходами порта A которые по очереди открывают 5 транзисторов. 6 выходов порта C пойдут на светодиоды, а 6 входов порта B (с включёнными подтягивающими резисторами) будут брать кнопки. Ниже предоставлены схемы и разводка ноябрьского варианта платы Rev.B:
Размер платы - 5.00 x 3.75 дюймов (или если в миллиметрах, то 127x95 ) - причём возможен также вариант с отпиливанием nedoCPU-16 (будет втыкаться в NI-3x8)
P.S. На базе той же платы можно собрать красно-зелёные троичные часы (см. чуть ниже тест номер 2)
P.P.S. 26 ноября 2009 года закончил и выложил Rev.B со всеми исправлениями
Joined: 08 Jan 2003 23:22 Posts: 22730 Location: Silicon Valley
Отвечаю партизанам-подпольщикам, втихушку просматривающих этот топик и обсуждающих мою персону и мои дела в своём гадюшнике:
По поводу радиатора: по-моему, лучше перебдеть с отводом тепла, чем недобдеть.
По поводу цен: у меня товар штучный, поэтому дорогой - ведь всем известно, что при объёмах партии стремящихся к бесконечности, себестоимость одной штуки стремится к нулю, но на бесконечность у меня денег нет. Если у кого есть желание делать дешевле - берём исходники для игла или прямо герберы и заказываем самостоятельно.
По поводу разводки: незнаю почему кому-то показалось что разводка выполнена методом "автороут в пикаде" - во-первых, у меня не пикад, а игл, а во-вторых, я покупал только стандартный редактор схем игла и стандартный редактор печатных плат игла, а вот стандартный автороутер игла покупать не стал, ибо уже дорого - поэтому я попросту не мог делать автороут т.к. у меня нет оного (фришный перестал работать после переключения на стандартную версию) - а это значит, что разводка была "ручная".
P.S. Автороутером я разводил одну единственную плату почти три года назад - NedoText
Joined: 08 Jan 2003 23:22 Posts: 22730 Location: Silicon Valley
Тест с микроконтроллером показал, что включённые переключатели, если их включено больше одного - коротят транзисторы и другие переключатели, что зажигает те светодиоды, которые не должны гореть - видимо без дополнительных диодов не обойтись - инструкцию по корректированию печатной платы вывешу позже...
P.P.S. А к тем, кто не может найти конденсаторов на плате и путает сигнальные дорожки с земляными, большая просьба: сначала читаем даташит на микроконтроллер, чтобы понимать какие ноги куда вести должны, а потом уже вякаем...
Joined: 08 Jan 2003 23:22 Posts: 22730 Location: Silicon Valley
Shaos wrote:
Тест с микроконтроллером показал, что включённые переключатели, если их включено больше одного - коротят транзисторы и другие переключатели, что зажигает те светодиоды, которые не должны гореть - видимо без дополнительных диодов не обойтись - инструкцию по корректированию печатной платы вывешу позже...
Проблема решается припаиванием 15 диодов - свою плату мне пришлось немного порезать, однако я уже придумал способ сборки, при котором дорожки резать не придётся (при этом диоды будут навесиком).
А пока это выглядит вот так (всего я припаял 20 диодов, однако 15 должно хватить, а те 5 что сверху припаяны - лишние):
P.S. Проблема исправлена 26 ноября 2009 года в Rev.B
А вот первая тестовая программа, которая принимает ввод с переключателей, троично инвертирует, и посылает на светодиоды:
Code:
; t1_test1.asm - 1st test for 3niti alpha simu1 (Oct 2009 - Nov 2011) ; this code is PUBLIC DOMAIN, created bt Alexander A. Shabarshin <ashabarshin@gmail.com>
processor pic16f870 radix dec include "p16f870.inc" __CONFIG _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _LVP_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC include "shaos-p16.inc"
; PORTA - outputs to choose column (A0...A4) and direct LED (A5) ; PORTB - inputs for rows of switches (B0...B5) and I2C (B6,B7) ; PORTC - outputs for rows of LEDs (C0...C5) and RS232 (C6,C7)
; Setup interrupts _bank1 clrf INTCON ; disable all interrupts and clear all flags bcf OPTION_REG,NOT_RBPU ; enable pull-ups bsf OPTION_REG,INTEDG ; interrupt on rising edge ; bsf INTCON,INTE ; enable RB0 port change interrupt ; bsf INTCON,GIE ; enable interrupts
; Clear watch dog _bank0 clrwdt
goto Main
; Ternary inversion (negation) of W (used tmp1,tmp2) tri_neg: ; 14 cycles with call movwf tmp1 andlw b'01010101' movwf tmp2 movf tmp1,W andlw b'10101010' movwf tmp1 bcf STATUS,C rlf tmp2,F rrf tmp1,W iorwf tmp2,W return ; P.S. it also works with inverted binary representation
Main:
; Test program to send state of ternary switches to ternary LEDs loop: movlw b'11111110' ; initial zero at bit 0 movwf mask ; save it as a mask movlw 5 movwf count ; set counter for 5 iterations loop0: movf mask,w movwf PORTA ; send mask to the port A (to choose 3 switches/LEDs) _delay1 10,cnt1 ; wait movf PORTB,w ; read byte from the port B (from the next 3 ternary switches) call tri_neg ; ternary invertion (it's not a bug, it's a feature ;) movwf PORTC ; send it to the port C (to the next 3 ternary LEDs) _delay1 0,cnt1 ; long wait bsf STATUS,C ; C = 1 rlf mask,f ; shift signgle zero in the mask to the left decfsz count,f ; decrement counter and check if it's not a zero goto loop0 ; next iteration goto loop ; after 5 iterations start all over again...
END
Code:
; Useful macros for PIC16s ; This code is PUBLIC DOMAIN created by Shaos ; 15-Oct-2009 : _bank0, _bank1, _bank2, _bank3 ; 16-Oct-2009 : _delay1, _delay2, _movlr, _movrr
_bank0 MACRO bcf STATUS,RP0 bcf STATUS,RP1 ENDM
_bank1 MACRO bsf STATUS,RP0 bcf STATUS,RP1 ENDM
_bank3 MACRO bcf STATUS,RP0 bsf STATUS,RP1 ENDM
_bank4 MACRO bsf STATUS,RP0 bsf STATUS,RP1 ENDM
; Delay 3*N+3 cycles using one register ; _delay1 byte-value,reg-name _delay1 MACRO N,R1 ; 3*N+3 (N=0 means 256) LOCAL D1 movlw N movwf R1 D1: decfsz R1,1 goto D1 ENDM
; Delay 774*N+3 cycles using two registers ; _delay2 byte-value,reg-name-1,reg-name-2 _delay2 MACRO N,R1,R2 ; 774*N+3 (N=0 means N=256) LOCAL D2 movlw N movwf R1 D2: delay1 0,R2 decfsz R1,1 goto D2 endm
; Move byte to register through accumulator W ; _movlr byte-value,reg-name _movlr MACRO B,R ; 2 cycles movlw B movwf R ENDM
; Move register value to register through accumulator W ; _movrr reg-name-src,reg-name-dst _movrr MACRO R1,R2 ; 2 cycles movf R1,0 movwf R2 ENDM
Инверсию пришлось поставить, т.к. переключатели получились "вверх тормашками"...
P.S. Вот скомпилированный код для микроконтроллера:
Last edited by Shaos on 06 Nov 2011 13:42, edited 7 times in total.
20 Oct 2009 18:25
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22730 Location: Silicon Valley
Программная эмуляция троичного процессора будет вычерпывать из внешней последовательной памяти (по I2C на частоте 400 кГц) байты, в которых будут хранится триады (два бита на один трит) с контрольным тритом, блоками по 27 триад во внутренний "кеш" команд, по которому будет проходить быстрая эмуляция. Кеша данных наверное не будет (во всяком случае пока), т.е. для данных будет прямое чтение-запись триад. По коду видно, что в переменных пика выделены две области по 27 байт - с адресами от 32 до 58 (c_base) и от 59 до 86 (d_base - эта область предполагалась для кеша данных, но скорее всего там будет вторая страницы блока команд) - именно туда будут сливаться команды для эмуляции на максимальной скорости pic16f870 - 5 миллионов команд в секунду (при тактовой частое 20 МГц). Например подпрограмма троичной инверсии (tri_neg) занимает 14 тактов - это значит что на максимальной скорости этот "эмулятор" сможет делать 357 тысяч троичных инверсий в секунду.
P.S. Уже когда я начал писать код, я понял, что схему железяки надо было строить несколько иначе - например если бы младшие биты тритов сидели в младших 4 битах байта, а старшие биты тритов - в старших 4 битах байта, то троичную инверсию на таком бинарном представлении можно было бы делать одной пиковской командой swap (которая переставляет половинки байта местами). Но это наверное будет уже другая железяка (сильно попозже) - под названием "3niti alpha simu2"
P.P.S. Хотя например сдвиги будет проще реализовать именно когда младшие и старшие биты тритов чередуются как в текущей схеме...
Отличия от первой ревизии:
- троичное лого на плате;
- немного изменены несколько строчек легенды слева вверху;
- добавлены 15 диодов, которые позволяют переключателям срабатывать совместно и независимо друг от друга;
- второй подтягивающий резистор на шине I2C (по идее он не нужен, но пусть будет);
- возможность с помощью джампера включить защиту от записи второй половинки внешней памяти;
- светодиод индикации подключен иначе (на питание вместо земли).
Старая плата будет мигать светодиодом индикации когда эмулирует троичный вычислитель (рекомендуется зелёный светодиод), а новая - когда обращается к внешней памяти (рекомендуется красный сетодиод).
Last edited by Shaos on 09 Apr 2010 18:28, edited 1 time in total.
26 Nov 2009 17:39
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22730 Location: Silicon Valley
Готов второй тест первой платы - ТРОИЧНЫЕ ЧАСЫ:
Code:
; t1_test2.asm - 2nd test for 3niti alpha simu1 (updated 27 Nov 2009) ; TERNARY CLOCK: HOURS - 4 TRITS, MINUTES - 4 TRITS, SECONDS - 4 TRITS ; ; Part of NedoPC SDK (software development kit for simple devices) ; ; Copyright (C) 2009, Alexander A. Shabarshin <ashabarshin@gmail.com> ; ; This program is free software: you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by ; the Free Software Foundation, either version 3 of the License, or ; (at your option) any later version. ; ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; ; You should have received a copy of the GNU General Public License ; along with this program. If not, see <http://www.gnu.org/licenses/>.
processor pic16f870 radix dec include "p16f870.inc" __CONFIG _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _LVP_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC include "shaos-p16.inc"
; PORTA - outputs to choose column (A0...A4) and direct LED (A5) ; PORTB - inputs for rows of switches (B0...B5) and I2C (B6,B7) ; PORTC - outputs for rows of LEDs (C0...C5) and RS232 (C6,C7)
BSIZE EQU 27 ; -13...+13 INTCNT EQU 3
; Specific vars 0x20...0x6F (banks 0 and 2)
c_base EQU 32 ; ternary code segment 0x20...0x3A d_base EQU 59 ; ternary data segment 0x3B...0x55 (may be used as 2nd code segment) e_base EQU 86 ; end of segments (0x56) c_addr EQU 0x57 d_addr EQU 0x58 CA_m EQU 0x59 ; current code segment address (middle and high parts) CA_h EQU 0x5A DA_m EQU 0x5B ; current data segment address (middle and high parts) DA_h EQU 0x5C PC_l EQU 0x5D ; PC PC_m EQU 0x5E PC_h EQU 0x5F DPn_l EQU 0x60 ; DPn DPn_m EQU 0x61 DPn_h EQU 0x62 DPo_l EQU 0x63 ; DPo DPo_m EQU 0x64 DPo_h EQU 0x65 DPp_l EQU 0x66 ; DPp DPp_m EQU 0x67 DPp_h EQU 0x68 F_reg EQU 0x69 ; Register F (RSF,DPF,BCF) A_reg EQU 0x6A ; Register A B_reg EQU 0x6B ; Register B C_reg EQU 0x6C ; ??? D_reg EQU 0x6D ; Data to display on LEDs 10,11,12
после включения надо переключателями выставить текущее время и сдвинуть переключатель W/R вверх и сразу вниз - после этого часы будут показывать текущее время, убегая вперёд на 1 секунду каждые 31 минуту
Users browsing this forum: No registered users and 2 guests
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum