3niti alpha simu1 - троичный компьютер на двоичном пике

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

Moderator: Shaos

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

3niti alpha simu1 - троичный компьютер на двоичном пике

Post by Shaos »

Решил пусть это будет модуль с троичными переключателями и светодиодами (объединёнными в матрицу), куда будет втыкаться плата nedoCPU-16 (на основе PIC16F780) в которую опционально может быть воткнут модуль RS-232 (для связи с компьютером). nedoCPU имеет интерфейс 3x8 - 6 пинов из порта A (плюс земля и питание), 8 пинов из порта B и 8 пинов из порта С (2 из которых в нашем случае могут быть заюзаны на RS-232). Для опроса матрицы кнопок и светодиодов воспользуемся 5 выходами порта A которые по очереди открывают 5 транзисторов. 6 выходов порта C пойдут на светодиоды, а 6 входов порта B (с включёнными подтягивающими резисторами) будут брать кнопки. Ниже предоставлены схемы и разводка ноябрьского варианта платы Rev.B:

Image

Image

Image

Размер платы - 5.00 x 3.75 дюймов (или если в миллиметрах, то 127x95 ) - причём возможен также вариант с отпиливанием nedoCPU-16 (будет втыкаться в NI-3x8)

P.S. На базе той же платы можно собрать красно-зелёные троичные часы (см. чуть ниже тест номер 2)

P.P.S. 26 ноября 2009 года закончил и выложил Rev.B со всеми исправлениями
Last edited by Shaos on 19 Nov 2011 15:40, edited 9 times in total.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24011
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

А вот архив со всеми исходниками для Eagle (sch+brd) плюс файлы Gerber пригодные для производства:

Rev.B: http://nedopc.org/nedopc/16/nedo16v1t-eagle.zip (176K)

Вот предполагаемый внешний вид ноябрьской платы "Rev.B" со стороны компонентов:

Image

и со стороны пайки:

Image

P.S. Всё под лицензией GPL3
Last edited by Shaos on 26 Nov 2009 21:54, edited 5 times in total.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24011
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Вот и первая партия плат подошла - 15 штук с ускоренной доставкой обошлись в $498 (это по $33 за штучку):

Image

Image

P.S. Это уже устервшая первая ревизия - требует специальной сборки для нормальной работы, см. http://ternary.info/modules/newbb/viewt ... 59&forum=4
Last edited by Shaos on 26 Nov 2009 19:45, edited 6 times in total.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24011
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Собрана первая плата:

Image

Image

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

Post by Shaos »

Первый тест (пока без микроконтроллера):

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

Post by Shaos »

Отвечаю партизанам-подпольщикам, втихушку просматривающих этот топик и обсуждающих мою персону и мои дела в своём гадюшнике:

По поводу радиатора: по-моему, лучше перебдеть с отводом тепла, чем недобдеть.

По поводу цен: у меня товар штучный, поэтому дорогой - ведь всем известно, что при объёмах партии стремящихся к бесконечности, себестоимость одной штуки стремится к нулю, но на бесконечность у меня денег нет. Если у кого есть желание делать дешевле - берём исходники для игла или прямо герберы и заказываем самостоятельно.

По поводу разводки: незнаю почему кому-то показалось что разводка выполнена методом "автороут в пикаде" - во-первых, у меня не пикад, а игл, а во-вторых, я покупал только стандартный редактор схем игла и стандартный редактор печатных плат игла, а вот стандартный автороутер игла покупать не стал, ибо уже дорого - поэтому я попросту не мог делать автороут т.к. у меня нет оного (фришный перестал работать после переключения на стандартную версию) - а это значит, что разводка была "ручная".

P.S. Автороутером я разводил одну единственную плату почти три года назад - NedoText
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24011
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Тест с микроконтроллером показал, что включённые переключатели, если их включено больше одного - коротят транзисторы и другие переключатели, что зажигает те светодиоды, которые не должны гореть - видимо без дополнительных диодов не обойтись - инструкцию по корректированию печатной платы вывешу позже...

P.S. Если кто хочет следить за развитием кода, идём на SF: http://nedopc.cvs.sourceforge.net/viewv ... pix/simu1/

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

Post by Shaos »

Shaos wrote:Тест с микроконтроллером показал, что включённые переключатели, если их включено больше одного - коротят транзисторы и другие переключатели, что зажигает те светодиоды, которые не должны гореть - видимо без дополнительных диодов не обойтись - инструкцию по корректированию печатной платы вывешу позже...
Проблема решается припаиванием 15 диодов - свою плату мне пришлось немного порезать, однако я уже придумал способ сборки, при котором дорожки резать не придётся (при этом диоды будут навесиком).
А пока это выглядит вот так (всего я припаял 20 диодов, однако 15 должно хватить, а те 5 что сверху припаяны - лишние):

Image

Image

P.S. Проблема исправлена 26 ноября 2009 года в Rev.B

А вот первая тестовая программа, которая принимает ввод с переключателей, троично инвертирует, и посылает на светодиоды:

Code: Select all

; 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)

bsize	EQU	27 ; -13...+13

; Variables

; Global vars 0x70...0x7F (all banks)

cnt1	EQU	0x75
cnt2	EQU	0x76
tmp0	EQU	0x77
tmp1	EQU	0x78
tmp2	EQU	0x79
tmpA	EQU	0x7A
tmpB	EQU	0x7B
tmpC	EQU	0x7C
mask	EQU	0x7D
count	EQU	0x7E

; Reset vector
	ORG 00h
	goto Start

; Interrupt vector
	ORG 04h
	retfie

Start:

; Configure all I/O pins as digital
	_bank1
	_movlr 0x06,ADCON1

; Set direction of ports
	_bank1
	_movlr b'00000000',TRISA
	_movlr b'00111111',TRISB
	_movlr b'11000000',TRISC

; Initialize output ports
	_bank0
	_movlr b'11111111',PORTA
	_movlr b'11111111',PORTB
	_movlr b'11111111',PORTC

; 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: Select all

; 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. Вот скомпилированный код для микроконтроллера:

Code: Select all

:020000040000FA
:020000000528D1
:08000800090083160313063002
:100010009F0083160313003085003F308600C030F8
:10002000870083120313FF308500FF308600FF3006
:100030008700831603138B018113011783120313A7
:1000400064002D28F8005539F9007808AA39F8001D
:100050000310F90D780C79040800FE30FD0005301E
:10006000FE007D0885000A30F500F50B35280608EE
:10007000222087000030F500F50B3C280314FD0D0D
:06008000FE0B31282D28C3
:02400E00723D01
:00000001FF
P.S. Программа переведены в PUBLIC DOMAIN в ноябре 2011 года
Last edited by Shaos on 17 Nov 2011 19:09, edited 4 times in total.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24011
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Видео первого теста :roll:



P.S. Чтобы светодиоды горели ярче, можно попробовать уменьшить сопротивление резисторов, через которые они подключены
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24011
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

BILL OF MATERIALS:

Code: Select all

component        where to buy            quantity
PIC16F870        jameco.com 246895       1
socket DIP-28    jameco.com 689961       1  NEW:114412
tactile switch   jameco.com 153251       1
4-pin header     digikey.com 609-2234-ND 1  NEW:S5479-ND (right angle)
20MHz crystal    mouser.com 815-AB-20-B2 1
v-reg 7805       jameco.com 51262        1
red LED 5mm      mouser.com 78-TLHR5400  1
red LED 3mm      mouser.com 604-WP7104HD 1  NEW:604-WP7104LYD Yellow
power terminal   jameco.com 152347       1
transistor BC557 mouser.com 512-BC557BTF 5
serial mem 24c32 jameco.com 200563       1
socket DIP-8     jameco.com 390261-2     1  NEW:51626
red-green LED CA mouser.com 604-WP59EGW/CA 15
diode 1N914      mouser.com 512-1N914    15 NEW:179207 Jameco
switch SP3T      mouser.com 611-OS103012MU2QP1 15
resistor 10K     jameco.com 691104       3
resistor 330     jameco.com 690742       8
resistor 3K3     jameco.com 690988       6
capacitor 22pF   jameco.com 15405        2 
capacitor 100uF  jameco.com 207811       1  NEW:29962
capacitor 10uF   jameco.com 1946287      1  NEW:1946359
capacitor 0.1uF  jameco.com 33488        2 (not 33486!)
Советский аналог использованных транзисторов - КТ3107АМ...КТ3107КМ: http://www.dectel.ru/dectel_el/analogue ... 3107.shtml
Советский аналог использованных диодов - КД521 или аналогичный
Last edited by Shaos on 06 Nov 2011 13:42, edited 7 times in total.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24011
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Программная эмуляция троичного процессора будет вычерпывать из внешней последовательной памяти (по 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. Хотя например сдвиги будет проще реализовать именно когда младшие и старшие биты тритов чередуются как в текущей схеме...
Last edited by Shaos on 26 Nov 2009 19:49, edited 1 time in total.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24011
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

В подкорректированной плате (Rev.B), которую я планирую сделать в ноябре, попробую изобразить логотип 3niti.org и ternary.info:

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

Post by Shaos »

Готова ревизия B с троичным лого (нарисовано и медью, и шелкографией):

Image

Rev.B: http://nedopc.org/nedopc/16/nedo16v1t-eagle.zip (176K)

Отличия от первой ревизии:
- троичное лого на плате;
- немного изменены несколько строчек легенды слева вверху;
- добавлены 15 диодов, которые позволяют переключателям срабатывать совместно и независимо друг от друга;
- второй подтягивающий резистор на шине I2C (по идее он не нужен, но пусть будет);
- возможность с помощью джампера включить защиту от записи второй половинки внешней памяти;
- светодиод индикации подключен иначе (на питание вместо земли).

Старая плата будет мигать светодиодом индикации когда эмулирует троичный вычислитель (рекомендуется зелёный светодиод), а новая - когда обращается к внешней памяти (рекомендуется красный сетодиод).
Last edited by Shaos on 09 Apr 2010 18:28, edited 1 time in total.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24011
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Готов второй тест первой платы - ТРОИЧНЫЕ ЧАСЫ:

Code: Select all

;    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

; Specific vars 0xA0...0xBF (banks 1 and 3)

; Global vars 0x70...0x7F (all banks)

swit0	EQU	0x70 ; copy of switch row 0
swit1	EQU	0x71 ; copy of switch row 1
swit2	EQU	0x72 ; copy of switch row 2
swit3	EQU	0x73 ; copy of switch row 3
swit4	EQU	0x74 ; copy of switch row 4
cnt1	EQU	0x75
cnt2	EQU	0x76
tmp0	EQU	0x77
tmp1	EQU	0x78
tmp2	EQU	0x79
tmp3	EQU	0x7A
mask	EQU	0x7B
count	EQU	0x7C
savedT	EQU	0x7D ; saved TMP
savedW	EQU	0x7E ; saved W
savedS	EQU	0x7F ; saved STATUS


; Reset vector
	ORG 00h
	goto Start

; Interrupt vector
	ORG 04h
	movwf	savedW
	_movrr	STATUS,savedS
	_bank0

	btfss	INTCON,T0IF
	goto	intend

;	_movrr	tmp1,savedT
	decfsz	tmp0,f
	goto	intend1
	_movlr	INTCNT,tmp0

	btfss	C_reg,5
	goto	ii_1
	bcf	C_reg,5
	bsf	C_reg,4
	goto	ii_2
ii_1:	btfss	C_reg,4
	bsf	C_reg,5
	bcf	C_reg,4
	goto	intend1
ii_2:	btfss	C_reg,3
	goto	ii_3
	bcf	C_reg,3
	bsf	C_reg,2
	goto	ii_4
ii_3:	btfss	C_reg,2
	bsf	C_reg,3
	bcf	C_reg,2
	goto	intend1
ii_4:	btfss	C_reg,1
	goto	ii_5
	bcf	C_reg,1
	bsf	C_reg,0
	goto	ii_6
ii_5:	btfss	C_reg,0
	bsf	C_reg,1
	bcf	C_reg,0
	goto	intend1
ii_6:
	btfss	D_reg,5
	goto	ii1
	bcf	D_reg,5
	bsf	D_reg,4
	goto	ii2
ii1:	btfss	D_reg,4
	bsf	D_reg,5
	bcf	D_reg,4
	goto	iiM
ii2:	btfss	D_reg,3
	goto	ii3
	bcf	D_reg,3
	bsf	D_reg,2
	goto	ii4
ii3:	btfss	D_reg,2
	bsf	D_reg,3
	bcf	D_reg,2
	goto	iiM
ii4:	btfss	D_reg,1
	goto	ii5
	bcf	D_reg,1
	bsf	D_reg,0
	goto	ii6
ii5:	btfss	D_reg,0
	bsf	D_reg,1
	bcf	D_reg,0
	goto	iiM
ii6:	btfss	PC_l,5
	goto	ii7
	bcf	PC_l,5
	bsf	PC_l,4
	goto	iiM
ii7:	btfss	PC_l,4
	bsf	PC_l,5
	bcf	PC_l,4

iiM:	movf	D_reg,w
	sublw	b'00001000'
	btfss	STATUS,Z
	goto	intend1
	btfsc	PC_l,4
	goto	intend1
	btfss	PC_l,5
	goto	intend1
	movlw	b'00000100'
	movwf	D_reg
	bsf	PC_l,4
	bcf	PC_l,5

	btfss	PC_l,3
	goto	ii8
	bcf	PC_l,3
	bsf	PC_l,2
	goto	ii9
ii8:	btfss	PC_l,2
	bsf	PC_l,3
	bcf	PC_l,2
	goto	iiH
ii9:	btfss	PC_l,1
	goto	ii10
	bcf	PC_l,1
	bsf	PC_l,0
	goto	ii11
ii10:	btfss	PC_l,0
	bsf	PC_l,1
	bcf	PC_l,0
	goto	iiH
ii11:	btfss	PC_m,5
	goto	ii12
	bcf	PC_m,5
	bsf	PC_m,4
	goto	ii13
ii12:	btfss	PC_m,4
	bsf	PC_m,5
	bcf	PC_m,4
	goto	iiH
ii13:	btfss	PC_m,3
	goto	ii14
	bcf	PC_m,3
	bsf	PC_m,2
	goto	iiH
ii14:	btfss	PC_m,2
	bsf	PC_m,3
	bcf	PC_m,2

iiH:	movf	PC_l,w
	andlw	b'00001111'
	sublw	b'00000010'
	btfss	STATUS,Z
	goto	intend1
	movf	PC_m,w
	andlw	b'00111100'
	sublw	b'00001000'
	btfss	STATUS,Z
	goto	intend1
	bsf	PC_l,0
	bcf	PC_l,1
	bsf	PC_m,2
	bcf	PC_m,3

	btfss	PC_m,1
	goto	ii15
	bcf	PC_m,1
	bsf	PC_m,0
	goto	ii16
ii15:	btfss	PC_m,0
	bsf	PC_m,1
	bcf	PC_m,0
	goto	iiD
ii16:	btfss	PC_h,5
	goto	ii17
	bcf	PC_h,5
	bsf	PC_h,4
	goto	ii18
ii17:	btfss	PC_h,4
	bsf	PC_h,5
	bcf	PC_h,4
	goto	iiD
ii18:	btfss	PC_h,3
	goto	ii19
	bcf	PC_h,3
	bsf	PC_h,2
	goto	ii20
ii19:	btfss	PC_h,2
	bsf	PC_h,3
	bcf	PC_h,2
	goto	iiM
ii20:	btfss	PC_h,1
	goto	ii21
	bcf	PC_h,1
	bsf	PC_h,0
	goto	iiD
ii21:	btfss	PC_h,0
	bsf	PC_h,1
	bcf	PC_h,0

iiD:	btfsc	PC_m,0
	goto	intend1
	btfsc	PC_m,1
	goto	intend1
	movf	PC_h,w
	sublw	b'00100010'
	btfss	STATUS,Z
	goto	intend1
	clrf	PC_h

intend1:
;	_movrr	savedT,tmp1
	_movlr	15,TMR0
	bcf	INTCON,T0IF
intend:
	_movrr	savedS,STATUS
	movf	savedW,w
	retfie

Start:

; Configure all I/O pins as digital
	_bank1
	_movlr 0x06,ADCON1

; Set direction of ports
	_bank1
	_movlr b'00000000',TRISA
	_movlr b'00111111',TRISB
	_movlr b'00000000',TRISC

; Initialize output ports
	_bank0
	_movlr b'11111111',PORTA
	_movlr b'11111111',PORTB
	_movlr b'11111111',PORTC

; 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
	bcf	OPTION_REG,T0CS ; enable Timer0 in timer mode
	bcf	OPTION_REG,PSA ; assign prescaler to the Timer0 (1:256)
	bsf	INTCON,T0IE ; enable Timer0 interrupt
	bcf	INTCON,INTE ; disable 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

; Ternary increment of W (used tmp1), C if overflow
tri_inc:
	bcf	STATUS,C
	movwf	tmp1
	btfss	tmp1,5
	goto	tri_i4
	bcf	tmp1,5
	bsf	tmp1,4
	goto	tri_i3
tri_i4:	btfss	tmp1,4
	bsf	tmp1,5
	bcf	tmp1,4
	movf	tmp1,w
	return
tri_i3:	btfss	tmp1,3
	goto	tri_i2
	bcf	tmp1,3
	bsf	tmp1,2
	goto	tri_i1
tri_i2:	btfss	tmp1,2
	bsf	tmp1,3
	bcf	tmp1,2
	movf	tmp1,w
	return
tri_i1:	btfss	tmp1,1
	goto	tri_i0
	bcf	tmp1,1
	bsf	tmp1,0
	goto	tri_ic
tri_i0:	btfss	tmp1,0
	bsf	tmp1,1
	bcf	tmp1,0
	movf	tmp1,w
	return
tri_ic: movf	tmp1,w
	bsf	STATUS,C
	return

Main:

; Initialize registers
	movlw	b'11111111'
	movwf	swit0
	movwf	swit1
	movwf	swit2
	movwf	swit3
	movwf	swit4
	clrf	PC_h
	clrf	PC_m
	clrf	PC_l
	clrf	A_reg
	clrf	B_reg
	clrf	C_reg
	clrf	D_reg
	clrf	F_reg
	_movlr	INTCNT,tmp0

	bsf	PORTA,5 ; fire LED

; Test program
loop:
	movlw	b'11111110'
	movwf	mask
	movlw	5
	movwf	count
	movlw	swit0
	movwf	FSR
loop0:	movf	mask,w
	movwf	PORTA
	_delay1 10,cnt1
	movf	PORTB,w
	call	tri_neg
	movwf	INDF
	incf	FSR,f
	btfsc	mask,0
	goto	loop1
	comf	PC_h,w
	goto	loop6
loop1:	btfsc	mask,1
	goto	loop2
	comf	PC_m,w
	goto	loop6
loop2:	btfsc	mask,2
	goto	loop3
	comf	PC_l,w
	goto	loop6
loop3:	btfsc	mask,3
	goto	loop4
	comf	D_reg,w
	goto	loop6
loop4:	comf	C_reg,w
loop6:	movwf	PORTC
	_delay1	0,cnt1
	bsf	STATUS,C
	rlf	mask,f
	decfsz	count,f
	goto	loop0
	movf	mask,w
	movwf	PORTA

	btfsc	swit4,1
	goto	loop
	comf	swit0,w
	movwf	PC_h
	comf	swit1,w
	movwf	PC_m
	comf	swit2,w
	movwf	PC_l
	comf	swit3,w
	movwf	D_reg

	goto	loop

	END
скомпилированный код:

Code: Select all

40000FA
:02000000BD2819
:08000800FE000308FF00831253
:1000100003130B1DB928F70BB6280330F700EC1EAD
:100020001428EC126C1618286C1EEC166C12B628EC
:10003000EC1D1D28EC116C1521286C1DEC156C11A4
:10004000B628EC1C2628EC106C142A286C1CEC1426
:100050006C10B628ED1E2F28ED126D1633286D1E7C
:10006000ED166D124D28ED1D3828ED116D153C284B
:100070006D1DED156D114D28ED1C4128ED106D1411
:1000800045286D1CED146D104D28DD1E4A28DD122B
:100090005D164D285D1EDD165D126D08083C031DC2
:1000A000B6285D1AB628DD1EB6280430ED005D16B0
:1000B000DD12DD1D5E28DD115D1562285D1DDD157B
:1000C0005D117C28DD1C6728DD105D146B285D1C2C
:1000D000DD145D107C28DE1E7028DE125E1674288A
:1000E0005E1EDE165E127C28DE1D7928DE115E158E
:1000F0007C285E1DDE155E115D080F39023C031D74
:10010000B6285E083C39083C031DB6285D14DD1096
:100110005E15DE11DE1C8F28DE105E1493285E1C37
:10012000DE145E10AD28DF1E9828DF125F169C28B3
:100130005F1EDF165F12AD28DF1DA128DF115F15DE
:10014000A5285F1DDF155F114D28DF1CAA28DF10D1
:100150005F14AD285F1CDF145F105E18B628DE1830
:10016000B6285F08223C031DB628DF010F3081004E
:100170000B117F0883007E080900831603130630E5
:100180009F0083160313003085003F308600003047
:10019000870083120313FF308500FF308600FF3095
:1001A0008700831603138B018113011781128111BC
:1001B0008B160B128B178312031364000D29F800A2
:1001C0005539F9007808AA39F8000310F90D780CB0
:1001D000790408000310F800F81EF128F8127816C8
:1001E000F628781EF816781278080800F81DFB2803
:1001F000F81178150029781DF8157811780808008D
:10020000F81C0529F81078140A29781CF8147810BD
:1002100078080800780803140800FF30F000F100A7
:10022000F200F300F400DF01DE01DD01EA01EB0181
:10023000EC01ED01E9010330F7008516FE30FB000B
:100240000530FC00703084007B0885000A30F50022
:10025000F50B28290608DF208000840A7B18322944
:100260005F093F29FB1836295E093F297B193A2986
:100270005D093F29FB193E296D093F296C0987005B
:100280000030F500F50B42290314FB0DFC0B24296B
:100290007B088500F4181E297009DF007109DE0053
:0A02A0007209DD007309ED001E294C
:02400E00723D01
:00000001FF
после включения надо переключателями выставить текущее время и сдвинуть переключатель W/R вверх и сразу вниз - после этого часы будут показывать текущее время, убегая вперёд на 1 секунду каждые 31 минуту
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24011
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Видео второго теста:

Я тут за главного - если что шлите мыло на me собака shaos точка net