#define OW_DDR _SFR_IO_ADDR(DDRB) //pin direction register
#define TCNT_REG _SFR_IO_ADDR(TCNT0)
+
#define DB_PORT _SFR_IO_ADDR(PORTB) //DEBUG
#define DB_PIN _SFR_IO_ADDR(PINB) //DEBUG
#define DB_DDR _SFR_IO_ADDR(DDRB) //DEBUG
//#define OWT_WRITE 18
//#define OWT_READ 4
-#define OWT_MIN_RESET 80
-#define OWT_RESET2 100
+#define OWT_MIN_RESET 120
+#define OWT_RESET2 80
#define OWT_RESET_PRESENT 30
#define OWT_PRESENT 130
#define OWT_WRITE 35
#define OWT_READ 12
+.macro CLEAR_TOV_FLAG
+ ldi r_temp,1
+ out _SFR_IO_ADDR(TIFR0),r_temp
+.endm
+.macro JMP_NO_TOV
+ in r_temp, _SFR_IO_ADDR(TIFR0)
+ sbrc r_temp,TOV0 ; wenn ueberlauf gleiich weiter
+.endm
.macro CLEAR_INTERRUPT_FLAG
ldi r_temp,(1<<INTF0);inerrupt flags durch 1 loeschen..... 0 macht nix
.global TIMER_INTERRUPT
- TIMER_INTERRUPT:
+TIMER_INTERRUPT:
push r_temp
in r_temp,_SFR_IO_ADDR(SREG)
push r_temp
rjmp tint_end ; Leitung 1 kein Reset
ldi r_temp,0
out TCNT_REG,r_temp
+ CLEAR_TOV_FLAG
tint_loop_rend:
sbis OW_PIN,OW_PINN ;warten bis leitung wieder h
rjmp tint_loop_rend
+ JMP_NO_TOV ;ueberspringe wenn kein ueberlauf
+ rjmp tint_overrun
in r_temp,TCNT_REG ;schauen ob es lange genug gedauert hat fuer reset
cpi r_temp,OWT_RESET2
brlo tint_end
+tint_overrun:
ldi r_temp,0
out TCNT_REG,r_temp
;zwischen Reset und Presets