; main file of led_plex project ; ; schematics: http://hackdaworld.org/download/led_plex/led_plex.png ; ; author: hackbard@hackdaworld.org ; ; device specific definition file .include "../include/tn2313def.inc" ; defines .def zero = r1 .def one = r2 .def tmp1 = r16 .def tmp2 = r17 .def uart_rxtx = r18 .def hc595_sink = r19 .def hc595_source = r20 .def column = r21 .def count = r22 ; ; interrupts ; ; RESET rjmp INIT ; INT0 reti ; INT1 reti ; T1 CAPT1 reti ; T1 COMP A reti ; T1 OVF1 rjmp T1_OVF ; T0 OVF0 rjmp T0_OVF ; UART RX rjmp UART_RECEIVE ; UART UDRE reti ; UART TX reti ; ANA COMP reti ; PCINT reti ; T1 COMP B reti ; T0 COMP A reti ; T0 COMP B reti ; USI START reti ; USI OVF reti ; EE READY reti ; WDT OVF reti ; ; init and main code ; RESET: INIT: ; gio port init rcall PORT_INIT ; timer0 init rcall TIMER0_INIT ; timer0 interrupt enable rcall TIMER0_INT_INIT ; timer1 init rcall TIMER1_INIT ; timer1 interrupt enable rcall TIMER1_INT_INIT ; uart init rcall UART_INIT ; uart interrupt enable rcall UART_INT_RX_INIT ; zero and one initialization ldi tmp1,0 mov zero,tmp1 ldi tmp1,1 mov one,tmp1 ; set stackpointer ldi tmp1,low(RAMEND) out SPL,tmp1 ; framebuffer init: Z :) ldi ZL,low(FB_C) ldi ZH,high(FB_C) ldi tmp1,0xff st Z+,tmp1 ldi tmp1,0xc3 st Z+,tmp1 ldi tmp1,0xa5 st Z+,tmp1 ldi tmp1,0x99 st Z+,tmp1 ldi tmp1,0x99 st Z+,tmp1 ldi tmp1,0xa5 st Z+,tmp1 ldi tmp1,0xc3 st Z+,tmp1 ldi tmp1,0xff st Z,tmp1 ; led init ldi hc595_sink,0x00 ldi hc595_source,0x01 ldi column,0 rcall SET_HC595 ; more init ldi count,0x21 ; signal ready output ldi uart_rxtx,0x68 rcall UART_TX ; global interrupt enable sei MAIN: ; loop forever rjmp MAIN ; include subroutines .include "port.asm" .include "timer.asm" .include "uart.asm" ; ; interrupt routines ; T1_OVF: ; ; write font into framebuffer sram ; .ifdef DEBUG_PORTS ldi uart_rxtx,0x21 rcall UART_TX .endif ; calculate address ; font base address ldi ZL,low(FONTS*2) ldi ZH,high(FONTS*2) .ifdef DEBUG_PORTS mov uart_rxtx,ZH rcall UART_TX mov uart_rxtx,ZL rcall UART_TX ldi uart_rxtx,0x2d rcall UART_TX .endif ; framebuffer base address ldi YL,low(FB_C) ldi YH,high(FB_C) .ifdef DEBUG_PORTS mov uart_rxtx,YH rcall UART_TX mov uart_rxtx,YL rcall UART_TX ldi uart_rxtx,0x2d rcall UART_TX .endif ; font offset mov XL,count ldi XH,0 ; times 8 == 3 left shifts rol XL rol XH rol XL rol XH rol XL rol XH .ifdef DEBUG_PORTS mov uart_rxtx,XH rcall UART_TX mov uart_rxtx,XL rcall UART_TX ldi uart_rxtx,0x2d rcall UART_TX .endif ; final font address add ZL,XL adc ZH,zero add ZH,XH .ifdef DEBUG_PORTS mov uart_rxtx,ZH rcall UART_TX mov uart_rxtx,ZL rcall UART_TX ldi uart_rxtx,0x2d rcall UART_TX mov uart_rxtx,count rcall UART_TX .endif ; move font data into framebuffer lpm tmp1,Z+ st Y+,tmp1 lpm tmp1,Z+ st Y+,tmp1 lpm tmp1,Z+ st Y+,tmp1 lpm tmp1,Z+ st Y+,tmp1 lpm tmp1,Z+ st Y+,tmp1 lpm tmp1,Z+ st Y+,tmp1 lpm tmp1,Z+ st Y+,tmp1 lpm tmp1,Z st Y,tmp1 ; TESTING ; increment test counter inc count cpi count,0x80 brne EXIT_T1_OVF ldi count,0x21 EXIT_T1_OVF: reti T0_OVF: ; debug output cbi PORTD,3 ; shift source rol hc595_source inc column cpi column,8 brne SINK_UPDATE ldi column,0 ldi hc595_source,1 ; update sink SINK_UPDATE: ldi ZL,low(FB_C) ldi ZH,high(FB_C) add ZL,column adc ZH,zero ld hc595_sink,Z .ifdef DEBUG_PORTS ldi uart_rxtx,0x2d rcall UART_TX ldi uart_rxtx,0x3e rcall UART_TX ldi uart_rxtx,0x30 add uart_rxtx,column rcall UART_TX ldi uart_rxtx,0x3a rcall UART_TX ldi uart_rxtx,0x20 rcall UART_TX .endif ; set hc595 rcall SET_HC595 .ifdef DEBUG_PORTS ldi uart_rxtx,0x0a rcall UART_TX ldi uart_rxtx,0x0d rcall UART_TX .endif ; debug output sbi PORTD,3 reti UART_RECEIVE: reti ; include fonts FONTS: .include "fonts.asm" ; ; sram ; .dseg ; current framebuffer content FB_C: .byte 8