rendered paste bodyinclude "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