;test.A51 pentru placa de dezvoltare echipata cu powersim ;programul exploreaza receptorul ir SFH5110-36 ;conectat pe INT0/P3.2 ;obs: subrutinele initser si swpc ;sunt cuprinse in powersim ;pentru programul real trebuie setata seriala ;atentie sfh-ul scoate in logica negativa ;decodificare prin numararea impulsurilor ;merge numai pt RC5 standard ;poate fi folosita ca baza la receptor tv rc5 CODESEG SEGMENT CODE ;definesc zona de program (cod) STIVA SEGMENT DATA ;definesc zona de stiva VARSEG SEGMENT DATA ;definesc zona de variabile octet BITSEG SEGMENT BIT ;variabile bit RSEG STIVA DS 32 ;rezerv spatiu pt. stiva 32 octeti RSEG VARSEG PORTEX: DS 1 ;memoreaza starea portului de extensie ADRES: DS 1 COMAND: DS 1 BUFER: DS 30 TRESO: DS 1 RSEG BITSEG TOGLE: DBIT 1 ;arata daca se repeta c-da ;-------program principal-------------------------------------------------- RSEG CODESEG USING 0 ;folosesc bank 0 de registrii ORG 8000H ;adresa de inceput a prog la placa LJMP INCEPUT ORG 8003H ;External interrupt 0 JMP RECEPTIE ORG 800BH ;Timer 0 interrupt RETI ORG 8013H ;External interrupt 1 RETI ORG 801BH ;Timer 1 interrupt RETI ORG 8023H ;Serial interrupt RETI ;------------------------------------------------------------------------ TEXT0: DB 0 ;pentru cr+lf TEXT1: DB ' PROGRAM DE EXPLORARE A LUI SFH5110',0 TEXT2: DB ' **********************************',0 TEXT3: DB 'TOGGLE: ',0 TEXT4: DB 'ADDRESS: ',0 TEXT5: DB 'COMMAND: ',0 TEXT6: DB ' ',0 ;------------------------------------------------------------------------ INCEPUT: MOV SP,#STIVA-1 ;initializare stiva MOV PORTEX,#7EH ;specific fisfire, stare port extern SETB EX0 ; Enable external Interrupt0 CLR IT0 ; triggered by a high to low transition SETB EA ;enable all interrupt ;------------------------------------------------------------------------ MOV A,#0CH ;foaie noua CALL TXCHAR MOV DPTR,#TEXT0 ;cr+lf CALL TXTEXT MOV DPTR,#TEXT0 ;cr+lf CALL TXTEXT MOV DPTR,#TEXT2 ;************** CALL TXTEXT MOV DPTR,#TEXT1 ;text CALL TXTEXT MOV DPTR,#TEXT2 ;************* CALL TXTEXT MOV DPTR,#TEXT0 ;cr+lf CALL TXTEXT ;------------------------------------------------------- START: ;bucla principala JMP START ;----------------------subrutine----------------------------------------- RECEPTIE: ;sub receptie de la telecomanda PUSH ACC PUSH PSW MOV R0,#BUFER REC: MOV A,#0 REC0: INC A ; Measure duration of low-level NOP NOP ; Delay NOP NOP JZ ENDOK ; End of transmission if duration exeeds 256 counts JNB P3.2,REC0 MOV @R0,A INC R0 MOV A,#0 REC1: INC A ; Measure duration of high-level NOP NOP ; Delay NOP NOP JZ ENDOK ; End of transmission JB P3.2,REC1 MOV @R0,A INC R0 JMP REC endok: ;----------------------------------------------------------------- MOV A,BUFER ; calculate threshold between short and long pulses INC R0 ; length of first low-pulse ADD A,BUFER+1 ; plus length of first high-pulse CLR C RRC A ; divided by two MOV R1,A CLR C RRC A ; plus half of the time ADD A,R1 MOV TRESO,A ; yields threshold ;------------------------------------------------------------------ MOV R0,#BUFER MOV R1,#1 ; initial value MOV R2,#13 ; Number of bits to decode DECODE: MOV A,@R0 INC R0 CLR C SUBB A,TRESO ; compare length with threshold MOV A,#0 CPL C ; short=1 RLC A JNZ NOSKIP INC R0 ; if short skip over next pulse NOSKIP: XRL A,R1 ; new bit is calculated by XOR with previous bit MOV R1,A ; Store new bit RRC A MOV A,R3 ; Store new Bit in R3/R4 by rotating RLC A MOV R3,A MOV A,R4 RLC A MOV R4,A DJNZ R2,DECODE MOV A,R3 ANL A,#00111111B ; extract command from R3 MOV COMAND,A MOV A,R3 RLC A ; do some rotating to extract XCH A,R4 RLC A ;device address XCH A,R4 RLC A XCH A,R4 RLC A CLR TOGLE JNB ACC.5,TZ ; Check TOGLE bit SETB TOGLE TZ: ANL A,#00011111B ; mask device address MOV ADRES,A ;------------------------------------------------------------------ ;------------------------------------------------------------------ jb togle,eunu ;send togle mov r2,#0 jmp ptogle eunu: mov r2,#1 ptogle: CALL HEXAS1 CALL TXCHAR MOV A,B CALL TXCHAR MOV A,#20H CALL TXCHAR MOV R2,ADRES ;send ADDRESS CALL HEXAS1 CALL TXCHAR MOV A,B CALL TXCHAR MOV A,#20H CALL TXCHAR MOV R2,COMAND ;send comand CALL HEXAS1 CALL TXCHAR MOV A,B CALL TXCHAR MOV DPTR,#TEXT0 ;cr+lf CALL TXTEXT ;----------------------------------------------------- ENDREC: call beep call delay_500ms POP PSW POP ACC RETI ;------------------------------------------------------------------------ HEXBCD: ;conversie hex in doi octeti BCD afisabili ;intra R2 numar binar < 100 ;iese A si B ascii, A este high ;afecteaza A, B MOV A,R2 MOV B,#10 ;imparte la 10 pentru conversie BCD DIV AB ;catul se pune in A si restul in B ORL A,#30H ;pune un 3 in fata ORL B,#30H RET ;-------------------------------------------------------------------------- BCDHEX: ;conversie doi octeti BCD ascii numerici ;in numar binar < 100 ;intra A, B ascii ;iese R2 numar binar ;afecteaza A, B, R2 ANL A,#0FH ;mascheaza high nibble ANL B,#0FH MOV R2,B MOV B,#10 ;inmulteste high cu 10 MUL AB ADD A,R2 ;adaoga low MOV R2,A RET ;------------------------------------------------------------------------- HEXBCD1: ;conv hex in bcd ;intra A<100 iese A bcd ;afecteaza a,b MOV B,#10 DIV AB ;in a se pune high SWAP A ORL A,B RET ;-------------------------------------------------------------------------- BCDHEX1: ;conv bcd in hex ;intra A in bcd iese A hex <100 ;afecteaza a,b,r2 MOV R2,A ANL A,#0FH ;mask high MOV B,A ;in b pastrez low MOV A,R2 ANL A,#0F0H ;mask low SWAP A ;in apastrez high MOV R2,B ;incarc low in r2 MOV B,#10 ;inmulteste cu 10 MUL AB ADD A,R2 ;adaog low RET ;--------------------------------------------------------------------------- HEXAS: ;conversie hex <10H (0-F) in digit ascii ;intra A si iese A CLR C SUBB A,#0AH JNC HAS1 ADD A,#3AH RET HAS1: ADD A,#41H RET ;------------------------------------------------------------------------ HEXAS1: ;converteste un hex (00-FF) in doi ;octeti ascii tiparibili ;intra R2 si iese A si B MOV A,R2 ANL A,#0FH CALL HEXAS MOV B,A MOV A,R2 SWAP A ANL A,#0FH CALL HEXAS RET ;------------------------------------------------------------------------- TXCHAR: ;trimite caracter din A pe seriala JNB TI,TXCHAR CLR TI MOV SBUF,A RET ;------------------------------------------------------------------------ TXTEXT: ;trimite un text din mem prog ;(max 256 caractere) pe seriala cu adr de ;inceput in DPTR, txt trebuie sa se termine ;cu 00H. Textul e urmat de cr+lf ;afecteaza A,R3, MOV R3,#0 TXX1: MOV A,R3 MOVC A,@A+DPTR JZ TXX2 CALL TXCHAR INC R3 JMP TXX1 TXX2: MOV A,#0DH CALL TXCHAR MOV A,#0AH CALL TXCHAR RET ;-------------------------------------------------------------------------- TXASK: ;trimite un text din mem prog ;(max 256 caractere) pe seriala cu adr de ;inceput in DPTR, txt trebuie sa se termine ;cu 00H. ;afecteaza A,R3, MOV R3,#0 TYY1: MOV A,R3 MOVC A,@A+DPTR JZ TYY2 CALL TXCHAR INC R3 JMP TYY1 TYY2: RET ;------------------------------------------------------------------------- FLASH: SETB P1.0 MOV A,PORTEX CLR ACC.5 MOVX @R1,A CALL DELAY_500MS SETB ACC.5 MOVX @R1,A CLR P1.0 RET ;------------------------------------------------------------------------ BEEP: ;scoate un beep la difuzor SETB P1.0 ;pune in 1 semnalul MEM&P(pt. port ) MOV A,PORTEX CLR ACC.4 ;pune alimentare pe difuzor MOVX @R1,A ;valoarea lui r1 nu conteaza CALL DELAY_50ms SETB ACC.4 ;taie alimentarea difuzorului MOVX @R1,A CLR P1.0 RET ;------------------------------------------------------------------------- DELAY_100us: ;asteapta 100us MOV R7,#23 ;pt FQ=11,059MHz , Tosc=90,424ns XXX1: NOP ;1ciclu_masina=12*Tosc=1,085us NOP ;2 nop + 1 djnz = 4 cicluri masina DJNZ R7,XXX1 ;delay=4*23*1ciclu_masina=99.8us RET ;----------------------------------------------------------------------- d442us: ;asteapta 442us MOV R7,#102 ;pt FQ=11,059MHz , Tosc=90,4224ns XXX4: NOP ;1ciclu_masina=12*Tosc=1,085us NOP ;2 nop + 1 djnz = 4 cicluri masina DJNZ R7,XXX4 ;delay=4*102*1ciclu_masina=442us RET ;----------------------------------------------------------------------- DELAY_2ms: ;asteapta 2ms MOV R6,#19 ;incarca R6 cu valoarea 19 XXX2: ACALL DELAY_100us ;call absolut (short) DJNZ R6,XXX2 ;decrement register and jump if not zero RET ;--------------------------------------------------------------------------- DELAY_50ms: MOV R5,#25 ;incarca R5 cu valoarea 25 XXXB: ACALL DELAY_2ms ;call absolut (short) DJNZ R5,XXXB ;decrement register and jump if not zero RET ;--------------------------------------------------------------------------- DELAY_500ms: ;asteapta 0,5 secunde MOV R5,#250 ;incarca R5 cu valoarea 250 XXX3: ACALL DELAY_2ms ;call absolut (short) DJNZ R5,XXX3 ;decrement register and jump if not zero RET ;--------------------------------------------------------------------------- END ÿ