;+----------------------------------------------------------------------
;| Title : Multiplex Anzeige für ATmega8
;+----------------------------------------------------------------------
;| Funktion : ... Zählt von einer eingegebenen Zahl an bis Null
;| : ... Schaltet Ausgang Port C3 Ein wenn Null erreicht
;| : ... zeigt Sekunden, Minuten, Stunden an
;| : ... Taster an Port C1 startet Zählvorgeng
;| Schaltung : ...
;+----------------------------------------------------------------------
;| Prozessor : ATmega8
;| Takt : 3,6864 MHz
;| Sprache : Assembler
;| Datum : ...
;| Version : ...
;| Autor : ...
;+----------------------------------------------------------------------
.include "AVR.H"
;------------------------------------------------------------------------
;Reset and Interrupt vector ;VNr. Beschreibung
rjmp main ;1 POWER ON RESET
reti ;2 Int0-Interrupt
reti ;3 Int1-Interrupt
reti ;4 TC2 Compare Match
reti ;5 TC2 Overflow
reti ;6 TC1 Capture
reti ;7 TC1 Compare Match A
reti ;8 TC1 Compare Match B
reti ;9 TC1 Overflow
rjmp tim0_ovf ;10 TC0 Overflow
reti ;11 SPI, STC Serial Transfer Complete
reti ;12 UART Rx Complete
reti ;13 UART Data Register Empty
reti ;14 UART Tx Complete
reti ;15 ADC Conversion Complete
reti ;16 EEPROM Ready
reti ;17 Analog Comparator
reti ;18 TWI (I²C) Serial Interface
reti ;19 Store Program Memory Ready
;------------------------------------------------------------------------
;Start, Power ON, Reset
main:
ldi r16,hi8(RAMEND)
out SPH,r16
ldi r16,lo8(RAMEND)
out SPL,r16
ldi r16,0b01110000
out DDRD,r16
ldi r16,0b00011111
out DDRB,r16
ldi r16,0b00000111
out DDRC,r16
ldi r16,0b00000011
out PORTC,r16
ldi r16,0b00000011
out TCCR0,r16
ldi r16,0b00000001
out TIMSK,r16
ldi r18,0x53
out TCNT0,r18
ldi r30,0x60
ldi r31,0x00
ldi r16,0x03
sts 0x66,r16
;------------------------------------------------------------------------
; Hier Zeit für Zählvorgng eingeben
ldi r21,0x00 ;Zehner Stunden eingeben
sts 0x65,r21
ldi r20,0x10 ;Einer Stunden eingeben
sts 0x64,r20
ldi r19,0x01 ;Zehner Minuten eingeben
sts 0x63,r19
ldi r18,0x10 ;Einer Minuten eingeben
sts 0x62,r18
ldi r17,0x00 ;Zehner Sekunden eingeben
sts 0x61,r17
ldi r16,0x00 ;Einer Sekunden eingeben
sts 0x60,r16
sei
;------------------------------------------------------------------------
mainloop:
; testet ob mindestens eine Stelle ist höher als 0 wenn ja dann Start
cpi r21,0x00
brne Z6
cpi r20,0x10
brne Z5
cpi r19,0x00
brne Z4
cpi r18,0x10
brne Z3
cpi r17,0x00
brne Z2
cpi r16,0x00
brne Z1
; Zeigt Fehlerhafte Eingabe an
; bei Eingabe 000000 erscheinen 6 Decimalpunkte
; Programm wird beendet
ldi r21,0x1a
sts 0x60,r21
sts 0x61,r21
sts 0x62,r21
sts 0x63,r21
sts 0x64,r21
sts 0x65,r21
rjmp ende
Z6: rjmp Zahl1
Z5: rjmp Zahl1
Z4: rjmp Zahl1
Z3: rjmp Zahl1
Z2: rjmp Zahl1
Z1: rjmp Zahl1
;------------------------------------------------------------------------
Zahl1: sbic PINC,0
rjmp Zahl1
rjmp Start
Start: cpi r16,0x00
breq Zahl2
rcall loop1
Zahl2: cpi r17,0x00
breq Zahl3
rcall loop2
Zahl3: cpi r18,0x10
breq Zahl4
rcall loop3
Zahl4: cpi r19,0x00
breq Zahl5
rcall loop4
Zahl5: cpi r20,0x10
breq Zahl6
rcall loop5
Zahl6: cpi r21,0x00
breq Zahl7
rcall loop6
Zahl7: ldi r16,0b00000100
out PORTC,r16
rjmp ende
;------------------------------------------------------------------------
; Ende des Zählvorgangs
ende: rjmp ende
;------------------------------------------------------------------------
;------------------------------------------------------------------------
loop1: rcall zeit
dec r16
sts 0x60,r16
cpi r16,0x00
brne loop1
ret
;------------------------------------------------------------------------
;------------------------------------------------------------------------
loop2:
cpi r16,0x00
breq loop2x
dec r17
sts 0x61,r17
rcall loop1
cpi r17,0x00
brne loop2
cpi r16,0x00
brne loop1
ret
loop2x: rcall zeit
ldi r16,0x09
sts 0x60,r16
rjmp loop2
;------------------------------------------------------------------------
;------------------------------------------------------------------------
loop3:
cpi r17,0x00
breq loop3x
rcall loop2
cpi r18,0x10
brne loop3x
ret
loop3x: rcall zeit
ldi r16,0x09
ldi r17,0x06
sts 0x60,r16
sts 0x61,r17
dec r18
sts 0x62,r18
rjmp loop3
;------------------------------------------------------------------------
;------------------------------------------------------------------------
loop4: cpi r18,0x10
breq loop4x
rcall loop3
cpi r19,0x00
brne loop4x
ret
loop4x: rcall zeit
ldi r16,0x09
ldi r17,0x06
ldi r18,0x19
sts 0x60,r16
sts 0x61,r17
sts 0x62,r18
dec r19
sts 0x63,r19
rjmp loop4
;------------------------------------------------------------------------
;------------------------------------------------------------------------
loop5: cpi r19,0x00
breq loop5x
rcall loop4
cpi r20,0x10
brne loop5x
ret
loop5x: rcall zeit
ldi r16,0x09
ldi r17,0x06
ldi r18,0x19
ldi r19,0x05
sts 0x60,r16
sts 0x61,r17
sts 0x62,r18
sts 0x63,r19
dec r20
sts 0x64,r20
rjmp loop5
;------------------------------------------------------------------------
;------------------------------------------------------------------------
loop6: cpi r20,0x10
breq loop6x
rcall loop5
cpi r21,0x00
brne loop6x
ret
loop6x: rcall zeit
ldi r16,0x09
ldi r17,0x06
ldi r18,0x19
ldi r19,0x05
sts 0x60,r16
ldi r20,0x19
sts 0x61,r17
sts 0x62,r18
sts 0x63,r19
sts 0x64,r20
dec r21
sts 0x65,r21
rjmp loop6
;------------------------------------------------------------------------
;------------------------------------------------------------------------
tim0_ovf:
push r16
push r17
push r18
push r19
in r16,SREG
ld r18,z+
lds r19,0x66
swap r19
out PORTB,r18
out PORTD,r19
swap r19
dec r19
sts 0x66,r19
cpi r19,0xff
brne tim0_ovf_1
ldi r30,0x60
ldi r31,0x00
ldi r19,0x05
sts 0x66,r19
tim0_ovf_1: ldi r18,0x53
out TCNT0,r18
out SREG,r16
pop r19
pop r18
pop r17
pop r16
reti
rjmp mainloop
;--------------------------------------------------
zeit:
push r16
push r17
push r18
in r16,SREG
push r16
ldi r16,0xcc ; 5f ändert Geschwindigkeit des Zählers 0x64 cc
zeit1: ldi r17,0xc8 ; c8
zeit2: ldi r18,0x1d ; 1d
zeit3: dec r18
brne zeit3
dec r17
brne zeit2
dec r16
brne zeit1
pop r16
out SREG,r16
pop r18
pop r17
pop r16
ret
;--------------------------------------------------