| ??? 01/06/08 20:47 Read: times |
#149093 - Check my External Interrupt code |
Hi!
I am currently working on a project where I have to interface 10 ADC0804 analog to digital converters to an AT89C51AC2 microcontroller. The ADCS are digitizing an analog signal provided from 5 ADXL202 accelerometers. The Adc0804 are Tristate devices and are activated with a low signal on their CS pin. For know I have built a circuit comprising a single adxl202 accelerometer where its X axis analog out is feeded to an adc804 which in turn is interfaced to the 8051 micro.The micro is then interface to PC through serial port. The program I have coded is supposed to send the following through serial: N0!N1$N2&N3*N4(N5@N6#N7&N8!N9&N0!N1~.....etc etc Note that !$&* i.e. the symbol after say N0, is the ascii equivalent character sample sent from accelerometer number 0 and so on and so forth. Please could you tell me what I am doin g wrong? The circuit is properly built as I have coded a previous version of the program withought using interrupts and setting up the adc to continously convert the digital data from the accelerometer into a digital value, altough some samples where being lost (hence the use of the interrupts). Thanks in advance for any help. Kai Busuttil Industrial Electronics Student ;PROGRAM MODIFIED TO USE EXTERNAL INTERRUPT INT0
;NOTE: MAKE SURE TO MODIFY BREADBOARD WIRING!!<-OK
ORG 0000H
LJMP MAIN ;DO JUMP TO AVOID GETTING A 'RET ASSEMBLY ERROR' ON PROGRAM STARTUP
ORG 0003H ;STANDARD EXTERNAL INTERRUPT INT0 ENTRY POINT
EXTINT0:
MOV A,P0
SETB P3.7 ;HIGH TO LOW TRANSITION TO CLR INTERRUPT LINE AND ENABLE OUTPUT LATCHES
CLR P3.7 ;NOTE: P3.7 = RD PIN ON 8051
LCALL TX_BYTE
POP ACC
RR A
INC R0
CJNE R0,#9,N0N7
LCALL N8N9
LJMP N0N7
RETI
ORG 0030H ;STANDARD MAIN PROGRAM ENTRY POINT (WHEN USING INTERRUPTS)
MAIN:
MOV SP,#256-32
MOV SCON,#01010000B
MOV TMOD,#00100101B ;T1=MODE 2(8-BIT AUTO RELOAD MODE),TIMER
MOV PCON,#10000000B ;TURN SMOD HIGH (DOUBLE BAUD)
MOV TH1,#0FH ;TH1 = 256 - ((Crystal / 192) / Baud) WHEN SMOD HIGH
MOV TL1,#0BH ;TH1 = 256 - ((18.432E6 / 192) / 19200 ) = 251
;THEREFORE AT TH1=256 BAUD RATE = 19200
MOV IE,#01H ;ENABLE EXTERNAL TIMER ZERO INTERRUPT (INT0)
SETB EA ;ENABLE GLOBAL INTERRUPT BIT IN IE REGISTER (OR SFR)
SETB IT0 ;SET IT0 IN TCON SFR TO MAKE INT0 -VE EDGE TRIGGERED <BE SURE>
MOV A,#01111111B ;ENABLE N7 ADC
MOV P2,#11111111B
MOV R0,#1
N0N7:
;FIRST 8 ADCS (N0 TO N7)
PUSH ACC
MOV P1,A
JNB P1.0,HERE
JNB P1.1,HERE2
JNB P1.2,N5
JNB P1.3,N4
JNB P1.4,N3
JNB P1.5,N2
JNB P1.6,N1
JNB P1.7,N0
CONT: SETB P3.6 ;HIGH TO LOW PULSE TO ADC0804 WR PIN
CLR P3.6
NOP
NOP
SETB P3.6 ;LOW TO HIGH PULSE TO ADC0804 WR PIN (START CONVERSION)
SJMP $
HERE:
LJMP N7
HERE2:
LJMP N6
N0:
MOV A,#'N'
CALL TX_BYTE
MOV A,#'0'
CALL TX_BYTE
LJMP CONT
N1:
MOV A,#'N'
CALL TX_BYTE
MOV A,#'1'
CALL TX_BYTE
LJMP CONT
N2:
MOV A,#'N'
CALL TX_BYTE
MOV A,#'2'
CALL TX_BYTE
LJMP CONT
N3:
MOV A,#'N'
CALL TX_BYTE
MOV A,#'3'
CALL TX_BYTE
LJMP CONT
N4:
MOV A,#'N'
CALL TX_BYTE
MOV A,#'4'
CALL TX_BYTE
LJMP CONT
N5:
MOV A,#'N'
CALL TX_BYTE
MOV A,#'5'
CALL TX_BYTE
LJMP CONT
N6:
MOV A,#'N'
CALL TX_BYTE
MOV A,#'6'
CALL TX_BYTE
LJMP CONT
N7:
MOV A,#'N'
CALL TX_BYTE
MOV A,#'7'
CALL TX_BYTE
LJMP CONT
N8:
MOV A,#'N'
CALL TX_BYTE
MOV A,#'8'
CALL TX_BYTE
RET
N9:
MOV A,#'N'
CALL TX_BYTE
MOV A,#'9'
CALL TX_BYTE
RET
N8N9: ;LAST 2 ADCS (N8 AND N9
MOV P1,#11111111B
MOV P2,#01111111B
LCALL N8
MOV A,P0
CALL TX_BYTE
MOV P2,#10111111B
LCALL N9
MOV A,P0
MOV A,#01111111B
MOV P2,#11111111B
MOV R0,#1
RET
TX_BYTE:
PUSH IE
CLR TI
MOV SBUF,A
JNB TI,$
CLR TI
POP IE
RET
END
|
| Topic | Author | Date |
| Check my External Interrupt code | 01/01/70 00:00 | |
| new question about external interrupt code | 01/01/70 00:00 | |
| Scarry Type ISR Programming | 01/01/70 00:00 | |
| Problem solved...almost... | 01/01/70 00:00 | |
| Bogus Interrupt Usage | 01/01/70 00:00 | |
| An alternative to your solution? | 01/01/70 00:00 | |
set a trap and walk right into it | 01/01/70 00:00 | |
| A comment on comments | 01/01/70 00:00 |



