Новичок
Профиль
Группа: Участник
Сообщений: 5
Регистрация: 8.5.2007
Репутация: нет Всего: нет
|
Делаю курсач по микропроцессорным устройствам. Надо было разаботать ИИУС. Разработал, не проблема, а вот на программирование - режим многоканальных непрерывных измерений АЦП, опрос по флагу готовности (ADBSY). Контроллер С167. Проблема в том, что не сбрасывается этот флаг и программа циклиться. Может быть кто-нибудь знает где ошибка? | Код | ;============================================================================== ;Аналого-цифровое преобразование: ;режим - непрерывное многоканальное преобразование, опрос по флагу занятости (5.05.07) ;------------------------------------------------------------------------------ JMPA cc_UC, Main ;------------------------------------------------------------ L_Stop: NOP ;пустая операция ;------------------------------------------------------------ ORG 1000h Nmeg EQU 64 ;число циклов преобразования
ADCONVal DW 0000000000110001b ;Код управления: поле 3..0 ? номер 2-ого канала, ;поле 5..4 - режим работы(многоканальное ;непрерывное преобразование), ;поле 13..12 - время выборки, ;поле 15..14 - время преобразования NUmax DW 2048 ;максимальный код напряжения Umax DW 10000 ;максимальный код напряжения в мВ L_NUK0: DSW 32 ;память под измеренные значения канала 0 L_NUK1: DSW 32 ;память под измеренные значения канала 1 L_UK0: DSDW 32 ;память под измеренные значения канала 0 в мВ L_UK1: DSDW 32 ;память под измеренные значения канала 1 в мВ ;------------------------------------------------------------ INITADC: ;Инициализация ADC BCLR ADCIE ;запрет прерываний MOV ADCON, ADCONVal ;(ADCON)<-(ADCONVal) RET ;возврат ;------------------------------------------------------------ CalcNUToU: ;Вычисление напряжения в мВ - вычисление выражения U=NU*Umax/NUmax ;-------------------------- ;чтение параметров из стека MOV R2, [R0+] ;(R2)<-((R0)) - адрес массива измерений по каналу 1 в мВ в R2 MOV R1, [R0+] ;(R1)<-((R0)) - адрес массива измерений по каналу 1 R1 MOV R4, [R0+] ;(R4)<-((R0)) - адрес массива измерений по каналу 0 в мВ в R4 MOV R3, [R0+] ;(R3)<-((R0)) - адрес массива измерений по каналу 0 R3 MOV R7, [R0+] ;(R7)<-((R0)) - NUmax в R7 MOV R8, [R0+] ;(R8)<-((R0)) - Umax в R8 MOV R9, [R0+] ;(R8)<-((R0)) - Nmeg в R9 ;-------------------------- ;цикл пересчёта L_CalcNUToU1: MOV R6, [R1+] ;(R6)<-((R1)), (R1)<-(R1)+2 MULU R6, R8 ;(MD)<-(R6)*(R8), умножение без знака DIVLU R7 ;(MDL)<-(MD) div (R7), (MDH)<-(MD) mod (R7) - ;деление без знака MOV [R2],MDH ;((R2))<-(MDH) - остаток ADD R2, #2 ;(R2)<-(R2)+2 -адрес ст. слова в R2 MOV [R2], MDL ;((R2))<-(MDL) - целая часть ADD R2, #2 ;(R2)<-(R2)+2 - дрес мл. слова след эл. в R2
MOV R6, [R3+] ;(R6)<-((R3)), (R3)<-(R3)+2 MULU R6, R8 ;(MD)<-(R6)*(R8), умножение без знака DIVLU R7 ;(MDL)<-(MD) div (R7), (MDH)<-(MD) mod (R7) - ;деление без знака MOV [R4],MDH ;((R2))<-(MDH) - остаток ADD R4, #2 ;(R4)<-(R4)+2 -адрес ст. слова в R4 MOV [R4], MDL ;((R4))<-(MDL) - целая часть ADD R4, #2 ;(R4)<-(R4)+2 - дрес мл. слова след эл. в R4
SUB R9, #1 ;(R9)<-(R9)-1
JMPA cc_NZ, L_CalcNUToU1 ;если больше 0, то переход на метку L_CalcNUToU1 ;-------------------------- RET ;возврат ;------------------------------------------------------------ Main: MOV SP,STKUN ;(SP)<-(STKUN) - установка указателя стека CALLA CC_UC, INITADC ;инициализация ADC MOV R11, #L_NUK0 ;адрес массива измерений по 0 каналу в R11 MOV R12, #L_NUK1 ;адрес массива измерений по 1 каналу в R12 XOR R10, R10 ;очистка регистра R10 MOV R10, #Nmeg ;(R10)<- Nmeg, Nmeg количество циклов ; преобразования BSET ADCON.7 ;запуск преобразования ;--------------------------------------------------------------------------------------------- ;Цикл ожидания завершения преобразования Wait: JB ADBSY, Wait ;-------------------------------------------------------------------------------------------- MOV R0, ADDAT ;(R0)<-(ADDAT) - результат преобразования в R0 XOR ADDAT, ADDAT MOV R15, R0 SHR R15, #12 ;сдвиг вправо на 12 разрядов содержимого R15(выделение ;номера канала из результата преобразования) AND R0, #0000001111111111b ;(R0)<-(R0) and 0000 0011 1111 1111b - ;очистка поля с номером канала
CMP R15, #0 ;проверка с какого канала произошло преобразование JMPA cc_Z, L_K0 ; если преобразование произошло по каналу 0 то переход ;на метку L_K0 CMP R15, #1 ;проверка с какого канала произошло преобразование JMPA cc_Z, L_K1 ;если преобразование произошло по каналу 1 то переход ;на метку L_K1 JMPA cc_UC, Wait ;безусловный переход на метку L_ADCINTPROC1
L_K0: MOV [R11], R0 ;((R11))<-(R0) - код напряжения в массив ADD R11, #2 ;(R11)<-(R11)+2 - адрес след элемента массива в R11 JMPA cc_UC, EndZapisi ;безусловный переход на метку EndZapisi L_K1: MOV [R12], R0 ;((R12))<-(R0) - код напряжения в массив ADD R12, #2 ;(R12)<-(R12)+2 - адрес след элемента массива в R12 JMPA cc_UC, EndZapisi ;безусловный переход на метку EndZapisi
EndZapisi: SUB R10, #1 ;(R10)<-(R10)-1 JMPA cc_NZ, Wait ;если больше 0, то переход на метку WaitEnd BCLR ADST ;(ADST)=0 - конец преобразования ;--------------------------------------------------------------------------------------------- ;Пересчёт NU в U ;--------------------------------------------------------------------------------------------- ;Запись параметров в стек MOV R0, #Nmeg ;(R0)<- Nmeg, Nmeg - количество измерений SHR R0, #1 PUSH R0 ;R0 в стек MOV R0, Umax ;(R0)<-(Umax) PUSH R0 ;R0 в стек MOV R0, NUmax ;(R0)<-(NUmax) PUSH R0 ;R0 в стек MOV R0, #L_NUK0 ;адрес массива измерений по каналу 0 в R0 PUSH R0 ;R0 в стек MOV R0, #L_UK0 ;адрес массива измерений по каналу 0 в мВ в R0 PUSH R0 ;R0 в стек MOV R0, #L_NUK1 ;адрес массива измерений по каналу 1 в R0 PUSH R0 ;R0 в стек MOV R0, #L_UK1 ;адрес массива измерений по каналу 1 в мВ в R0 PUSH R0 ;R0 в стек MOV R0, SP ;(R0)<-(SP) ;-------------------------- CALLA cc_UC, CalcNUToU ;вызов процедуры пересчёта ;-------------------------------------------------------------------------------------------- JMPA cc_UC, L_Stop ;безусловный переход на метку L_Stop ;--------------------------------------------------------------------------------------------- End
|
Это сообщение отредактировал(а) Gonzo - 8.5.2007, 23:40
|