hey friend, I need some help. I have program in PIC16F877A for use 3 channel ADC to send parallel. I use TMR0 interrupt for send data. I setting TMR0 active every 8ms, prescaler 1:32. but when program run interrupt active after channel 1 ADC start conversion. can you helpme?
This is my program.
thank you....
This is my program.
Rich (BB code):
ORG 0000H
GOTO MULAI ; JUMP TO MAIN PROGRAM
ORG 0004H ; INTERRUPT VECTOR AREA
GOTO INT_SERVICE
MULAI: ; BEGINNING OF THE MAIN PROGRAM
BSF STATUS,5 ; INITIALIZATION PORT B
MOVLW B'11111100' ; SET THE FIRST TWO BITS OF PORT C AS OUTPUT
MOVWF TRISC
BSF TRISB,0 ; SET THE BIT 0 OF PORT B AS INPUT
BCF OPTION_REG,INTEDG ; SET RISING EDGE
BCF INTCON,INTF ; RESET INTERUPT FLAG OF INT
BSF INTCON,INTE ; SET IEBIT OF INT
BSF INTCON,GIE ; SET GLOBAT INT ENABLE
; INITIALIZATION OF TIMER0
MOVLW 0X04
MOVWF OPTION_REG ; T0 PRESCALE, TIMER, 1:32
; initialization of ADC
MOVLW 0XC2 ; only first channel is being activated
; IT WAS 8E FOR CH.0
MOVWF ADCON1
MOVLW B'00001010' ; set port RA0 and RA1 as input
MOVWF TRISA
BCF STATUS,5 ; SET BANK 0
BCF PORTC,0
BCF PORTC,1
MOVLW D'6' ;SET COUNTFOR 6
MOVWF TMR0
MOVLW 0xA0 ; ENABLE T0 AND GLOBAL INTS
MOVWF INTCON
CLRF FLAGS
; set sent port
CALL SET_PORT_BE
CALL SET_PORTD_IN
BSF PORTE,1 ; set the rd and wr control signal inactive
BCF PORTE,0
MOVLW 01H ; set the first control byte 1;
MOVWF RDorWR
MAINLOOP:
;------------------------------------------------------------------------------------------------------
; adc part 1
MOVLW 0x81 ; f osc/32, adon, not started yet
MOVWF ADCON0
; operate the ADC first
MAIN2:
BCF PIR1,ADIF
BSF ADCON0,GO
CLRWDT
TEST:
BTFSS PIR1,ADIF ;first way to detect conversion is finished
;BTFSC ADCON0,GO ; second method to detect wether it is finished or not
GOTO TEST
MOVFW ADRESH
ANDLW 0X0F
CALL GET_CHAR_CODE
MOVWF DATAout3
BSF STATUS,5 ; bank 1
MOVFW ADRESL
BCF STATUS,5 ; bank 0
MOVWF TEMPE
ANDLW 0X0F
CALL GET_CHAR_CODE
MOVWF DATAout
RRF TEMPE,F
RRF TEMPE,F
RRF TEMPE,F
RRF TEMPE,F
MOVFW TEMPE
ANDLW 0X0F
CALL GET_CHAR_CODE
MOVWF DATAout2
;-------------------------------------------------------------------------------------------------------
; adc part 2
MOVLW 0x89 ; f osc/32, adon, not started yet
MOVWF ADCON0
; operate the ADC SECOUND
BCF PIR1,ADIF
BSF ADCON0,GO
CLRWDT
TEST1:
BTFSS PIR1,ADIF ;first way to detect conversion is finished
;BTFSC ADCON0,GO ; second method to detect wether it is finished or not
GOTO TEST1
MOVFW ADRESH
ANDLW 0X0F
CALL GET_CHAR_CODE
MOVWF DATAoutC
BSF STATUS,5 ; bank 1
MOVFW ADRESL
BCF STATUS,5 ; bank 0
MOVWF TEMPA
ANDLW 0X0F
CALL GET_CHAR_CODE
MOVWF DATAoutA
RRF TEMPA,F
RRF TEMPA,F
RRF TEMPA,F
RRF TEMPA,F
MOVFW TEMPA
ANDLW 0X0F
CALL GET_CHAR_CODE
MOVWF DATAoutB
;-------------------------------------------------------------------------------------------------------
; adc part 2
MOVLW 0x91 ; f osc/32, adon, not started yet
MOVWF ADCON0
; operate the ADC SECOUND
BCF PIR1,ADIF
BSF ADCON0,GO
CLRWDT
TEST2:
BTFSS PIR1,ADIF ;first way to detect conversion is finished
;BTFSC ADCON0,GO ; second method to detect wether it is finished or not
GOTO TEST2
MOVFW ADRESH
ANDLW 0X0F
CALL GET_CHAR_CODE
MOVWF DATAoutZ
BSF STATUS,5 ; bank 1
MOVFW ADRESL
BCF STATUS,5 ; bank 0
MOVWF TEMPB
ANDLW 0X0F
CALL GET_CHAR_CODE
MOVWF DATAoutX
RRF TEMPB,F
RRF TEMPB,F
RRF TEMPB,F
RRF TEMPB,F
MOVFW TEMPB
ANDLW 0X0F
CALL GET_CHAR_CODE
MOVWF DATAoutY
; SENDING THE DATA TO USB MODULE
;--------------------------------------------------------------------------------------------------------------------
;CHANNEL 1
CALL SEND_DATA_CH1 ;SEND DATA
;-----------------------------------------------------------------------------------------------------------------------
;CHANNEL 2
CALL SEND_DATA_CH2 ;SEND DATA
;-----------------------------------------------------------------------------------------------------------------------
;CHANNEL 3
CALL SEND_DATA_CH3 ;SEND DATA
MOVWF RDorWR
GOTO MAINLOOP
INT_SERVICE:
MOVWF W_TEMP ; SAVE W AND STATUS REGISTERS
SWAPF STATUS,W
MOVWF STATUS_T
; BSF PORTC,0 ; AS AN INDICATOR OF PROCESS
; BCF PORTC,0
MOVLW D'6' ; RESET COUNT FOR 6
MOVWF TMR0
BCF INTCON,T0IF ; RESET T0 INT FLAGS
BSF FLAGS,0 ; SET USER FLAG; INT OCCURS
;CALL SEND_USB
MOVLW 00H
MOVWF RDorWR
isr_end
BCF INTCON,INTF
SWAPF STATUS_T,W ; RESTORE W AND STATUS REGISTERS
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
RETFIE