Also ich hab jetzt was gefunden und das auf meinen µC umgearbeitet. Die berechnung stimmt nicht genau. Der Timer schaltet nicht bei jeder sekunde aber so in etwa bei 1,5, das ist aber auch etwas nebensache/einstellungssache
Kann mir mal jemand den Code erklären?
Code:
;************************************************************************/
;* */
;* Precise 1 Second Timebase */
;* */
;* Author: Peter Dannegger */
;* danni@specs.de */
;* */
;************************************************************************/
.nolist
.include"m16def.inc"
.equ xtal = 8000000
.equ debounce = 100
.equ remainder = xtal - xtal / debounce * debounce
.def isreg = r15
.def wr0 = r16
.def iwr0 = r17
.def prescaler = r18
.def second = r19
.list
rjmp init
.org OC1Aaddr
rjmp OC1Aint
;-------------------------------------------------------------------------
OC1Aint:
in isreg, sreg
;************************************************************************/
;* Insert Key Debouncing Here */
;************************************************************************/
ldi iwr0, high( xtal / debounce - 1 )
out ocr1ah, iwr0
ldi iwr0, low( xtal / debounce - 1 )
out ocr1al, iwr0
dec prescaler
brne _oci1
ldi prescaler, debounce
inc second
ldi iwr0, high( xtal / debounce + remainder - 1 )
out ocr1ah, iwr0
ldi iwr0, low( xtal / debounce + remainder - 1 )
out ocr1al, iwr0
_oci1:
out sreg, isreg
reti
;-------------------------------------------------------------------------
init:
ldi wr0, 0xFF
out ddrb, wr0
ldi wr0, high( ramend )
out sph, wr0
ldi wr0, low( ramend )
out spl, wr0
ldi wr0, 1<<WGM12^1<<CS10
out TCCR1B, wr0
ldi wr0, high( 8000000 / 100 - 1 )
out ocr1ah, wr0
ldi wr0, low( 8000000 / 100 - 1 )
out ocr1al, wr0
out tcnt1l, wr0
ldi prescaler, debounce
ldi wr0, 1<<OCIE1A
out TIMSK, wr0
sei
main:
ldi second, 0
_mai1:
cpi second, 60
breq main
out ddrb, second
rjmp _mai1
;------------------------------------
Die Erklärung würde mir für den init Teil reichen. Danke
Lesezeichen