por Karel » 01 Fev 2008 09:23
Temos 2 pics 16f876 onde uma tem a funçao de multiplexer de 16 fios para 1 onde o desmultiplexer de 1 para 16.
A transmissao é feita por rs232
o código do mux é o seguinte:
;**********************************************************************
; TITLE : Multiplexer data ENCODER
;**********************************************************************
; Filename : MUX_EN10.ASM
; Date Started : 17/12/07
; Last edit : 30/1/08
; File Version : 1.0
;
; Author : BRUNO MARQUES
;**********************************************************************
;
; Files required:
; p16F876.inc
;
;**********************************************************************
; Notes:
; ASSUMING 1MHz XTAL CLOCK WHICH GIVES 4us PER INSTRUCTION
;
;**********************************************************************
list p=16F876 ; list directive to define processor
#include <p16F876.inc> ; processor specific variable definitions
__CONFIG _CP_OFF & _WDT_ON & _PWRTE_ON & _XT_OSC
;***** VARIABLE DEFINITIONS
LOOP1 EQU 0CH ; LOOP VARIABLES
LOOP05 EQU 0DH
LOOP100 EQU 0EH
;**********************************************************************
ORG 0x000 ; processor reset vector - start of code
;******************************* INITIALISATION STUFF
CLRF PORTB ; reset portb
BSF STATUS, RP0 ; select bank 1
MOVLW B'00010000' ; PINS RB0-7=INPUT & RB3=OUTPUT
MOVWF TRISB
BCF OPTION_REG,NOT_RBPU ; ENABLE PULL-UP'S ON PORTB PINS
BCF STATUS, RP0 ; SELECT BANK 0
CLRF PORTC ; reset portc
BSF STATUS, RP0 ; select bank 1
MOVLW B'00001111' ; PINS RB0-7=INPUT
MOVWF TRISC
BCF OPTION_REG,NOT_RBPU ; ENABLE PULL-UP'S ON PORTC PINS
BCF STATUS, RP0 ; SELECT BANK 0
;*******************************
START:
CLRWDT ; RESET WATCHDOG TIMER
BCF PORTB, 3 ; SET SERIAL DATA O/P LOW
CALL DELAY100 ; DELAY 100ms
BSF PORTB, 3 ; SET SERIAL DATA O/P HIGH (START BIT)
CALL DELAY05 ; DELAY 0.5ms
;******************************** SEND BIT 0
BTFSC PORTB, 0 ; CHECK BIT 0 I/P, AND SKIP IF CLEAR
GOTO SET0
BCF PORTB, 3 ; BIT 0 MUST BE LOW, SO SET O/P LOW
GOTO SKIP0
SET0: BSF PORTB, 3 ; BIT 0 MUST BE HIGH, SO SET O/P HIGH
SKIP0: CALL DELAY1 ; DELAY FOR 1ms
;******************************** SEND BIT 1
BTFSC PORTB, 1 ; CHECK BIT 1 I/P, AND SKIP IF CLEAR
GOTO SET1
BCF PORTB, 3 ; BIT 1 MUST BE LOW, SO SET O/P LOW
GOTO SKIP1
SET1: BSF PORTB, 3 ; BIT 1 MUST BE HIGH, SO SET O/P HIGH
SKIP1: CALL DELAY1 ; DELAY FOR 1ms
;******************************** SEND BIT 2
BTFSC PORTB, 2 ; CHECK BIT 2 I/P, AND SKIP IF CLEAR
GOTO SET2
BCF PORTB, 3 ; BIT 2 MUST BE LOW, SO SET O/P LOW
GOTO SKIP2
SET2: BSF PORTB, 4 ; BIT 2 MUST BE HIGH, SO SET O/P HIGH
SKIP2: CALL DELAY1 ; DELAY FOR 1ms
;******************************** SEND BIT 3
BTFSC PORTB, 4 ; CHECK BIT 3 I/P, AND SKIP IF CLEAR
GOTO SET3
BCF PORTB, 3 ; BIT 3 MUST BE LOW, SO SET O/P LOW
GOTO SKIP3
SET3: BSF PORTB, 3 ; BIT 3 MUST BE HIGH, SO SET O/P HIGH
SKIP3: CALL DELAY1 ; DLEAY FOR 1ms
;******************************** SEND BIT 4
BTFSC PORTB, 5 ; CHECK BIT 4 I/P, AND SKIP IF CLEAR
GOTO SET4
BCF PORTB, 3 ; BIT 4 MUST BE LOW, SO SET O/P LOW
GOTO SKIP4
SET4: BSF PORTB, 3 ; BIT 4 MUST BE HIGH, SO SET O/P HIGH
SKIP4: CALL DELAY1 ; DELAY FOR 1ms
;******************************** SEND BIT 5
BTFSC PORTB, 5 ; CHECK BIT 5 I/P, AND SKIP IF CLEAR
GOTO SET5
BCF PORTB, 3 ; BIT 5 MUST BE LOW, SO SET O/P LOW
GOTO SKIP5
SET5: BSF PORTB, 3 ; BIT 5 MUST BE HIGH, SO SET O/P HIGH
SKIP5: CALL DELAY1 ; DELAY FOR 1ms
;******************************** SEND BIT 6
BTFSC PORTB, 7 ; CHECK BIT 6 I/P, AND SKIP IF CLEAR
GOTO SET6
BCF PORTB, 3 ; BIT 6 MUST BE LOW, SO SET O/P LOW
GOTO SKIP6
SET6: BSF PORTB, 3 ; BIT 6 MUST BE HIGH, SO SET O/P HIGH
SKIP6: CALL DELAY1 ; DELAY FOR 1ms
;******************************** SEND BIT 7
BTFSC PORTC, 0 ; CHECK BIT 7 I/P, AND SKIP IF CLEAR
GOTO SET7
BCF PORTB, 3 ; BIT 7 MUST BE LOW, SO SET O/P LOW
GOTO SKIP7
SET7: BSF PORTB, 3 ; BIT 7 MUST BE HIGH, SO SET O/P HIGH
SKIP7: CALL DELAY1 ; DLEAY FOR 1ms
;******************************** SEND BIT 8
BTFSC PORTC, 1 ; CHECK BIT 8 I/P, AND SKIP IF CLEAR
GOTO SET8
BCF PORTB, 3 ; BIT 8 MUST BE LOW, SO SET O/P LOW
GOTO SKIP8
SET8: BSF PORTB, 3 ; BIT 8 MUST BE HIGH, SO SET O/P HIGH
SKIP8: CALL DELAY1 ; DELAY FOR 1ms
;******************************** SEND BIT 9
BTFSC PORTC, 2 ; CHECK BIT 9 I/P, AND SKIP IF CLEAR
GOTO SET9
BCF PORTB, 3 ; BIT 9 MUST BE LOW, SO SET O/P LOW
GOTO SKIP9
SET9: BSF PORTB, 3 ; BIT 9 MUST BE HIGH, SO SET O/P HIGH
SKIP9: CALL DELAY1 ; DELAY FOR 1ms
;******************************** SEND BIT 10
BTFSC PORTC, 3 ; CHECK BIT 10 I/P, AND SKIP IF CLEAR
GOTO SET10
BCF PORTB, 3 ; BIT 10 MUST BE LOW, SO SET O/P LOW
GOTO SKIP10
SET10: BSF PORTB, 4 ; BIT 10 MUST BE HIGH, SO SET O/P HIGH
SKIP10: CALL DELAY1 ; DELAY FOR 1ms
;******************************** SEND BIT 11
BTFSC PORTC, 4 ; CHECK BIT 11 I/P, AND SKIP IF CLEAR
GOTO SET11
BCF PORTB, 3 ; BIT 11 MUST BE LOW, SO SET O/P LOW
GOTO SKIP11
SET11: BSF PORTB, 3 ; BIT 11 MUST BE HIGH, SO SET O/P HIGH
SKIP11: CALL DELAY1 ; DLEAY FOR 1ms
;******************************** SEND BIT 12
BTFSC PORTC, 5 ; CHECK BIT 12 I/P, AND SKIP IF CLEAR
GOTO SET12
BCF PORTB, 3 ; BIT 12 MUST BE LOW, SO SET O/P LOW
GOTO SKIP12
SET12: BSF PORTB, 3 ; BIT 12 MUST BE HIGH, SO SET O/P HIGH
SKIP12: CALL DELAY1 ; DELAY FOR 1ms
;******************************** SEND BIT 13
BTFSC PORTC, 6 ; CHECK BIT 13 I/P, AND SKIP IF CLEAR
GOTO SET13
BCF PORTB, 3 ; BIT 13 MUST BE LOW, SO SET O/P LOW
GOTO SKIP13
SET13: BSF PORTB, 3 ; BIT 13 MUST BE HIGH, SO SET O/P HIGH
SKIP13: CALL DELAY1 ; DELAY FOR 1ms
;******************************** SEND BIT 14
BTFSC PORTC, 7 ; CHECK BIT 14 I/P, AND SKIP IF CLEAR
GOTO SET14
BCF PORTB, 3 ; BIT 14 MUST BE LOW, SO SET O/P LOW
GOTO SKIP14
SET14: BSF PORTB, 3 ; BIT 14 MUST BE HIGH, SO SET O/P HIGH
SKIP14: CALL DELAY1 ; DLEAY FOR 1ms
GOTO START ; CONTINUE LOOPING FOR EVER
;******************************** 1ms DELAY SUBROUTINE
DELAY1:
MOVLW 0x52 ; LOOP COUNT VALUE
MOVWF LOOP1 ; SET LOOP VARIABLE
L1: DECFSZ LOOP1,1 ; DEC LOOP COUNTER AND SKIP NEXT STATEMENT IF LOOP COUNTER=0
GOTO L1 ; CONTINUE LOOPING UNTIL ZERO
RETURN
;******************************** 0.5ms DELAY SUBROUTINE
DELAY05:
MOVLW 0x28 ; LOOP COUNT VALUE
MOVWF LOOP05 ; SET LOOP VARIABLE
L05: DECFSZ LOOP05,1 ; DEC LOOP COUNTER AND SKIP NEXT STATEMENT IF LOOP COUNTER=0
GOTO L05 ; CONTINUE LOOPING UNTIL ZERO
RETURN
;******************************** 100ms DELAY SUBROUTINE
DELAY100:
MOVLW 0x64 ; LOOP COUNT VALUE (100)
MOVWF LOOP100 ; SET LOOP VARIABLE
L100: DECFSZ LOOP100,1 ; DEC LOOP COUNTER AND SKIP NEXT STATEMENT IF LOOP COUNTER=0
GOTO CALL1 ; CONTINUE LOOPING UNTIL ZERO
GOTO ENDLOOP ; FINISHED LOOPING
CALL1: CALL DELAY1 ; DELAY FOR 1ms
GOTO L100
ENDLOOP:
RETURN
END ; END OF PROGRAM
o código do demux:
;**********************************************************************
; TITLE : Multiplexer data DECODER
;**********************************************************************
; Filename : MUX_DE10.ASM
; Date Started : 21/12/07
; Last edit : 31/1/08
; File Version : 1.0
;
; Author : Bruno Marques
;**********************************************************************
;
; Files required:
; p16F876.inc
;
;**********************************************************************
; Notes:
; ASSUMING 1MHz XTAL CLOCK WHICH GIVES 4us PER INSTRUCTION
;
;**********************************************************************
list p=16F876 ; list directive to define processor
#include <p16F876.inc> ; processor specific variable definitions
__CONFIG _CP_OFF & _WDT_ON & _PWRTE_ON & _XT_OSC
;***** VARIABLE DEFINITIONS
LOOP1 EQU 110H ; LOOP VARIABLE FOR 1ms ROUTINE
COUNT1 EQU 111H ; DELAY VARIABLE
COUNT2 EQU 112H ; DELAY VARIABLE
OUTP EQU 113H ; TEMP OUTPUT VARIABLE FOR DATA LATCHING
OUTP1 EQU 114H ; TEMP OUTPUT VARIABLE FOR DATA LATCHING
;**********************************************************************
ORG 0x000 ; processor reset vector - start of code
;******************************* INITIALISATION STUFF
CLRF PORTB ; reset portb
BCF STATUS, RP0 ; select bank 0
MOVLW B'01111111' ; PINS RB4=INPUT & ALL OTHERS=OUTPUT
MOVWF TRISB ; UPDATE TRISB REGISTER TO DEFINE I/O PINS
BSF STATUS, RP0 ; SELECT BANK 1
CLRF PORTC ; reset portc
BSF STATUS, RP0 ; select bank 1
MOVLW B'11111111' ; PINS RB4=INPUT & ALL OTHERS=OUTPUT
MOVWF TRISC ; UPDATE TRISB REGISTER TO DEFINE I/O PINS
BSF STATUS, RP0 ; SELECT BANK 1
;*******************************
START:
CLRWDT ; RESET WATCHDOG TIMER
CLRF COUNT1 ; CLEAR LOWER COUNT VARIABLE
CLRF COUNT2 ; CLEAR UPPER COUNT VARIABLE
CLOOP:
INCFSZ COUNT1,1 ; INC LOW COUNTER AND SKIP NEXT STATEMENT IF ZERO
GOTO SKIP1
INCF COUNT2,1 ; INCREMENT THE HIGH COUNT VARIABLE
SKIP1:
BTFSS PORTB,0 ; IF DATA INPUT IF HIGH THEN SKIP NEXT STATEMENT
GOTO CLOOP ; LOOP WHILE DATA INPUT IS LOW
MOVLW 0F0H
ANDWF COUNT2,0 ; MASK OUT LOWER 4 BITS OF HIGH COUNTER (TO SET Z FLAG)
; THIS CHECKS TO SEE IF AT LEAST 16ms HAVE PASSED
BTFSC STATUS,Z ; SKIP NEXT STATEMENT OF ZERO FLAG IF NOT SET
GOTO CLOOP ; CONTINUE TIMING AND CHECKING PORT IF NOT AT LEAST 16ms
CLRF OUTP ; CLEAR TEMP OUTPUT LATCH VARIABLE
CALL DELAY1 ; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT0
BTFSC PORTB,0 ; CHECK IF DATA INPUT IS HIGH
BSF OUTP,0 ; SET BIT0
CALL DELAY1 ; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT1
BTFSC PORTB,0 ; CHECK IF DATA INPUT IS HIGH
BSF OUTP,1 ; SET BIT0
CALL DELAY1 ; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT2
BTFSC PORTB,0 ; CHECK IF DATA INPUT IS HIGH
BSF OUTP,2 ; SET BIT0
CALL DELAY1 ; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT3
BTFSC PORTB,0 ; CHECK IF DATA INPUT IS HIGH
BSF OUTP,3 ; SET BIT0
CALL DELAY1 ; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT0
BTFSC PORTB,0 ; CHECK IF DATA INPUT IS HIGH
BSF OUTP,4 ; SET BIT0
CALL DELAY1 ; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT1
BTFSC PORTB,0 ; CHECK IF DATA INPUT IS HIGH
BSF OUTP,5 ; SET BIT0
CALL DELAY1 ; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT2
BTFSC PORTB,0 ; CHECK IF DATA INPUT IS HIGH
BSF OUTP,6 ; SET BIT0
CALL DELAY1 ; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT0
BTFSC PORTB,0 ; CHECK IF DATA INPUT IS HIGH
BSF OUTP,7 ; SET BIT0
MOVF OUTP,0 ; MOVE LATCH VARIABLE INTO W
MOVWF PORTB ; LATCH BIT0-BIT7 ONTO PORT PINS
CLRF OUTP1 ; CLEAR TEMP OUTPUT LATCH VARIABLE
CALL DELAY1 ; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT1
BTFSC PORTC,0 ; CHECK IF DATA INPUT IS HIGH
BSF OUTP,0 ; SET BIT0
CALL DELAY1 ; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT2
BTFSC PORTC,0 ; CHECK IF DATA INPUT IS HIGH
BSF OUTP,1 ; SET BIT0
CALL DELAY1 ; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT3
BTFSC PORTC,0 ; CHECK IF DATA INPUT IS HIGH
BSF OUTP,2 ; SET BIT0
CALL DELAY1 ; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT3
BTFSC PORTC,0 ; CHECK IF DATA INPUT IS HIGH
BSF OUTP,3 ; SET BIT0
CALL DELAY1 ; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT1
BTFSC PORTC,0 ; CHECK IF DATA INPUT IS HIGH
BSF OUTP,4 ; SET BIT0
CALL DELAY1 ; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT2
BTFSC PORTC,0 ; CHECK IF DATA INPUT IS HIGH
BSF OUTP,5 ; SET BIT0
CALL DELAY1 ; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT3
BTFSC PORTC,0 ; CHECK IF DATA INPUT IS HIGH
BSF OUTP,6 ; SET BIT0
CALL DELAY1 ; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT3
BTFSC PORTC,0 ; CHECK IF DATA INPUT IS HIGH
BSF OUTP,7 ; SET BIT0
MOVF OUTP1,0 ; MOVE LATCH VARIABLE INTO W
MOVWF PORTC ; LATCH BIT0-BIT7 ONTO PORT PINS
GOTO START ; CONTINUE LOOPING FOREVER
;******************************** 1ms DELAY SUBROUTINE
DELAY1:
MOVLW 0x52 ; LOOP COUNT VALUE
MOVWF LOOP1 ; SET LOOP VARIABLE
L1: DECFSZ LOOP1,1 ; DEC LOOP COUNTER AND SKIP NEXT STATEMENT IF LOOP COUNTER=0
GOTO L1 ; CONTINUE LOOPING UNTIL ZERO
RETURN
END ; END OF PROGRAM
Gostaroa que me dessem uma ajudinha para por isto a funcionar