![]() |
Anwendungen von AVR-Einchip-Prozessoren AT90S, ATtiny, ATmega und ATxmega Sekunden/Minuten/Stunden mit ATtiny und Quarz |
;
; **************************************
; * Sekunden/Minuten/Stunden aus Quarz *
; * mit ATtiny25, Version 1 *
; * (C)2022 by Gerhard Schmidt *
; **************************************
;
.nolist
.include "tn25def.inc" ; Define device ATtiny25
.list
;
; ***********************************
; H A R D W A R E
; ***********************************
;
; Device: ATtiny25, Package: 8-pin-PDIP_SOIC
; _________
; 1 / |8
; Reset o--|Reset Vcc|--o +3..5V
; Quarz o--|Xtal1 Pb2|--o Stunden
; Quarz o--|Xtal2 Pb1|--o Minuten
; 0V o--|Gnd Pb0|--o Sekunden
; 4 |__________|5
;
; **********************************
; K O N S T A N T E N
; **********************************
;
; Import aus LibreOffice-Calc-Datei
; 8-Bit-TC 0
.equ clock = 32768 ; Quarztakt in Hz
.equ cPresc8 = 256 ; Vorteiler fuer 8-Bit-TC
.equ cPrescBits8 = (1<<CS02) ; Vorteiler-Bits fuer 8-bit-TC
.equ cCtcDiv8 = 64 ; CTC-Teiler 8-Bit-TC
.equ cCompA8 = 63 ; Compare-A-Wert
.equ cSoftCnt8 = 1 ; Software-Zaehler
;
; **********************************
; R E G I S T E R S
; **********************************
;
; frei: R0 to R15
.def rmp = R16 ; Vielzweckregister
.def rMin = R17 ; Minutenregister
.def rStd = R18 ; Stundenregister
.if (cSoftCnt8 > 1) && (cSoftCnt8 < 257)
.def rSec = R19
.endif
; frei: R19 bis R23
.if cSoftCnt8 > 256
.def rSecL = R24
.def rSecH = R25
.endif
; frei: R26 bis R31
;
.cseg
.org 000000
;
; **********************************
; R E S E T & I N T - V E C T O R S
; **********************************
rjmp Main ; Reset vector
reti ; INT0
reti ; PCI0
reti ; OC1A
reti ; OVF1
reti ; OVF0
reti ; ERDY
reti ; ACI
reti ; ADCC
reti ; OC1B
rjmp Oc0aIsr ; OC0A
reti ; OC0B
reti ; WDT
reti ; USI_START
reti ; USI_OVF
;
; **********************************
; I N T - S E R V I C E R O U T .
; **********************************
;
Oc0aIsr:
.if (cSoftCnt8 > 1) && (cSoftCnt8 < 257) ; 8-Bit-Zaehler
dec rSec ; 8-Bit-Zaehler abwaerts
brne Oc0aIsrReti
ldi rSec,cSoftCnt8 ; Neustart 8-Bit-Zaehler
.endif
.if cSoftCnt8 > 256
sbiw rSecL,1 ; 16-Bit-Zaehler abwaerts
brne Oc0aIsrReti
ldi rSecH,High(cSoftCnt8) ; Neustart 16-Bit-Zaehler
ldi rSecL,Low(cSoftCnt8)
.endif
sbi PINB,0 ; Toggle Sekundenausgang
dec rMin ; Minutenzaehler abwaerts
brne Oc0aIsrReti
sbi PINB,1 ; Toggle Minutenausgang
ldi rMin,60 ; Neustart Minuten
dec rStd ; Stunden abwaerts
brne Oc0aIsrReti
sbi PINB,2 ; Toggle Stundenausgang
ldi rStd,60
Oc0aIsrReti:
reti
;
; **********************************
; M A I N P R O G R A M I N I T
; **********************************
;
Main:
; Stapel einrichten
.ifdef SPH ; Stapelzeiger fuer ATtiny85
ldi rmp,High(RAMEND) ; Stapelzeiger MSB
out SPH,rmp
.endif
ldi rmp,Low(RAMEND) ; Stapelzeiger LSB
out SPL,rmp ; Init LSB stack pointer
; Portbits als Ausgaenge
sbi DDRB,0 ; Ausgang PB0
sbi DDRB,1 ; Ausgang PB1
sbi DDRB,2 ; Ausgang PB2
; Sekunden, Minuten- und Stunden-Register starten
.if cSoftCnt8 > 1 ; bei mehar als 1: Softwarezaehler
.if cSoftCnt8 < 257
ldi rSec,cSoftCnt8 ; 8-bit-Softwarezaehler
.else
ldi rSecH,High(cSoftCnt8) ; 16-bit-Softwarezaehler
ldi rSecL,Low(cSoftCnt8)
.endif
.endif
ldi rMin,60 ; 60 Sekunden pro Minute, 0,5 s
ldi rStd,60 ; 60 Minuten pro Stunde, 0,5 s
; Timer TC0 initiieren
ldi rmp,cCompA8 ; CTC-Teilerwert fuer 0,5 Sekunden
out OCR0A,rmp ; In Compare-Portregister
ldi rmp,1<<WGM01 ; CTC-Modus TC0
out TCCR0A,rmp ; In Modusregister A TC0
ldi rmp,cPrescBits8 ; Vorteiler TC0
out TCCR0B,rmp ; in Modusregister B TC0
ldi rmp,1<<OCIE0A ; Compare match interrupt
out TIMSK,rmp ; in Timer-Int Maske
; Sleep enable
ldi rmp,1<<SE ; Sleep idle
out MCUCR,rmp
; Interrupts einschalten
sei ; Enable interrupts
;
; **********************************
; P R O G R A M L O O P
; **********************************
;
Loop:
sleep
rjmp loop
;
; End of source code
;
; Copyright information
.db "(C)2022 by Gerhard Schmidt " ; Source code readable
.db "C(2)20 2ybG reahdrS hcimtd " ; Machine code format
;