Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2018-июн-22 04:19

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Проблема с АЦП на МК 1886ВЕ2
СообщениеДобавлено: 2011-апр-08 14:23 
Не в сети

Зарегистрирован: 2010-апр-05 12:37
Сообщения: 7
Здравствуйте! У меня проблема с работой АЦП. После инициализации и включения АЦП - оно начинает работать, но выдает все время фиксированное значение (ADRESL = 0xC0, ADRESH = 0x3F), даже при изменении входного напряжения, за исключением если на вход АЦП подать "0"(ADRESL = 0, ADRESH = 0). Изменение бита ADFM = не влияет на содержимое ADRESL и ADRESH.
Привожу отрывки исходного текста программы:
1)инициализация
void init_adc()
{
DDRF = 0xFF;
ADCON1 = 0xA0;
ADFM = 0;
ADCON0 = 0x00;
ADIF = 0;
}

2) запуск
if(vzb.flag_um_adc)
{
ADON = 1;
PCFG3 = 0;
PCFG2 = 0;
PCFG1 = 0;
#asm
bsf ADCON0, 4;
bsf ADCON0, 5; //выбор наомера канала
bcf ADCON0, 6; // второй канал
bcf ADCON0, 7;
#endasm
for(count_2 = 0; count_2 < 0xF89; count_2++)
{
#asm
nop;
#endasm
}
for( ; ; )
{
if(ADCON0.2 == 0)
{
#asm
bsf ADCON0, 2; //старт
#endasm
break;
}
}
if(ADCON0.2 == 1)
{
;
}
else
{
#asm
bsf ADCON0, 2; //старт
#endasm
}
}

3) прерывание
void ADC_vect()
{
vzb.end_convert = 1;
ADON = 0;
PCFG3 = 1;
PCFG2 = 1;
PCFG1 = 1;
adc_data = 0;
adc_data.low8 = ADRESL;
adc_data.high8 = ADRESH;
GLINTD = 0; //разрешаю глобальные прирывания
}

4) после считывания обнуляю регистры данных АЦП, дальше обрабатываю полученные данные и вывожу их по уарту на ПК


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с АЦП на МК 1886ВЕ2
СообщениеДобавлено: 2011-апр-08 16:55 
Не в сети

Зарегистрирован: 2009-май-25 15:07
Сообщения: 158
Откуда: АО "ПКК Миландр"
Lakec писал(а):
Здравствуйте! У меня проблема с работой АЦП. После инициализации и включения АЦП - оно начинает работать, но выдает все время фиксированное значение (ADRESL = 0xC0, ADRESH = 0x3F), даже при изменении входного напряжения, за исключением если на вход АЦП подать "0"(ADRESL = 0, ADRESH = 0). Изменение бита ADFM = не влияет на содержимое ADRESL и ADRESH.
Привожу отрывки исходного текста программы:
1)инициализация
Код:
void init_adc()
{
   DDRF = 0xFF;
   ADCON1 = 0xA0;
   ADFM = 0;
   ADCON0 = 0x00;
   ADIF = 0; 
}

2) запуск
       if(vzb.flag_um_adc)
        {
          ADON = 1;
          PCFG3 = 0;
          PCFG2 = 0;
          PCFG1 = 0;
          #asm
          bsf ADCON0, 4;
          bsf ADCON0, 5;   //выбор наомера канала
          bcf ADCON0, 6;   // второй канал
          bcf ADCON0, 7;
          #endasm
          for(count_2 = 0; count_2 < 0xF89; count_2++)
         {
           #asm
           nop;
           #endasm
          }
          for( ; ; )
         {
    if(ADCON0.2 == 0)
               {
       #asm
              bsf ADCON0, 2;   //старт
              #endasm
              break;
    }
          }    
         if(ADCON0.2 == 1)
         {
       ;
          }
          else
          {
    #asm
           bsf ADCON0, 2;   //старт
           #endasm
           }
      }     

3) прерывание
void ADC_vect()
{
    vzb.end_convert = 1;
    ADON = 0;
    PCFG3 = 1;
    PCFG2 = 1;
    PCFG1 = 1;
    adc_data = 0;
    adc_data.low8 = ADRESL;
    adc_data.high8 = ADRESH;
    GLINTD = 0; //разрешаю глобальные прирывания
}

4) после считывания обнуляю регистры данных АЦП, дальше обрабатываю полученные данные и вывожу их по уарту на ПК

Уж слишком Вы все усложнили.
Без прерываний:
Код:
  ADCON1 = 0b01101100; // set analog input, Fc/32
  ADCON0 = 0b00000000; // AD0
  ADON = 1; // ADC on
  GO_DONE = 1; // Start ADC
  while(1){ // main loop
     while(GO_DONE) {};
     adc_data.low8 = ADRESH;
     adc_data.high8 = ADRESL;
     GO_DONE = 1; // Start ADC
     ...
  }

В процедуре прерывания категорически нельзя разрешать глобальные прерывания. Это автоматически делается при выходе из прерывания скрытой компилятором командой RETFIE. Если используется прерывание от АЦП, то необходимо сбросить флаг ADIF, иначе прерывания будут происходить постоянно.
Задержка командой NOP в цикле при наличии прерываний будет непредсказуемой. Используйте таймеры.
Смотрите примеры использования периферии в директории Examples в IDE1886 на нашем сайте.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 2011-апр-11 13:47 
Не в сети

Зарегистрирован: 2010-апр-05 12:37
Сообщения: 7
Я перестал програмно сбрасывать GLINTD, флаг ADIF - я сбрасываю в сервере прерываний, для задержек стал использовать таймер, видно что АЦП работает, но результаты преобразований неизменились. Напряжение питания МК +5В и складывается оущущение, что вход АЦП подтянут через сопротивление к питанию,может поэтому выдается фиксированное значение?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с АЦП на МК 1886ВЕ2
СообщениеДобавлено: 2012-май-14 14:59 
Не в сети

Зарегистрирован: 2012-апр-19 08:47
Сообщения: 8
Здравствуйте. Пытаюсь разобраться с АЦП на демоплате, вроде все как в описании но в ответ тишина=( подскажите ошибку?? программа по нажатии кнопки SW4 запускает преобразование и отображает на линейку светодиодов (PF)

Еще не очень понял с настройкой выходов, если в ADCON1 например PF указан в числе аналоговых входов, для вывода в него данных мне надо менять и ADCON1 или хватит CLRF DDRF,F ??
код:
; ****************************************************
; PE0-PE3 (вх.) подключены 4 клавиши, SW4 управляющая
; PF0-PF7 (вых.) подключена линейка светодиодов
; AN2(PG1) - аналоговый вход АЦП
; ****************************************************
Include 1886ve2m.INC
radix dec
WORK EQU 024H; задержка Chold
DL_ADC EQU 025H; буфер для младшего байта данных с АЦП
DH_ADC EQU 022H; буфер для старшего байта данных с АЦП
ORG 0000H
Start: BSF CPUSTA,GLINTD; запрет всех прерываний
CLRF BSR,F; установка SFR и GPR Bank 0
;---Начальная установка портов--
MOVLB 01H; установка SFR Bank 1
SETF DDRE,F; PORTE - входы
MOVLB 05H; установка SFR Bank 5
CLRF PORTG,F; сброс порт G
MOVLW 42H;
MOVWF DDRG; настройка вх/вых 1,6 - входы для работы АЦП

M5: BTFSC PORTE,1 ; если бит 1 порта Е=0 то след команд пропускается
GOTO M10
;---Начальная установка АЦП--
MOVLW 4AH;
MOVWF ADCON1; 01001010
MOVLW 21H;
MOVWF ADCON0; 00100001
;-------------прерывание от АЦП------------------------
; BSF INTSTA,PEIE ;разрешение периферийных прерываний
; BSF PIE2,ADIE ;разрешение прерываний по окончанию преобразования АЦП
BCF CPUSTA,GLINTD; разрешение прерываний

;--------пауза ~20 мкс для заряда входной емкости АЦП----
M3: MOVLW 26
MOVWF WORK
M1: DECFSZ WORK,F
CLRWDT ; сброс "сторожевого таймера"
GOTO M1
;---------------------------------------------
BSF ADCON0,GO/DONE
; Проверка окончания преобразования АЦП.
MOVLB 04H; установка SFR Bank 4
M2: BTFSS PIR2,ADIF; проверка флага окончания преобразования АЦП (SFR Bank 4)
CLRWDT ; сброс "сторожевого таймера"
GOTO M2
BCF PIR2,ADIF; сброс флага окончания преобразования АЦП
MOVLB 05H; установка SFR Bank 5
MOVPF ADRESL,DL_ADC; пересылка младшего байта данных с АЦП в буферную ячейку
MOVPF ADRESH,DH_ADC; пересылка старшего байта данных с АЦП в буферную ячейку
BCF ADCON0,ADON; выключение модуля АЦП

M10: MOVLB 05H; установка SFR Bank 5
MOVLW 4EH;
MOVWF ADCON1; 01001110
SETF PORTF,F; сброс порта PORTF
CLRF DDRF,F; PORTF - выходы
MOVPF DH_ADC,PORTF; вывод результата на светодиоды
CLRWDT ; сброс "сторожевого таймера"
GOTO M5
END


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с АЦП на МК 1886ВЕ2
СообщениеДобавлено: 2012-май-15 09:57 
Не в сети

Зарегистрирован: 2009-май-25 15:07
Сообщения: 158
Откуда: АО "ПКК Миландр"
Для начала я бы посоветовал открыть описание системы команд и постараться понять, что не так в Вашем коде:
Код:
M1:     DECFSZ WORK,F
        CLRWDT ; сброс "сторожевого таймера"
        GOTO M1 
....
M2: BTFSS PIR2,ADIF; проверка флага окончания преобразования АЦП (SFR Bank 4)
    CLRWDT ; сброс "сторожевого таймера"
    GOTO M2


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с АЦП на МК 1886ВЕ2
СообщениеДобавлено: 2012-май-15 10:48 
Не в сети

Зарегистрирован: 2012-апр-19 08:47
Сообщения: 8
Да, вчера протупил.. вначале было без сброса, потом, когда не заработало, уже начал расставлять не думая куда :roll: Сегодня поубирал, но пока не вышло.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблема с АЦП на МК 1886ВЕ2
СообщениеДобавлено: 2012-май-17 07:55 
Не в сети

Зарегистрирован: 2012-апр-19 08:47
Сообщения: 8
все, разобрался:
- ошибся в команде, перепутал MOVPF и MOVFP;
- в описании ( spec_1886BE2(BE1).pdf ) бит запуска АЦП назван GO/DONE а в 1886ve2m.INC описаны GO, NOT_DONE и DONE.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB