Tag Archives: hardware

Composite video PCB working

UPDATE 20221108

Soldered the components on the print
No more sync issues! (see post https://www.henriaanstoot.nl/2022/10/19/composite-video-with-atmega328p/ )

There are some duplicate characters, the input device below does not have a proper debounce method.

My temporary input device (note hex 21 is a “!” character)

No need to fix the debounce, the dipswitches are temporary. This will be controlled by the VIA 6522 chip.

UPDATE 20221108 (Connected to second VIA)

PORTB = $5000
PORTA = $5001
DDRB = $5002
DDRA = $5003
clock = $e0

E  = %10000000
RW = %01000000
RS = %00000000

  .org $0200

reset:
  ldx #$ff
  txs

  lda #%11111111 ; Set all pins on port B to output
  sta DDRB
  lda #%10000000 ; Set top pin on port A to output
  sta DDRA
  lda #$00  ; reset bit
  sta PORTA
  sta clock

  ldx #0
print:
  lda message,x
  beq printborder
  jsr print_char
  inx
  jmp print

loop:
  jmp loop

message:
        .db 0x01,0x04,0x0C,0x0E,0x10,0x0F,0x08
        .db 0x05,0x0a,0x0a
        .db 0x05,0x0b,0x0b
        .asc "Composite Video 6502 - 20221108"
        .db 0x0E,0x11,0x0F,0x0C
        .asciiz " With 2 pixels "

waitloop:
  pha
  tya
  pha
  ldy #$ff
back:
  dey
  bne back
  pla
  tay
  pla
  rts

print_char:
  sta PORTB
  jsr waitloop
  jsr waitloop
  lda clock
  eor #%10000000
  sta clock
  sta PORTA
  jsr waitloop
  lda clock
  eor #%10000000
  sta PORTA
  jsr waitloop
  rts

Control codes as from : http://searle.x10host.com/MonitorKeyboard/index.html

Video display control codes:
Hex (Decimal) and meaning
01 (01) - Cursor home (Standard ASCII)
02 (02) - Define cursor character (2nd byte is the curs character, or 00 to turn off) <--New for 3.0
03 (03) - Cursor blinking
04 (04) - Cursor solid
05 (05) - Set graphics pixel (next two bytes = x,y) <--New for 3.0
06 (06) - Reset graphics pixel (next two bytes = x,y) <--New for 3.0
08 (08) - Backspace (Standard ASCII)
09 (09) - Tab (Standard ASCII)
0A (11) - Linefeed (Standard ASCII)
0C (12) - Clear screen (Standard ASCII)
0D (13) - Carriage return (Standard ASCII)
0E (14) - Set column 0 to 79 (2nd byte is the column number) or 0 to 39 for a 40 char line
0F (16) - Set row 0 to 24 (2nd byte is the row number)
10 (16) - Delete start of line
11 (17) - Delete to end of line
12 (18) - Delete to start of screen
13 (19) - Delete to end of screen
14 (20) - Scroll up
15 (21) - Scroll down
16 (22) - Scroll left
17 (23) - Scroll right
18 (24) - Set font attribute for the current line (see elsewhere on this page for details) <--New for 3.0
1A (26) - Treat next byte as a character (to allow PC DOS char codes 1 to 31 to be displayed on screen)
1B (27) - ESC - reserved for ANSI sequences
1C (28) - Cursor right
1D (29) - Cursor Left
1E (30) - Cursor up
1F (31) - Cursor down
20 (32) to 7E (126) - Standard ASCII codes
7F (127) - Delete
80 (128) to FF (255) - PC (DOS) extended characters

7 segment displays/keyboard decoders in SDK’s

There are a lot of old develop boards for all kinds for cpu’s.

These where build to learn machine code programming. Mostly made in the 80’s, and based on populair cpu’s at that time.

I own a some of these SDK’s (System Design Kits)

8085 – SDK85 i bought recently 8085 CPU
Microprofessor-1 (MPF-1) Z80 CPU
And my own 680x based computer

Most of these use a keyboard scanner which is also connected to 7 segment displays.

The way they work is practically the same. There is a VIA or PIA. Versitile interface adaptor, or Peripheral interface adaptor. These have two times 8 bits to control devices.
When using 4 bits and convert these to 16 lines by using a 75ls145 for example. If you put a counter on those 4 bits, you sequently activate 1 of 16 lines. These lines you can use to scan a keyboard matrix OR display a character on a 7 segment display. These display’s won’t hold the data (and show the character) when not activated. The trick is to update de display fast enough so you don’t see the flickering on/off.

Activate a line and read a byte with the VIA = Reading keyboard row
Activate a line and write a byte with the VIA = Display on a segment

These VIA/PIA’s where made with specific timings to match the CPU.
6522/6820/8255

Below you see some different implementations of these keyboard/display combo’s

Thaler 6502 kit
Microprofessor MPF-1 kit (ignore red circle)
SDK85 kit
Eltec 6800
My version using darlington arrays (ULN2003)

When looking at the 8085 version you see transistors being a ULN2003 is a chip with those transistors/amplification enclosed.
It doesn´t draw much current from the bus, and diodes protect the way the current flows.

Generic Matrix Keyboard Print

I only have to check my new design for a generic matrix keyboard once again, and then i’m going to order a few of these prints.

  • 32 keys (2 blocks of 16)
  • 1 key is changeable from generic key to reset signal key
  • jumper header connector VCC, GND, DataAvailable, Reset and 5 data lines

I’ve used the opensource tool freeroute to autoroute the coppertraces

  • From Kicad export PCB in Spectra DNS format
  • Open Freeroute and run autoroute
  • export as Spectra Session File
  • In kicad import this session file again

Autotraced …
Front
Back
Current setup

TODO: Look into charlieplexing ! For input and Led control

Raspberry and SSD

I had a crash recently on one of my raspberry-pi’s ..
SDcard failure, they are not made for a lot of write actions.
In the past i’ve changed some images to read only and with a r/w overlay.
Also tmp filesystems in memory .. all not ideal.

So i’ve started to make every RPi ssd bootable.

I’ve got several ssd already from other projects.
Sata to USB adaptors are cheap, only a few euro’s.

Steps to take:

  • Download Raspberry Pi Imager tool
  • Choose OS > Misc Utility Images > Bootloader > USB Boot
  • Select storage and write to a temporary sd-card (Not needed any more after flashing for normal operations)
  • Boot USB with this Micro-SDcard .. i didn’t have a screen connected .. So i just waited a few minutes
  • While i was waiting i wrote a OS image to the SSD using the same imager tool
  • Choose OS > select sata/ssd drive
  • Change options (cog), enable ssh, choose hostname and set password
  • Write to drive
  • Remove sdcard from RPi attach ssd/sata and boot

My 3D printed sdcard case, luckily there was still one in there (32GB kindda big, but it was only for temporary use .. 16GB was broken ..

So .. without attaching a screen or keyboard, just a network cable. I have a running OS on a RPi from SSD

SDK-85 in 2022

I was posting about the 8085 System Design Kit in may, but now i’ve got one!

I found one online, it is a very clean almost like its never been used version!

More follows!

More info at http://www.bitsavers.org/components/intel/8085/

3DMouse and blender

UPDATE: 2022-09-29

Yesterday i got two 3DConnexion 3D CAD mouses (mice) from my friend Vincent. While we where fixing his Mikrotik network i got to play with these cool devices.

I always wanted one of those, but they are quite expensive

First i tried to install the Software from 3DConnexion. It kindda worked but needed some workarounds and still wasn’t okay.

Downloaded 3dxware-linux-v1-8-0.x86_64.tar.gz (Maybe this version is TOO new, SpacePilot i a little ouder)
there is a install-3dxunix.sh, but it was made for Suse/Redhat

This program needed motif .. and a lot of libraries (libmotif/libxm)
After that some fonts xfonts-100dpi xfonts-75dpi


workaround was starting by 
sudo /etc/3DxWare/daemon/3dxsvr -userName ${USER} -d usb

After that the demo program worked perfectly … but Blender didn’t
After some tinkering it work a little, it was far to sensitive, and was all over the place.

Luckily i found a opensource replacement. https://spacenav.sourceforge.net/
git cloned the package, then i notished .. there is a precompiled version for ubuntu!

apt-get install spacenavd .. start the service .. and go!

i cloned the test demos (libspnav) and compiled those test programs.

apt-get install libglu1-mesa-dev
git clone https://github.com/FreeSpacenav/libspnav.git
cd libspnav
./configure
make
... fly is a nice little test program

So lets start blender

Pan tilt roll .. nice!

This wil speedup modeling, and for sure sculpting !

Some settings which worked for me .. let the tweaking begin!

UPDATE: 2022-09-29

I removed the version in the apt repository, and installed everything from git. Now i have a cool configure tool

Homewizard Watermeter

Today i got my watermeter in.

It’s a little device you can place on your watermeter.

You get a plastic clip/holder which you can use to place the device on your watermeter. You can easily remove the device to read the values.

The device measures the little round gauge, so it has no idea what the current values are. Add the current values of your meter to the output of the device.

The device works by measuring the rotation of the red part.

By default it sends the information over the internet to a server. Your phone connects to this server and the app wil give you the graphs.

If you want your own intergration, you have to enable “local api”
See image on the right.
When you want realtime data, you have to connect a usb-c power supply.
When using batteries, the device wil only connect to wifi once per 5 minutes, and you can’t use the API.

I wrote a little test script in bash to draw graphs using mqtt and Nodered.

#!/bin/bash
calib=29.621
data=$(curl -s http://10.1.1.176/api/v1/data)
totalwater=$(echo $data | cut -f9 -d\" | tr -d ':,')
currentwater=$(echo $data | cut -f11 -d\" | tr -d ':,}')
totalwater=$( echo $totalwater + $calib | bc)
mosquitto_pub -h 127.0.0.1 -m "$totalwater" -t watermeter/total
mosquitto_pub -h 127.0.0.1 -m "$currentwater" -t watermeter/current

Variable calib is what my watermeter was when i attached the device.
It wil add this to the newly measured values.

Home Assistant found the device using autodiscovery

I have to look into adjusting for offset in HA

6502 update

  • New amplifier part using a LM386
  • Buzzer and led on VIA 2, blinky and sound timed by the internal timers of the 6522
  • ACIA testing still going on, writing software
  • Mini matrix keyboard removed, and used the temporary cursor buttons for the test with a rom which allows for a 8bits upload method using a arduino and the 6522. (I’m working on the big keyboard)

Work in progress code

PORT2B = $5000 		; VIA PORTB
PORT2A = $5001 		; VIA PORTA
DDR2B = $5002  		; Data direction register
DDR2A = $5003  		; Data direction register

PORTB = $6000 		; display
PORTA = $6001 		; control display + matrix keyboard
DDRB = $6002  		; data direction register
DDRA = $6003  		; data direction register
SID = $7000   		; sid base address

E  = %10000000		; enable bit
RW = %01000000		; RW bit 
RS = %00100000		; Register Select bit 
HOME = %00000010 	; VIA PORTB HOME command
DADDR = %00010000 	; VIA DADDRESS

LINENO = $0200		; temp address linenumber (move to other location)
NEXTLINE = 40		; 2x16 Chars but internally 40


  .org $8000

reset:
  ldx #$ff
  txs		; reset stack

; ###################################################
; #                 DISPLAY CONTROL                 #
; ###################################################
; VIA Setup

  lda #%11111111 	; Set all pins on port B to output
  sta DDRB
  lda #%11100000 	; Set top 3 pins on port A to output
  sta DDRA

; DISPLAY Setup
  lda #%00111000 	; Set 8-bit mode; 2-line display; 5x8 font
  jsr lcd_instruction
  lda #%00001110 	; Display on; cursor on; blink off
  jsr lcd_instruction
  lda #%00000110 	; Increment and shift cursor; don't shift display
  jsr lcd_instruction
  lda #$00000001 	; Clear display
  jsr lcd_instruction

; ###################################################
; #             PRINT MESSAGE LINE NO 0             #
; ###################################################
  lda #0  		; set line number
  sta LINENO      	; store for subroutine
  jsr gotoline		; move cursor

  ldx #0		; message index pointer
print:
  lda message0,x 	; start of message
  beq nextprint      	; stop when null in message (asciiz <- Zero padded)
  jsr print_char	; print char
  inx			; incr index
  jmp print		; resume print
; ###################################################
; #             PRINT MESSAGE LINE NO 1             #
; ###################################################
nextprint:
  lda #1  		; set line number
  sta LINENO      	; store
  jsr gotoline
  ldx #0  		; index pointer                 
print2:
  lda message1,x  	; absolute address message + x in A
  beq sidsound        	; if x is 0, end of message     
  jsr print_char  	; jump subroutine
  inx             	; increment x
  jmp print2      	; loop print2



; ###################################################
; #             SID SOUND                           #
; ###################################################
sidsound:
  lda #0		
  sta SID+$5		; attack/decay duration
  	
  lda #250
  sta SID+$6		; sustain level/release duration
  	
  lda #$95		; frequency voice 1 low byte
  sta SID+$0
  	
  lda #$44		; frequency voice 1 high byte
  sta SID+$1
  
  lda #%00100001	; sawtooth + gate
  sta SID+$4		; control register voice 1
  
  lda #$0f		; filter mode and volume (bits 3-0 main volume)
  sta SID+$18		; filter mode and volume



; ###################################################
; #             2ND VIA                             #
; ###################################################
  lda #%11111111 	; set port A output
  sta DDR2A

  lda #%11111111	; all ones!
  sta PORT2A
; ###################################################
  lda #%11111111 	; set port A output
  sta DDR2A

  lda #%11111111	; all ones!
  sta PORT2A



; ###################################################
; #             MAIN PROGRAM LOOP                   #
; ###################################################
loop:
  jmp loop
;                   1234567812345678
message0: .asciiz  "VIA 1,2 SID TEST"
message1: .asciiz  "   FASH  2022   "

; ###################################################
; #             ONLY SUBROUTINES                    #
; ###################################################

; ###################################################
; #             Subroutine gotoline                 #
; # Moves character placement position on display   #
; # Needs : $LINENO ADDRESS                         #
; # Exit values : -                                 #
; # Destroys registers: -                           #
; ###################################################

gotoline:
  pha                             ; store a
  txa
  pha                             ; store x
  ldx LINENO
  lda #HOME                       ; cursor down
  jsr lcd_instruction
  lda #$80
nextline:
  ldx LINENO
  cpx #00
  beq endnextlines
loopline:
  adc #40
  jsr lcd_instruction
  dex
  stx LINENO
  jmp nextline
endnextlines:
  pla                             ; pop a
  tax                             ; a to x
  pla                             ; pop a
  rts




; ###################################################
; #             LCD SUBROUTINES                     #
; ###################################################
lcd_wait:
  pha
  lda #%00000000  ; Port B is input
  sta DDRB
lcdbusy:
  lda #RW
  sta PORTA
  lda #(RW | E)
  sta PORTA
  lda PORTB
  and #%10000000
  bne lcdbusy
  lda #RW
  sta PORTA
  lda #%11111111  ; Port B is output
  sta DDRB
  pla
  rts
lcd_instruction:
  jsr lcd_wait
  sta PORTB
  lda #0         ; Clear RS/RW/E bits
  sta PORTA
  lda #E         ; Set E bit to send instruction
  sta PORTA
  lda #0         ; Clear RS/RW/E bits
  sta PORTA
  rts
print_char:
  jsr lcd_wait
  sta PORTB
  lda #RS         ; Set RS; Clear RW/E bits
  sta PORTA
  lda #(RS | E)   ; Set E bit to send instruction
  sta PORTA
  lda #RS         ; Clear E bits
  sta PORTA
  rts

nmi:
  rti

irq:
  rti

  .org $fffa
  .word nmi
  .word reset
  .word irq
;  .word $0000

So i wasn’t being stupid designing a dual matrix keyboard thingy

As previously posted, i had an idea to create a dual matrix keyboard mashup using available components.

I mentioned that “it should theoretically work”. But only being using atf22v10c for a couple of days. It was a long shot.

I’ve put it to the test .. and it worked first time.

I can use above, to connect my extended matrix keyboard to a 6522 VIA chip using 5 pins and sending a data available signal to CA1.

This keyboard i was planning to use