nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 15 Nov 2018 05:17



Reply to topic  [ 52 posts ]  Go to page 1, 2, 3, 4  Next
3niti alpha simu1 - троичный компьютер на двоичном пике 
Author Message
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17121
Location: Colorado
Reply with quote
Решил пусть это будет модуль с троичными переключателями и светодиодами (объединёнными в матрицу), куда будет втыкаться плата 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 со всеми исправлениями

_________________
:eugeek: https://twitter.com/Shaos1973


Last edited by Shaos on 19 Nov 2011 16:40, edited 9 times in total.



27 Sep 2009 01:03
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17121
Location: Colorado
Reply with quote
Post 
А вот архив со всеми исходниками для Eagle (sch+brd) плюс файлы Gerber пригодные для производства:

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

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

Image

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

Image

P.S. Всё под лицензией GPL3

_________________
:eugeek: https://twitter.com/Shaos1973


Last edited by Shaos on 26 Nov 2009 22:54, edited 5 times in total.



03 Oct 2009 20:40
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17121
Location: Colorado
Reply with quote
Post 
Вот и первая партия плат подошла - 15 штук с ускоренной доставкой обошлись в $498 (это по $33 за штучку):

Image

Image

P.S. Это уже устервшая первая ревизия - требует специальной сборки для нормальной работы, см. http://ternary.info/modules/newbb/viewt ... 59&forum=4

_________________
:eugeek: https://twitter.com/Shaos1973


Last edited by Shaos on 26 Nov 2009 20:45, edited 6 times in total.



08 Oct 2009 18:08
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17121
Location: Colorado
Reply with quote
Post 
Собрана первая плата:

Image

Image

Время сборки - 4 часа

_________________
:eugeek: https://twitter.com/Shaos1973


09 Oct 2009 23:09
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17121
Location: Colorado
Reply with quote
Post 
Первый тест (пока без микроконтроллера):

Image

_________________
:eugeek: https://twitter.com/Shaos1973


10 Oct 2009 18:44
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17121
Location: Colorado
Reply with quote
Post 
Отвечаю партизанам-подпольщикам, втихушку просматривающих этот топик и обсуждающих мою персону и мои дела в своём гадюшнике:

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

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

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

P.S. Автороутером я разводил одну единственную плату почти три года назад - NedoText

_________________
:eugeek: https://twitter.com/Shaos1973


13 Oct 2009 17:28
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17121
Location: Colorado
Reply with quote
Post 
Тест с микроконтроллером показал, что включённые переключатели, если их включено больше одного - коротят транзисторы и другие переключатели, что зажигает те светодиоды, которые не должны гореть - видимо без дополнительных диодов не обойтись - инструкцию по корректированию печатной платы вывешу позже...

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

P.P.S. А к тем, кто не может найти конденсаторов на плате и путает сигнальные дорожки с земляными, большая просьба: сначала читаем даташит на микроконтроллер, чтобы понимать какие ноги куда вести должны, а потом уже вякаем...

_________________
:eugeek: https://twitter.com/Shaos1973


17 Oct 2009 12:33
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17121
Location: Colorado
Reply with quote
Post 
Shaos wrote:
Тест с микроконтроллером показал, что включённые переключатели, если их включено больше одного - коротят транзисторы и другие переключатели, что зажигает те светодиоды, которые не должны гореть - видимо без дополнительных диодов не обойтись - инструкцию по корректированию печатной платы вывешу позже...


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

Image

Image

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)

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:
; 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:
:020000040000FA
:020000000528D1
:08000800090083160313063002
:100010009F0083160313003085003F308600C030F8
:10002000870083120313FF308500FF308600FF3006
:100030008700831603138B018113011783120313A7
:1000400064002D28F8005539F9007808AA39F8001D
:100050000310F90D780C79040800FE30FD0005301E
:10006000FE007D0885000A30F500F50B35280608EE
:10007000222087000030F500F50B3C280314FD0D0D
:06008000FE0B31282D28C3
:02400E00723D01
:00000001FF


P.S. Программа переведены в PUBLIC DOMAIN в ноябре 2011 года

_________________
:eugeek: https://twitter.com/Shaos1973


Last edited by Shaos on 17 Nov 2011 20:09, edited 4 times in total.



17 Oct 2009 22:04
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17121
Location: Colorado
Reply with quote
Post 
Видео первого теста :roll:



P.S. Чтобы светодиоды горели ярче, можно попробовать уменьшить сопротивление резисторов, через которые они подключены

_________________
:eugeek: https://twitter.com/Shaos1973


17 Oct 2009 22:38
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17121
Location: Colorado
Reply with quote
Post 
BILL OF MATERIALS:
Code:
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 или аналогичный

_________________
:eugeek: https://twitter.com/Shaos1973


Last edited by Shaos on 06 Nov 2011 14:42, edited 7 times in total.



20 Oct 2009 19:25
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17121
Location: Colorado
Reply with quote
Post 
Программная эмуляция троичного процессора будет вычерпывать из внешней последовательной памяти (по 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. Хотя например сдвиги будет проще реализовать именно когда младшие и старшие биты тритов чередуются как в текущей схеме...

_________________
:eugeek: https://twitter.com/Shaos1973


Last edited by Shaos on 26 Nov 2009 20:49, edited 1 time in total.



20 Oct 2009 21:42
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17121
Location: Colorado
Reply with quote
Post 
В подкорректированной плате (Rev.B), которую я планирую сделать в ноябре, попробую изобразить логотип 3niti.org и ternary.info:

Image

_________________
:eugeek: https://twitter.com/Shaos1973


20 Oct 2009 21:57
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17121
Location: Colorado
Reply with quote
Post 
Готова ревизия B с троичным лого (нарисовано и медью, и шелкографией):

Image

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

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

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

_________________
:eugeek: https://twitter.com/Shaos1973


Last edited by Shaos on 09 Apr 2010 19:28, edited 1 time in total.



26 Nov 2009 18:39
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17121
Location: Colorado
Reply with quote
Post 
Готов второй тест первой платы - ТРОИЧНЫЕ ЧАСЫ:

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

; 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:
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 минуту

_________________
:eugeek: https://twitter.com/Shaos1973


28 Nov 2009 00:33
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17121
Location: Colorado
Reply with quote
Post 
Видео второго теста:


_________________
:eugeek: https://twitter.com/Shaos1973


28 Nov 2009 00:46
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 52 posts ]  Go to page 1, 2, 3, 4  Next

Who is online

Users browsing this forum: No registered users and 3 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

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.