Tänkte att jag slänger upp en tråd om detta av 2 anledningar, dels att jag vill visa upp mitt lilla bygge och också för att få lite hjälp med programmeringen.
Jag skrev förut att jag hade problem med min hårdvaruprogrammering i största allmänhet.
För att råda bot på det så tänkte jag att jag bygger något simpelt.
Så förra söndagen så satt jag i hobbyrummet och klurade, så blev det något som kan likna en klocka eller äggtimer.
Eftersom att jag bara höftade och ville kunna bygga vidare/bygga om så byggde jag på ett sånt experimentkort med lödöar.
Det blev så simpelt som en 7805, attiny26, 4st 7segments led displayer, och lite motstånd och transistorer.
Senare tillkom 2st tryckknappar med någon tillhöftad avstudsning och ett pizero element.
Så nu försöker jag skriva någon sorts mjukvara till den här härvan av komponenter.
Jag problem med att få till något som "scannar" igenom alla 4 displayerna. Det är tanken att den rutinen ska ligga i interruptet för timer0 overflow. Nu har jag kommenterat raderna med engelska för att det känns lättare för mig att göra det pga att det ibland är svårt att hitta svenska ord som stämmer in.
keep in mind att det är mitt första assembly program.
Kod: Markera allt
; avr tiny26 clocka
; alexander bachler jansson
; PORTA
; PORTB
.nolist
.include "tn26def.inc"
.list
.device attiny26
.dseg
.org 0x0060
segments: .byte 10 ; holds the individial segment data for each number 0-9
display: .byte 1 ; holds count of witch display to drive 0-3
data: .byte 4 ; holds the nubmers to be displayed on each digit
.cseg
.org 0x0000
rjmp main
rjmp main ; External Interrupt 0
rjmp main ; External Interrupt Request 0
rjmp main ; Timer/Counter1 Compare Match 1A
rjmp main ; Timer/Counter1 Compare Match 1B
rjmp main ; Timer/Counter1 Overflow
rjmp OVF0_interrupt ; Timer/Counter0 Overflow
rjmp main ; USI Start
rjmp main ; USI Overflow
rjmp main ; EEPROM Ready
rjmp main ; Analog Comparator
rjmp main ; ADC Conversion Complete
; -----------------------------------------------------------------------------
; does some things
OVF0_interrupt:
push r16
push r17
push r18
push XH
push XL
push YH
push YL
push ZH
push ZL
ldi ZH, high(display)
ldi ZL, low(display)
ld r17, Z ; load witch display we are updating
ldi YH, high(data)
ldi YL, low(data)
add YL, r17 ; add display to YL to get address of data
ld r18, Y ; load data to r18
ldi XH, high(segments)
ldi XL, low(segments)
add XL, r18 ; add data for display to segment offset
ld r16, X ; load it
out PORTB, r16 ; put it on display
ldi r16, 0b0000_1110 ;
out PORTA, r16 ; activate dispay
pop ZL
pop ZH
pop YL
pop YH
pop XL
pop XH
pop r18
pop r17
pop r16
reti
; -----------------------------------------------------------------------------
; -----------------------------------------------------------------------------
; puts each numbers segment data into a table in ram 0-9
init_segments:
push r16 ; this is probably not needed since we
push XH ; do this onec at the very beginning
push XL ; of our program
ldi XH, high(Segments)
ldi XL, low(Segments)
ldi r16, 0b0011_1111 ; 0
st X+, r16 ; 0x0060
ldi r16, 0b0000_0110 ; 1
st X+, r16 ; 0x0061
ldi r16, 0b0101_1011 ; 2
st X+, r16 ; 0x0062
ldi r16, 0b0100_1111 ; 3
st X+, r16 ; 0x0063
ldi r16, 0b0110_0110 ; 4
st X+, r16 ; 0x0064
ldi r16, 0b0110_1101 ; 5
st X+, r16 ; 0x0065
ldi r16, 0b0111_1101 ; 6
st X+, r16 ; 0x0066
ldi r16, 0b0000_0111 ; 7
st X+, r16 ; 0x0067
ldi r16, 0b0111_1111 ; 8
st X+, r16 ; 0x0068
ldi r16, 0b0110_1111 ; 9
st X, r16 ; 0x0069
pop XL
pop XH
pop r16
ret
; -----------------------------------------------------------------------------
; -----------------------------------------------------------------------------
; init port directions
init_ports:
push r16 ; also, probably not needed
ldi r16, 0b1000_1111 ; buzzer n/c button 2, button 1, digit 4, 3, 2, 1
out DDRA, r16
ldi r16, 0b0111_1111 ; segments, g, f, e, d, c, b, a
out DDRB, r16
pop r16
ret
; -----------------------------------------------------------------------------
; -----------------------------------------------------------------------------
; init and start the timer
init_timer:
push r16 ; pobably not
ldi r16, 0b0000_1101 ; PSR0, CS02, CS00 // ck/1024
out TCCR0, r16
ldi r16, 0b0000_0010 ; TOIE0
out TIMSK, r16
pop r16
ret
; -----------------------------------------------------------------------------
main:
ldi r16, low(RAMEND) ; init stack
out SP, r16 ; load to stack pointer
rcall init_segments ; load segments data to ram
rcall init_ports ; init ports directions
rcall init_timer ; start the timer
ldi XH, high(data)
ldi XL, low(data)
ldi r16, 2
st X, r16
ldi XH, high(display)
ldi XL, low(display)
ldi r16, 0
st X, r16
sei ; enable interrupts
loop:
rjmp loop