include "s:\qbasic\80c535.mcu" ; 89C2051 mit 12MHz ; EIB-Testprogramm, lässt Gruppenadresse 1/4/7 blinken ; P3.4 Input EIB-Daten ; P3.5 Output EIB-Daten ; P1.0 Aus Taster ; P1.1 Ein Taster org 0000h clr p3.5 setb p3.4 START: mov a,#0 acall TELEGRAMM cpl p1.0 mov r0,#255 mov r1,#255 mov r2,#20 djnz r2,-2 djnz r1,-6 djnz r0,-10 mov a,#1 acall TELEGRAMM cpl p1.0 mov r0,#255 mov r1,#255 mov r2,#20 djnz r2,-2 djnz r1,-6 djnz r0,-10 ajmp START TELEGRAMM: mov r7,a mov a,#BCh ; Kontrollbyte acall EIB_SENDBYTE acall EIB_WAIT308 mov a,#11h ; feste Senderadresse 1.1.67 (spielt aber keine Rolle) acall EIB_SENDBYTE acall EIB_WAIT308 mov a,#1Dh acall EIB_SENDBYTE acall EIB_WAIT308 mov a,#0Ch ; feste Ziel-Gruppenadresse (hier 1.4.7) acall EIB_SENDBYTE acall EIB_WAIT308 mov a,#07h acall EIB_SENDBYTE acall EIB_WAIT308 mov a,#E1h ; Routen und Datenlänge 2 Byte acall EIB_SENDBYTE acall EIB_WAIT308 mov a,#00h ; erstes Datenbyte 00h acall EIB_SENDBYTE acall EIB_WAIT308 mov a,r7 add a,#80h ; zweites Datenbyte 80h für aus, 81h für an acall EIB_SENDBYTE acall EIB_WAIT308 mov a,#25h ; Checksum (z.Zt.noch hart verdratet) clr c subb a,r7 acall EIB_SENDBYTE acall EIB_WAIT308 ret EIB_SENDBYTE: acall EIB_BIT0 ;41 Startbit mov r0,#28 ;42 djnz r0,-2 ;98 mov r1,#8 ;99 clr 00h ;100 nop ;101 EIB_NEXTBIT: rrc a ;102 jc EIB_BIT1 ;104=0 acall EIB_BIT0 ;41 ajmp EIB_SENDBYTE1 ;43 EIB_BIT1: mov r0,#48 ; 1 djnz r0,-2 ; 97 ajmp EIB_SENDBYTE2 ; 99 EIB_SENDBYTE1: mov r0,#28 ;44 djnz r0,-2 ;98 cpl 00h ;99 EIB_SENDBYTE2: djnz r1,EIB_NEXTBIT ;101 mov c,00h ;102 Parity Bit jc EIB_BIT1A ;104=0 acall EIB_BIT0 ;41 ajmp EIB_SENDBYTE3 ;43 EIB_BIT1A: mov r0,#49 ; 1 djnz r0,-2 ; 99 ajmp EIB_SENDBYTE4 ; 101 EIB_SENDBYTE3: mov r0,#29 ;44 djnz r0,-2 ;100 nop ;101 EIB_SENDBYTE4: ret ;103 EIB_BIT0: setb p3.5 ;3 total 39us ohne den call mov r0,#17 ;4 djnz r0,-2 ;38 clr p3.5 ;39 ret ;41 EIB_WAIT308: mov r0,#151 ;308us incl. call und ret djnz r0,-2 nop ret END