Knappe Erläuterung was hier passiert Warten auf "0" Lage Messen ob >4ms 3ms warten warten auf ende präambel (1 >480us und <1,1ms) ende der folgenden 0 abwarten längen der 1 und 0 der folgenden 32 bit einlesen und speichern. kleinsten messwert in der tabelle ermitteln diesen mal 3 nehmen und als threshold verwenden um zwischen 1 und 0 zu unterscheiden. (soll kompatibilität schaffen für codes mit anderen bitzeiten) nutzdaten ermitteln und speichern nach r12 r13 r14 r15 Im Quelltext sind diverse Debuggingbefehle auskommentiert oder noch aktiv. Das Bild zeigt die Ausgabe der Debugginginformationen. Die Telegrammnummer ist hinter dem FFFDx000 an der Stelle X in HEX zu sehen. Die <0>1<1 ect. zeigen empfangene einsen und nullen die empfangen wurden aber nicht ins Schema passen. Die Doku lässt viele Wünsche offen ;-) Im groben zeigt sie aber wo man an welcher Stelle ist. ; tasteneingabe 1-9 verändert die startbedingung von 1-9 ms ; die mindestbitlänge ist auf 160us gesetzt gon: rcall setpc ;Sende und Empfangsroutine mit Geschwindigkeit setzen rx41q: ldi temp,3 rcall textaus gon2: ;rcall newline ldi temp,40 mov r15,temp ;wartezeit für startbedingung rx41a: rx41t: sbis pinb,rx rcall get2 ;eingabe ermöglichen die wartezeit zu verändern sbic pinb,0 rjmp rx41t ;warten auf 0 strx: clr r16 ;100usec-cnt = 0 rx42q: cpi r16,0xff ;test max-cnt breq rx43q inc r16 rx43q: rcall del100us sbis pinb,0 rjmp rx42q ;warten auf 0 -> 1 cp r16,r15 ;test startbedigung >4msec brcs rx41t ;zu kurz -> muell ;Startschritt war 1 und danach mindestens 5 ms low. Jetzt wieder 1. Ab hier messen ;ldi temp,'1' ;rcall send ldi temp,30 ;3ms warten w3ms: rcall del100us dec temp brne w3ms rx43qa: clr zh ldi zl,0x66 ldi temp3,0 ;32 bits einlesen me99z: clr temp ;präambel abwarten clr temp2 me02z: sbis pinb,0 ;wenn noch 0 dann warten rjmp me02z me01z: sbis pinb,0 ;wenn noch 1 dann weiter zählen rjmp tst1z inc temp brne me01z inc temp2 brne me01z rjmp rx41t ;1 war viel zu lang tst1z: cpi temp2,3 brcs me99z ;1 zu kurz <480us cpi temp2,7 brcc gon2 ;1 zu lang >1,1ms ;1.langes eins bit gesehen ende präambel weins: sbis pinb,0 ;wenn noch 0 dann weiter zählen rjmp weins ;ldi temp,'2' ;rcall send ;ldi temp,' ' ;rcall send me99: clr temp clr temp2 me01: sbis pinb,0 ;wenn noch 1 dann weiter zählen rjmp jetztnull inc temp brne me01 inc temp2 brne me01 rjmp rx41t ;zu lange eins,abbruch jetztnull: cpi temp2,0x0f brcc gon3 tst temp2 breq gon4 ;abbruch bei 1 länge <1 (160us) und =>0f (2,4ms) st z+,temp2 st z+,temp clr temp clr temp2 me01a: sbic pinb,0 ;wenn noch 0 dann weiter zählen rjmp jetzteins inc temp brne me01a inc temp2 cpi temp2,0x0f ;>3ms null brcs me01a ;brne me01a ;st z+,temp2 ;st z+,temp ;rjmp losg jetzteins: st z+,temp2 st z+,temp cpi temp2,0x0f brcc losg tst temp2 brne ok1 ;abbruch bei <1 und =>0f (2,4ms) rjmp gon5 ok1: inc temp3 cpi temp3,33 ;66 messwerte = 33 bit brcs me99 brcc losg gon3: ldi temp,'>' rcall send ldi temp,'1' rcall send rjmp gon6 gon4: ldi temp,'<' rcall send ldi temp,'1' rcall send ;rcall hexdump rjmp gon6 gon5: ldi temp,'<' rcall send ldi temp,'0' rcall send rjmp gon6 gon6: ;Ram von 0066-00ff sichern nach 0110 clr yh ldi yl,0x66 ldi zh,1 ldi zl,0x10 wetc: ld temp,y+ st z+,temp cpi yl,0 brne wetc ;alle register von 0000-001f sichern nach 01e0 clr yh clr yl ldi zh,1 ldi zl,0xe0 wetc2: ld temp,y+ st z+,temp cpi yl,0x20 brne wetc2 rjmp gon2 ;Aufzeichnung ende ;Briefkasten decodierung cpi temp3,33 breq ok2 ;wenn telegramm zu kurz abbrechen rjmp gon2 losg: ok2: ;ldi temp,20 ;rcall textaus clr zh ;Kleinsten Messwert ermitteln clr yh ;y zeigt darauf clr xl ldi zl,0x66 mov yl,zl lsl temp3 wsch: ld temp,y+ ld temp2,z+ cp temp,temp2 ;high wert vergleichen brcs ist2 breq istglei rjmp spei istglei: ld temp,y ld temp2,z cp temp,temp2 ;low wert vergleichen brcs ist2 spei: ld temp,-y ld temp,-z mov yh,zh mov yl,zl rjmp istgr ist2: ld temp,-y ld temp,-z istgr: ld temp2,z+ ld temp2,z+ ldi temp,0x0d ; kleinsten wert ausgeben ;rcall send ldi temp,0x0a ;rcall send ld temp,y ;rcall sh1b ldd temp,y+1 ;rcall sh1b2 inc xl cp xl,temp3 brne wsch ld temp2,y+ ;wert mal 3 und sichern nach r21/22 ld temp,y ld zl,y ld zh,-y ;lsr temp2 ;ror temp clc adc zl,temp adc zh,temp2 adc zl,temp adc zh,temp2 mov r22,zl mov r21,zh ;lsl temp ;rol temp2 ;mov r22,temp ;mov r21,temp2 mov temp,r21 ;ausgabe des erhöhten werts hex ;rcall sh1b mov temp,r22 ;rcall sh1b2 ldi temp,0x0d ;rcall send ldi temp,0x0a ;rcall send clr r12 ;codierung auflösen clr r13 clr r14 clr r15 clr xl clr zh ldi zl,0x68 lsr temp3 ;ldi bit,'0' ;mit '0'Bit beginnen ;rjmp kurz2 rjmp first naechst2: mov temp,bit lsr temp rol r15 rol r14 rol r13 rol r12 mov temp,bit ;rcall send first: ldi bit,'0' ld temp,z+ cp temp,r21 ;highwert vergleichen brcc istlang ld temp,z cp temp,r22 ;lowwert vergleichen brcc istlang ldi bit,'1' istlang: ld temp,z+ ld temp,z+ ld temp,z+ inc xl cpi xl,33; temp3 brne naechst2 ;ausgabe fertig ;rjmp austest mov temp,r12 cpi temp,0xff brne mani mov temp,r13 cpi temp,0xfd brne mani mov temp,r15 cpi temp,0 brne mani ;ldi temp,19 ;rcall textaus rcall newline mov temp,r12 rcall sh1b2 mov temp,r13 rcall sh1b2 mov temp,r14 rcall sh1b2 mov temp,r15 rcall sh1b2 ;rcall hexdump ;rcall get rjmp gon2 mani: ;rcall hexdump rjmp gon2