??? 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 |