Last active
November 27, 2024 14:46
-
-
Save xacrimon/03bad74ccf9b4dbbb819bb9e8c9393a7 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| ; | |
| ; klocka.asm | |
| ; | |
| ; Created: 26/11/2024 12:38:41 | |
| ; Author : Joel Wejdenstål | |
| ; | |
| .macro PUSHZ | |
| push ZH | |
| push ZL | |
| .endmacro | |
| .macro POPZ | |
| pop ZL | |
| pop ZH | |
| .endmacro | |
| .macro PUSHY | |
| push YH | |
| push YL | |
| .endmacro | |
| .macro POPY | |
| pop YL | |
| pop YH | |
| .endmacro | |
| .dseg | |
| .org SRAM_START | |
| TIME: | |
| .byte 4 | |
| .cseg | |
| .org 0 | |
| rjmp START | |
| rjmp INT0R ; INT0: klocktickning | |
| rjmp INT1R ; INT1: visa till display | |
| .org INT_VECTORS_SIZE | |
| START: | |
| ; sätt stackpekare | |
| ldi r16, HIGH(RAMEND) | |
| out SPH, r16 | |
| ldi r16, LOW(RAMEND) | |
| out SPL, r16 | |
| ; configurera portar A och B till output | |
| ldi r16, $FF | |
| out DDRA, r16 | |
| out DDRB, r16 | |
| ; configurera INT0 och INT1 att köras på fallande flank | |
| ldi r16, (1<<INT0) | (1<<INT1) | |
| out GICR, r16 | |
| ldi r16, (1<<ISC01) | (1<<ISC11) | |
| out MCUCR, r16 | |
| sei | |
| ; initiering klar | |
| rjmp MAIN | |
| INT0R: | |
| in r25, SREG | |
| push r25 | |
| rcall CLOCK_TICK | |
| pop r25 | |
| out SREG, r25 | |
| reti | |
| INT1R: | |
| in r25, SREG | |
| push r25 | |
| rcall MUX | |
| pop r25 | |
| out SREG, r25 | |
| reti | |
| CLOCK_TICK: | |
| ; spara r16-r18 + Z | |
| push r16 | |
| push r17 | |
| push r18 | |
| PUSHZ | |
| ; r16 = bcd värde, r17 = carry, r18 = loop counter | |
| ldi ZH, HIGH(TIME) | |
| ldi ZL, LOW(TIME) | |
| ldi r17, 1 | |
| ldi r18, 4 | |
| CLOCK_TICK_bcd: | |
| ; ladda bcd värde och addera carry, nollställ sedan carry | |
| ld r16, Z | |
| add r16, r17 | |
| ldi r17, 0 | |
| ; kolla om vi har nått limit | |
| sbrs r18, 0 | |
| cpi r16, 10 ; plats 4 eller 2, limit på 10 | |
| sbrc r18, 0 | |
| cpi r16, 6 ; plats 3 eller 1, limit på 6 | |
| brne CLOCK_TICK_not_limit | |
| ; nollställ nuvarande och sätt carry | |
| ldi r16, 0 | |
| ldi r17, 1 | |
| CLOCK_TICK_not_limit: | |
| ; skriv nya bcd värdet | |
| st Z+, r16 | |
| ; ta nästa siffra | |
| dec r18 | |
| brne CLOCK_TICK_bcd | |
| ; återställ r16-r18 + Z och återvänd | |
| POPZ | |
| pop r18 | |
| pop r17 | |
| pop r16 | |
| ret | |
| .equ SEG_A=1<<0 | |
| .equ SEG_B=1<<1 | |
| .equ SEG_C=1<<2 | |
| .equ SEG_D=1<<3 | |
| .equ SEG_E=1<<4 | |
| .equ SEG_F=1<<5 | |
| .equ SEG_G=1<<6 | |
| .equ DIGIT_0=(SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F) | |
| .equ DIGIT_1=(SEG_B | SEG_C) | |
| .equ DIGIT_2=(SEG_A | SEG_B | SEG_G | SEG_D | SEG_E) | |
| .equ DIGIT_3=(SEG_A | SEG_B | SEG_G | SEG_C | SEG_D) | |
| .equ DIGIT_4=(SEG_F | SEG_B | SEG_G | SEG_C) | |
| .equ DIGIT_5=(SEG_A | SEG_C | SEG_D | SEG_G | SEG_F) | |
| .equ DIGIT_6=(SEG_C | SEG_D | SEG_E | SEG_F | SEG_G) | |
| .equ DIGIT_7=(SEG_A | SEG_B | SEG_C) | |
| .equ DIGIT_8=(SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G) | |
| .equ DIGIT_9=(SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G) | |
| FONT: | |
| .db DIGIT_0, DIGIT_1, DIGIT_2, DIGIT_3, DIGIT_4, DIGIT_5, DIGIT_6, DIGIT_7, DIGIT_8, DIGIT_9 | |
| MUX: | |
| ; spara r16-17 + Z + Y | |
| push r16 | |
| push r17 | |
| PUSHZ | |
| PUSHY | |
| ; r17 = loopvariabel | |
| ldi r17, 4 | |
| ldi YL, LOW(TIME) | |
| ldi YH, HIGH(TIME) | |
| MUX_write_digit: | |
| ; läs in bcd värdet till ZL | |
| ld ZL, Y+ | |
| ; läs in fontvärdet på FONT+ZL till r16 | |
| clr ZH | |
| subi ZL, LOW(-FONT*2) | |
| sbci ZH, HIGH(-FONT*2) | |
| lpm r16, Z | |
| ; skriv ut selectionvärdet och fontvärdet till A och B, kopplade till displayen | |
| out PORTA, r17 | |
| out PORTB, r16 | |
| ; loopa runt för varje siffra | |
| dec r17 | |
| brne MUX_write_digit | |
| ; återställ r16-r17 + Z + Y och återvänd | |
| POPY | |
| POPZ | |
| pop r17 | |
| pop r16 | |
| ret | |
| MAIN: | |
| rcall CLOCK_TICK | |
| rjmp MAIN |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment