#include #define send r24 //Übergabe Register an serout #define Ist r5 //Arbeitsregister #define Soll r6 //Arbeitsregister #define Chk r7 //Arbeitsregister #define temp r25 //Arbeitsregister .stabs "",100,0,0,SIG_INTERRUPT0 /* needed for AVRStudio 4.08 debugging */ .stabs "ext_interrupt0.S",100,0,0,SIG_INTERRUPT0 .global SIG_INTERRUPT0 .func SIG_INTERRUPT0 .global SIG_INTERRUPT0 SIG_INTERRUPT0: in temp,_SFR_IO_ADDR(TIFR) //Ist ein Überlauf aufgetreten sbrs temp,TOV0 //Letztes Bit empfangen?? rjmp .LNoOv0 ori temp,0b00000001 //Overflowflag löschen out _SFR_IO_ADDR(TIFR),temp rjmp .Lin_Stop0 .LNoOv0: in temp,_SFR_IO_ADDR(TCNT0) //Timer stand einlesen cpi temp, 0 //Vergleich auf 0 breq .Ltimer_start0 cpi temp,28 brlo .Ltimer_reset0 //Flanke vor 450 us ?? ungültig cpi temp,34 brlo .Ltest1_20 //Flanke zwischen 450 - 550 us ??? 350-450us cpi temp,59 //Flanke im Breich 551-950 brlo .Ltimer_reset0 //Flanke ist ungültig cpi temp,65 //Flanke im Breiche 951 - 1050 us brlo .LEchteFlanke0 //Flanke gültig rjmp .Lin_Stop0 //Ende der Kommunikation .Ltest1_20: lds Chk,FlankeFlg tst Chk //Flanke vor 450 us (kurz) brne .LEchteFlanke0 ldi temp,1 sts FlankeFlg,temp rjmp .Ltimer_reset0 .LEchteFlanke0: ldi temp,0 sts FlankeFlg,temp lds Ist,tmpGetIst lds Soll,tmpGetSoll lds Chk,tmpGetChk clc rol Chk //von links nach rechts rol Soll //Die emfpangenen Bits (1) in die Empfangs- rol Ist sts tmpGetIst,Ist sts tmpGetSoll,Soll sts tmpGetChk,Chk ldi send,'0' rcall serout .Ltimer_reset0: ldi temp,0 //Timer auf Null stellen out _SFR_IO_ADDR(TCNT0),temp// " " reti .Ltimer_start0: ldi temp,0 sts FlankeFlg,temp //kommende erste Flanke ist out _SFR_IO_ADDR(TCNT0),temp //Timer auf Null stellen ldi temp,0x03 //Timer mit 64 vorbelgen out _SFR_IO_ADDR(TCCR0),temp //Timer starten.... reti .Lin_Stop0: ldi temp,0x00 //Timer anhalten out _SFR_IO_ADDR(TCCR0),temp ldi temp,0 //Timer auf Null stellen out _SFR_IO_ADDR(TCNT0),temp lds send,tmpGetIst rcall serout lds send,tmpGetSoll rcall serout lds send,tmpGetChk rcall serout reti .endfunc