Hallo zusammen,
meine Projektgruppe und ich haben folgendes Problem Wir haben einen ATmega8 und eine Multiplexanzeige mit vier Stellen. Unser Programm(MY AVR) was ich gleich anhängen werde, zählt hoch im ms Takt über den Timer_1 und wird über den Timer_0 auf die Multiülexanzeige ausgegeben. Soweit so gut. Wir wollen die vergangene Zeit messen die über ein und den selben Sensor erfasst werden soll. Unser problem ist, dass wir die Werte die ins SRAM geschrieben werden, solange bei der ersten Routine in ein Zwischenspeicher zuladen um die bei der nächsten gemessen Routine vergangene Zeit ins Zwischenregister zu speichern um den ersten Wert aus dem Zwischenspeicher zuladen. D.h. das wir fortlaufend Werte umladen.
So... Viel gequatscht und vielleicht schwer beschrieben, aber ich hänge euch mal das Pro(blem)gramm an.
PROGRAMM:
CodeBox ASM
ICH WÄRE SO DANKBAR ÜBER JEDE HILFESTELLUNG !!!
meine Projektgruppe und ich haben folgendes Problem Wir haben einen ATmega8 und eine Multiplexanzeige mit vier Stellen. Unser Programm(MY AVR) was ich gleich anhängen werde, zählt hoch im ms Takt über den Timer_1 und wird über den Timer_0 auf die Multiülexanzeige ausgegeben. Soweit so gut. Wir wollen die vergangene Zeit messen die über ein und den selben Sensor erfasst werden soll. Unser problem ist, dass wir die Werte die ins SRAM geschrieben werden, solange bei der ersten Routine in ein Zwischenspeicher zuladen um die bei der nächsten gemessen Routine vergangene Zeit ins Zwischenregister zu speichern um den ersten Wert aus dem Zwischenspeicher zuladen. D.h. das wir fortlaufend Werte umladen.
So... Viel gequatscht und vielleicht schwer beschrieben, aber ich hänge euch mal das Pro(blem)gramm an.
PROGRAMM:
CodeBox ASM
.include<m8def.inc>
.cseg
.org 0x000
rjmp reset
.org 0x008
rjmp tim1_ovf
.org 0x009
rjmp tim0_ovf
;*************************************************************************
.org 0x020
reset:
ldi r16,LOW(RAMEND)
out spl,r16
ldi r16,HIGH(RAMEND)
out sph,r16
ldi r16,0x00
out ddrc,r16
ldi r16,0xff
out ddrb,r16
out ddrd,r16
out portc,r16
ldi r16,0b00000011
out tccr0,r16 ;interner Takt Timer0 - Frequenz CLK/64
ldi r16,0000000001
out tccr1b,r16 ;interner Takt - kein Vorteiler
ldi r17,0xf1 ;timer highbyte zuerst initialisieren
ldi r18,0xb4 ;timer lowbyte initialisieren
out tcnt1h,r17
out tcnt1l,r18
ldi r16,0b00000001
out timsk,r16 ;timer0 interrupt ermöglichen
ldi zl,0x60 ;zeiger auf ausgabewerte
ldi zh,0x00
ldi r16,0x00
sts stelle,r16 ;stellenzähler
ldi r16,0x00
sts einer,r16
ldi r16,0x00
sts zehner,r16
ldi r16,0x00
sts hunderter,r16
ldi r16,0x00
sts tausender,r16
ldi r20,0x00
sei
start:
sbis pinc,0
rjmp start
st1:
ldi r16,0x00
sts stelle,r16 ; stellenzähler
sts einer,r16 ; `0` ---> einer
sts zehner,r16 ; `0` ---> zehner
sts hunderter,r16 ; `0` ---> hunderter
sts tausender,r16 ; `0` ---> tausender
ldi r16,0b00000101 ; timer 1\0 interrupt ermöglichen
out timsk,r16
st2:
; rcall zeit
sbic pinc,0
rjmp st2
st3:
ldi r16,0b00000001 ;timer0 interuppt ermöglichen
out timsk,r16
; rcall zeit
rjmp start
tim0_ovf:
sei ;interrupts zulassen
push r16 ;register retten
push r17
push r18
push r19
in r16,sreg ;statusregister sichern
ld r18,z+ ;ausgabewert holen
lds r19,stelle ;stelle holen
swap r19 ;nibbles tauschen
out portb,r18 ;wert ausgeben
out portd,r19 ;stelle ausgeben
swap r19 ;stelle zurücktauschen
inc r19
sts stelle,r19 ;und sichern
cpi r19,0x04
brlo t0_1
ldi zl,0x60
ldi zh,0x00
ldi r19,0x00
sts stelle,r19
t0_1:
out sreg,r16 ;statusregister wieder herstellen
pop r19 ;register wieder herstellen
pop r18
pop r17
pop r16
reti
tim1_ovf:
push r16
push r17
push r18
in r16,sreg
lds r16,einer ;einerstelle holen
inc r16 ;und inkrementieren
cpi r16,0x0a
brsh s2 ;wenn einer > 9
sts einer,r16 ;sonst einer sichern
rjmp t1_end ;und wiederholen
s2: ldi r16,0x00
sts einer,r16 ;einer zurücksetzen
lds r16,zehner
inc r16 ;zehner inkrementieren
cpi r16,0x0a
brsh s3 ;wenn zehner > 9
sts zehner,r16 ;sonst zehner sichern
rjmp t1_end ;und wiederholen
s3: ldi r16,0x00
sts zehner,r16 ;zehner zurück setzen
lds r16,hunderter
inc r16 ;hunderter inkrementieren
cpi r16,0x0a
brsh s4 ;wenn hunderter > 9
sts hunderter,r16 ;sonst hunderter sichern
rjmp t1_end ;und wiederholen
s4: ldi r16,0x00
sts hunderter,r16 ;hunderter zurücksetzen
lds r16,tausender
inc r16 ;tausender inkrementieren
cpi r16,0x0a
brsh s5 ;wenn tausender > 9
sts tausender,r16 ;tausender sichern
rjmp t1_end ;und wiederholen
s5: ldi r16,0x00
sts tausender,r16 ;tausender zurücksetzen
t1_end:
ldi r17,0xf1
ldi r18,0xb4
out tcnt1h,r17 ;timerwert zurücksetzen
out tcnt1l,r18
out sreg,r16 ;statusregister wiederherstellen
pop r18
pop r17
pop r16
reti
zeit: push r16
push r17
push r18
lds r16,sreg
push r16
ldi r16,0x02
zeit1: ldi r17,0xcd
zeit2: ldi r18,0x1d
zeit3: dec r18
brne zeit3
dec r17
brne zeit2
dec r16
brne zeit1
pop r16
sts sreg,r16
pop r18
pop r17
pop r16
ret
.dseg
einer: .byte 1
zehner: .byte 1
hunderter: .byte 1
tausender: .byte 1
stelle: .byte 1
ICH WÄRE SO DANKBAR ÜBER JEDE HILFESTELLUNG !!!