Модераторы: PILOT, ManiaK, Mazzi
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многоканальные непрерывные измерения 
:(
    Опции темы
Gonzo
Дата 8.5.2007, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.0424 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.