Code:
.include "m8def.inc"
.def tmp = r16
.def tmp2 = r17
.def status_reg = r18
;BIT 0 zeigt an, ob PINB,1 während der ISR LOW war, dann = 1
;BIT 1 warten auf dcf Anfang =1 => freigabe
;Bit 2 Fehlerbit
;BIT 3 wird auf rising edge 1
;BIT 4 wird in dcf_einholen gesetzt, wenn 59 Bits da. enable für dcf_auswerten
;BIT 5 Signal wird ignoriert, bis 1
;BIT 6
;BIT 7 warten auf 2 komplette Signale
.def pw = r19
.def pw2 = r20
.def pw_alt = r21
.def dcf_shift_reg = r24
.def sreg_save = r25
.equ dcf_BIT_counter = 104
.equ eins = 1
.equ zwei = 2
.equ vier = 4
.equ acht = 8
.equ zehn = 10
.equ zwanzig = 20
.equ vierzig = 40
.org 0x000
rjmp reset
.org OC1Aaddr
rjmp timer1_int
;*****************************************
;*****************************************
; Pointer Z
;
; ms = RAM 100
; sc = RAM 101
; min = RAM 102
; stunde = RAM 103
; dcf_BIT_counter = RAM 104
; dcf_min = RAM 113
; dcf_min_alt = RAM 114
; dcf_stu = RAM 115
; flag_counter = RAM 116
;
;******************************************
;******************************************
; Pointer Y
; dcf BIT 0-7 = RAM 105
; dcf BIT 8-15 = RAM 106
; dcf BIT 16-23 = RAM 107
; dcf BIT 24-31 = RAM 107
; dcf BIT 32-39 = RAM 108
; dcf BIT 40-47 = RAM 109
; dcf BIT 48-55 = RAM 110
; dcf BIT 56-59 = RAM 111
reset:
;Stack wird bei Interrupts benötigt!
ldi tmp,HIGH(RAMEND)
out SPH,tmp
ldi tmp,LOW(RAMEND)
out SPL,tmp
ldi tmp,0xFF
out DDRD,tmp
ldi tmp,0
ldi r28,105
ldi r29,0
ldi r31,0
ldi r30,100
st Z+,tmp
st Z+,tmp
st Z+,tmp
st Z+,tmp
st Z,tmp
ldi r30,100
ldi tmp,0
out DDRC,tmp
ldi tmp,0b00110000
out PORTC,tmp
ldi tmp,0
out DDRB,tmp
ldi tmp,0
out PORTB,tmp
ldi tmp,0b00110000
out TIMSK,tmp
ldi tmp,0b00000010
out OCR1AH,tmp
ldi r17,0b01110001
out OCR1AL,r17
ldi tmp,0b00000000
out TCCR1A,tmp
ldi tmp,0b01001011 ;input capture enable
out TCCR1B,tmp
ldi r17,0
ldi status_reg,0
ldi r28,105
ldi dcf_shift_reg,0
st Y+,dcf_shift_reg
st Y+,dcf_shift_reg
st Y+,dcf_shift_reg
st Y+,dcf_shift_reg
st Y+,dcf_shift_reg
st Y+,dcf_shift_reg
st Y+,dcf_shift_reg
st Y,dcf_shift_reg
ldi r28,105
ldi pw_alt,0
sei
main:
;**********************************
rjmp main
timer1_int:
in sreg_save,SREG
ldi r30,116;Interruptcounter laden
ld tmp,Z
inc tmp
st Z,tmp
in tmp,TIFR
sbrs tmp,0b00000101
rjmp same
ori tmp,0b00100000;das Verhalten ändert sich nicht, wenn ich die T1 Flags ändere...
out TIFR,tmp
ld tmp,Z
out PORTD,tmp
ldi tmp,0
st Z,tmp
same:
ldi r30,100
out SREG,sreg_save
reti
da läuft auch alles so wie geplant.
Lesezeichen