Pfad: Home => AVR-Übersicht => Anwendungen => Sekundenquarz => Sekundenquarz-Quellcode   This page in English: Flag EN Logo
Tiny XTAL oscillator Anwendungen von
AVR-Einchip-Prozessoren AT90S, ATtiny, ATmega und ATxmega
Sekunden/Minuten/Stunden mit ATtiny und Quarz

Software für den Sekunden/Minuten/Stunden-Timer mit Quarz

Die Software für den Sekunden/Minuten/Stunden-Timer gibt es im Assemblerformat hier zum Download.

Der Quellcode:

;
; **************************************
; * 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
;



©2022 by http://www.avr-asm-tutorial.net