;******************************************************************** ; M64282.ASM [copyright Andy Clark 1999] ; ; JAVRMOD for Mitsubishi 64823 artificial retina CCD ; ;******************************************************************** ; ;******************************************************************** ; DEFINE PORT PINS ;******************************************************************** ;.include "8515def.inc" ;port definitions .EQU CM_CONT = PORTD .EQU CM_DDR = DDRD .EQU AD_DATA = PINB .EQU AD_OUT = PORTB .EQU AD_DDR = DDRB .EQU CM_IN = TIFR ;signal definitions .EQU CMSIN = 2 .EQU CMLOAD = 3 .EQU CMRESET = 4 .EQU CMCLK = 5 .EQU CMREAD = 3 .EQU CMSTART = 4 ;command definitions .EQU CMD_RESET = 1 .EQU CMD_START = 2 ;register definitions .DEF TEMP = r20 .CSEG ;******************************************************************** ; MACRO DEFINITIONS ; START_BIT : uses the OCR1B output to provide a START pulse ;******************************************************************** .MACRO START_BIT ldi zl,0b00000000 out TCCR1B,zl ;stop timer out TCNT1H,zl ;clear count hi value out TCNT1L,zl ;clear count lo value out OCR1BH,zl ;clear compare hi value ldi zl,1 out OCR1BL,zl ;set compare lo to 1 CK ldi zl,@0 out TCCR1A,zl ldi zl,0b00000001 ;start timer out TCCR1B,zl ldi zl,0b00000000 ;stop timer out TCCR1B,zl .ENDMACRO ;******************************************************************** ; INITIALISE PORTS ;******************************************************************** _M64282_Init: cli ldi TEMP,0b11111110 ;init control port out CM_DDR,TEMP ldi TEMP,0b00010000 out CM_CONT,TEMP ldi TEMP,0b11000000 ;init adc port (lower 6 bits=input) out AD_DDR,TEMP ldi TEMP,0b11000000 ;turn off pullups out AD_OUT,TEMP sei ret ;******************************************************************** ; SendCommand ; decodes and sends a command to camera ; CMD_RESET reset camera ; CMD_START start pulse ;******************************************************************** SendCommand: _txM64282_C: ;print# @single_command cli ;command byte is in TEMP SC0: cpi TEMP,CMD_RESET ;do reset ? brne SC1 cbi CM_CONT,CMRESET ;reset lo sbi CM_CONT,CMCLK ;clk hi sbi CM_CONT,CMRESET ;reset hi cbi CM_CONT,CMCLK ;clk lo rjmp SCX SC1: cpi TEMP,CMD_START ;do start ? brne SCX cbi CM_CONT,CMCLK ;clk lo START_BIT 0b00110000 ;start bit hi macro sbi CM_CONT,CMCLK ;clk hi START_BIT 0b00100000 ;start bit lo macro cbi CM_CONT,CMCLK ;clk lo SCX: sei ret ;******************************************************************** ; SetRegister ; serialises addr+data & sends load pulse on last bit ;******************************************************************** SetRegister: _txM64282_C_cb: ;print# @address,databyte cli mov zh,TEMP ;transfer addr to zh ldi TEMP,11 ;init bit counter cbi CM_CONT,CMLOAD ;clear load bit SR0: cbi CM_CONT,CMCLK ;clear clk cbi CM_CONT,CMSIN ;clear sin sbrc zh,2 ;test bit 2 in upper reg sbi CM_CONT,CMSIN ;set sin sbi CM_CONT,CMCLK ;set clk lsl zl ;zl<1 rol zh ;zh<1