;HEART-BEAT 5 09.10.07 ;HS = Herzschlag ;Eingang mit Taster und 10nF an Masse : PB4 ;LED grün an PB3; blinkt, wenn 4x abgemessen wurde ;3 kaskadierte 4033 zählen t_30 (und später den Takt) hoch ;Teilung: 5400/t_30 als Ausgabeergebnis an COUNTER ;Warteschleife zum Anfangsreset (ggf. nicht nötig) ;Min-Max-Grenzen für die Darstellung (sonst Null-Wert) ;### EIGENES DIVISIONSPROGRAMM !!! ### .include "tn13def.inc" .def Takt = r16 .def i = r17 .def Sicher_ITR = r18 ;für ITR-Subroutine .def t_30 = r19 ;=Zeit für 3xHS bei 30Hz .def HeartBeat = r20 ;Herzfrequenz .def Sicher = r21 ;für Subroutinen .def j = r22 ;### Register EIGENE Division ### .def Divident_h = r0 ;hier kommt 5400 rein .def Divident_l = r1 .def t_30_h = r2 ;notwendig für Division rjmp BEGINN .org 0x0003 rjmp TIM0_OVF ;Timer0 - Overflow BEGINN: sbi ddrb,1 ;Takt-Ausgang sbi ddrb,2 ;Reset-Counter-Ausgang sbi ddrb,3 ;PB3 := LED-Ausgang ldi i,255 ;Einschalt-Reset mit vorheriger LOOP_Warten: ;Warteschleife dec i ;(Vermutlich notwendig wegen brne LOOP_Warten ; Einschaltverzögerung der 4033s) sbi portb,2 ;Reset-Impuls high nop cbi portb,2 ;Reset-Impuls low cbi ddrb,4 ;PB4=HS-Eingang mit PullUp sbi portb,4 ;dh. PUSH = Low (an Masse) NEUE_MESSUNG: cli ;Timer_OVF (u. andere) stoppen ! rcall DIVISION_5400 ;HeartBeat <- 5400/t_30 rcall COUNTER ;Überträgt HeartBeat auf Display clr t_30 clr HeartBeat ldi Takt,4 ;4Takte = 3HS-Intervalle zählen ldi i,217 ;39 bis OVF, /1024 -> 30Hz OUT TCNT0,i ldi i,5 ;Prescaler: 1200kHz /1024 out TCCR0B,i ldi i,2 ;Timer-ITR freigeben out TIMSK0,i ;Warten auf Takteingabe nach ;vorherigem Loslassen des Tasters PUSHED_1: sbis pinb,4 ;=not pushed wegen PullUp !! rjmp PUSHED_1 cbi portb,3 ;LED aus NOT_PUSHED_1: sbic pinb,4 ;= pushed wegen PullUp !! rjmp NOT_PUSHED_1 sbi portb,3 ;LED an sei ;Globaler ITR frei ;-> Timer-ITR beginnt ;---------------------------------------------------------- MESS_SCHLEIFE: dec Takt breq NEUE_MESSUNG PUSHED_2: sbis pinb,4 ;=not pushed wegen PullUp !! rjmp PUSHED_2 cbi portb,3 ;LED aus NOT_PUSHED_2: sbic pinb,4 ;= pushed wegen PullUp !! rjmp NOT_PUSHED_2 ;sbi portb,3 ;LED an rjmp MESS_SCHLEIFE ;---------------------------------------------------------- TIM0_OVF: ;ITR für Timer in Sicher_ITR,SREG ;SREG sichern ldi i,217 ;39 bis OVF, /1024 -> 30Hz out TCNT0,i inc t_30 ;t_30 <- t_30+1 out SREG,Sicher_ITR ;SREG zurück reti ;ggf. wird Timer-OVF erst später ;wieder eingeschaltet ;---------------------------------------------------------- COUNTER: ;zählt die 4033 hoch ;Überträgt HeartBeat auf Display in Sicher,SREG sbi portb,2 ;Reset für alle 4033 nop ;ggf. wieder weg cbi portb,2 cpi HeartBeat,25 ;Anzeigegrenzen für HeartBeat brlo ENDE_COUNTER ;falls zu gross/klein: cpi HeartBeat,230 ;Anzeige von Null brsh ENDE_COUNTER LOOP_1: sbi portb,1 ;je einen Zähltakt übertragen nop ;ggf. wieder weg cbi portb,1 dec HeartBeat brne LOOP_1 ENDE_COUNTER: out SREG,Sicher ;SREG zurück ret ;---------------------------------------------------------- DIVISION_5400: ;Eigenes Divisionsprogramm ;durch n-fache Substraktion in Sicher,SREG ;SREG sichern clr HeartBeat ;HeartBeat <- 0 clr t_30_h ;t_30_h <- 0 ldi j,0x15 ;0x1518 (=5400) in Divident mov Divident_h,j ;(Divisor ist t_30_h:t_30) ldi j,0x18 mov Divident_l,j tst t_30 ;if t_30=0 -> keine Division ! breq ENDE_DIVI LOOP_DIVI: cp Divident_l,t_30 cpc Divident_h,t_30_h ;Divident kann nicht mehr geteilt brlo ENDE_DIVI ;werden (Divident < Divisor) sub Divident_l,t_30 ;Divident <- Divdent - Divisor sbc Divident_h,t_30_h inc HeartBeat ;HeartBeat <- HeartBeat + 1 rjmp LOOP_DIVI ENDE_DIVI: out SREG,Sicher ;SREG zurück ret ;----------------------------------------------------------