; ; the code for big clock contains part of coolsystem v0.2 ; ; visit project page at https://hackaday.io/project/179893-coolsystem ; ; filename: mega8.asm ; ; use this command to compile ; avra -l listing_bigclock.txt big_clock.asm ; ; ; ; Message for humans: this program is written in assembly language and it ; is intended to run on AVR atmega8 chip. If you want to learn ; assembler, go get a tutorial at http://www.avr-asm-tutorial.net/avr_en/ ; .NOLIST .INCLUDE "/usr/share/avra/m8def.inc" .LIST ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; register names ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .def rret = R3 .def rcounter = R4 .DEF rmp = R16 .DEF rarg = R17 .DEF rarg2 = R18 .DEF rarg3 = R19 .DEF rarg4 = R20 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; pin assignments ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .EQU BIGCLOCK_L = 0b00000001 .EQU BIGCLOCK_C = 0b00000010 .EQU BIGCLOCK_D = 0b00000100 .EQU LED = 0b00001000 .DSEG .ORG SRAM_START byte_5: .BYTE 1 byte_4: .BYTE 1 byte_3: .BYTE 1 byte_2: .BYTE 1 byte_1: .BYTE 1 byte_0: .BYTE 1 font: .BYTE 16 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; interrupt table for atmega8 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .CSEG .ORG $0000 rjmp init_routine reti reti reti reti reti reti reti reti rjmp timer rjmp spi_complete reti reti reti reti reti reti reti reti ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; timer ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; timer: reti ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; spi_complete ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; spi_complete: reti ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; init_routine ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; init_routine: ldi rmp, 0b11111111 ; all pull-up resistors enable out PORTB, rmp out PORTD, rmp ldi rmp, 0b11110000 ; except outputs out PORTC, rmp ldi rmp, LOW(RAMEND) ; Init stack out SPL, rmp ldi rmp, HIGH(RAMEND) out SPH, rmp ldi rmp, BIGCLOCK_L | BIGCLOCK_C | BIGCLOCK_D out DDRC, rmp ; enable output on this pins ldi rmp, 0b01110111 ; 0 sts font + 0, rmp ldi rmp, 0b00100100 ; 1 sts font + 1, rmp ldi rmp, 0b01011101 ; 2 sts font + 2, rmp ldi rmp, 0b01101101 ; 3 sts font + 3, rmp ldi rmp, 0b00101110 ; 4 sts font + 4, rmp ldi rmp, 0b01101011 ; 5 sts font + 5, rmp ldi rmp, 0b01111011 ; 6 sts font + 6, rmp ldi rmp, 0b00100101 ; 7 sts font + 7, rmp ldi rmp, 0b01111111 ; 8 sts font + 8, rmp ldi rmp, 0b01101111 ; 9 sts font + 9, rmp ldi rmp, 0b00111111 ; a sts font + 10, rmp ldi rmp, 0b01111011 ; b sts font + 11, rmp ldi rmp, 0b01011000 ; c sts font + 12, rmp ldi rmp, 0b01111100 ; d sts font + 13, rmp ldi rmp, 0b01011011 ; e sts font + 14, rmp ldi rmp, 0b00011011 ; f sts font + 15, rmp main_loop: ; do the thing here lds rmp, font + 0 sts byte_0, rmp lds rmp, font + 1 sts byte_1, rmp lds rmp, font + 2 sts byte_2, rmp lds rmp, font + 3 sts byte_3, rmp lds rmp, font + 4 sts byte_4, rmp lds rmp, font + 5 sts byte_5, rmp rcall write_screen rjmp main_loop ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; write_screen ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; write_screen: ldi rarg, BIGCLOCK_D ldi rarg2, BIGCLOCK_C ldi rarg3, 0 lds rarg4, byte_5 rcall transfer_be lds rarg4, byte_4 rcall transfer_be lds rarg4, byte_3 rcall transfer_be lds rarg4, byte_2 rcall transfer_be lds rarg4, byte_1 rcall transfer_be lds rarg4, byte_0 rcall transfer_be ldi rarg2, BIGCLOCK_L ; pulse the latch rcall pulse_pin ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; transfer_be (feed data to the shift register, MSB first, clock must be already low) ; args: ; rarg - bitmask for shift register MOSI data pin for PORTC ; rarg2 - bitmask for shift clock pin ; rarg3 - bitmask for MISO data pin ; rarg4 - data to be shifted out ; ; returns: ; rret - data received (MSB first) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; transfer_be: ldi rmp, 8 mov rcounter, rmp transfer_loop: in rmp, PORTC com rarg and rmp, rarg com rarg rol rarg4 ; rotate left through carry brcc transfer_zero or rmp, rarg transfer_zero: rcall debug_wait out PORTC, rmp in rmp, PINC and rmp, rarg3 clc breq transfer_pind_zero sec transfer_pind_zero: ror rret rcall pulse_pin dec rcounter brne transfer_loop ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; pulse_pin (note: pin must be already low) ; args: ; rarg2 - PORTC pin bitmask ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; pulse_pin: rcall debug_wait in rmp, PORTC or rmp, rarg2 out PORTC, rmp rcall debug_wait in rmp, PORTC com rarg2 and rmp, rarg2 out PORTC, rmp com rarg2 ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; debug_wait (large delay) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; debug_wait: push rmp push rarg push rarg2 clr rarg clr rmp debug_wait_loop: nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop ; dec rmp ; brne debug_wait_loop ; uncommect this for LEDs debug dec rarg brne debug_wait_loop pop rarg2 pop rarg pop rmp ret