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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ADuC814: Работа с АЦП в KEIL, Мой косяк или кейл глючит??? 
:(
    Опции темы
BrAgOl
Дата 28.10.2011, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 6.3.2005
Где: М.О.

Репутация: нет
Всего: нет



Пишу пробный вариант программы для работы с АЦП
(1) Настройка последовательно порта для вывода результатов преобразования
(2) Настройка регистров АЦП
(3) Произвести преобразование
(4) Вывести результат на UART

Вроде все просто, скачал исходники с кейловского сайта для того, что бы разобраться...
Вот мой код:
Код

#include <ADUC814.H>
#include <stdio.h>

void main()
{
    unsigned char chan_2_convert;
    unsigned int conv_val;

/*-----------------------------------------------
Configure the serial port to run at 9600 Baud.
Yeah, this is really slow!
-----------------------------------------------*/
    SCON = 0x50;
    TMOD |= 0x20;
    TH1 = 0xA0;
    TR1 = 1;
    TI = 1; 
/*-----------------------------------------------
Configure the A/D to sequentially convert each
input channel.
-----------------------------------------------*/
    ADCCON1 = 0x8C; // 0000 1100
    ADCCON2 = 0x10; // simple conversion
/*    ADCI = 0;
    ADCSPI = 0;
    CCONV = 0;
    SCONV = 1;
    CS3 = CS2 = CS1 = CS0 = 0;
*/
    printf ("ADCCON1 = 0x%4.4X\r\n", ADCCON1);
    printf ("ADCCON2 = 0x%4.4X\r\n", ADCCON2);

/*-----------------------------------------------
Start a conversion and wait for it to complete.
-----------------------------------------------*/
    chan_2_convert = 0; // (chan_2_convert + 1) % 6;
    while (1)
    {
        ADCCON1 = 0x8C; // 1000 1100 START CONVERSION
        SCONV = 1;
//        printf ("ADCCON1 = 0x%4.4X\r\n", ADCCON1);
//        printf ("ADCCON2 = 0x%4.4X\r\n", ADCCON2);
        while ((ADCCON3 & (1 << 7)) == 1) // ADCCON3 & 0x80
            printf ("Befor conversion: ADC is BUSY\n");
//        printf ("After conversion: ADCCON3 = 0x%4.4X\r\n", ADCCON3);
/*-----------------------------------------------
Read A/D data and print it out.
-----------------------------------------------*/
        conv_val = ADCDATAL | ((ADCDATAH & 0x0F) << 8);
        printf ("ADC Channel %bu = 0x%4.4X\r\n", chan_2_convert, conv_val);
        SCONV = 0;
        ADCCON1 = 0x0C;
    }
}


Теперь о замеченных чудесах:
(1) В регистр ADCCON2 почему-то записывается значение 0х80, вместо 0х10, пытался записать всеми доступными способами.
Выводит 0х80 и при таком варианте
Код

ADCCON2 = 0x10; // simple conversion

И при побитовой адресации
Код

    ADCI = 0;
    ADCSPI = 0;
    CCONV = 0;
    SCONV = 1;
    CS3 = CS2 = CS1 = CS0 = 0;

Дальше вторая беда в цикле, когда выполняется само преобразование. В таком варианте все работает, но стоит только мне убрать из цикла
Код

ADCCON1 = 0x8C; // 1000 1100 START CONVERSION
SCONV = 1;

.......

SCONV = 0;
ADCCON1 = 0x0C;
 
Как программа работать перестает, т.е. результат преобразования 0х0000, даже если я выше стоящие строки возвращаю наместо, что для меня очень странно Оо
Как думаете в чем может быть проблема???
Я больше всего склоняюсь в сторону некорректной записи в регистр ADCCON2, мне кажется от сюда все беды...

ЗЫ для симуляции работы использую ини файл, взятый с кейловского сайта и немного урезанный, он подает входное напряжение
Код

/*-------------------------------------------------------------
This file set the analog inputs for the A/D to different
values depending on the button clicked
-------------------------------------------------------------*/
define float my_VREF;
my_VREF = 2.5

/*-------------------------------------------------------------
Create buttons -to set the analog inputs to 0.
               -to set the analog inputs to VREF.
               -to set different analog inputs.
-------------------------------------------------------------*/

define button "Inputs = 0V" ,          "Set_Inputs(0.0);"
define button "Inputs = High" ,        "Set_Inputs(my_VREF);"
define button "Different A/D Inputs" , "Different_Inputs();"



/*-------------------------------------------------------------
The following functions will set the imputs of the analog
converter to 0, limit, or differnt values
-------------------------------------------------------------*/
func void Set_Inputs (float volt) {
  AIN0 = AIN1 = AIN2 = AIN3 = AIN4 = AIN5 = volt;
}


func void Different_Inputs () {
  AIN0 = 0.2;
  AIN1 = 0.6;
  AIN2 = 1.0;
  AIN3 = 1.3;
  AIN4 = 1.7;
  AIN5 = 2.1;
}

PM MAIL   Вверх
BrAgOl
Дата 2.11.2011, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 6.3.2005
Где: М.О.

Репутация: нет
Всего: нет



Что неужели никто не может наставить на путь истинный)?
Мне что-то начинает казаться, что я где-то ошибся, но упорно не могу найти где...

Немного переделал код, попробовал через прерывания ацп заставить мигать диод и через УАРТ выводить на комп инфу, но на реальной микросхеме не работает, как ни странно за основу взяты примеры с сайтов производителей
Код

#include <ADUC814.H>
#include <stdio.h>

sbit BLINK = P3^3;

void pause (int i)
{
    while ( i > 0 )
        --i;
}

void ADC_int () interrupt 6
{
        printf("\n%02BX%02BX\n", ADCDATAH, ADCDATAL);
        return;
}


void main (void)
{
    int CHAN = 0;
//    unsigned char chan_2_convert;

/*-----------------------------------------------
Configure the serial port to run at 9600 Baud.
-----------------------------------------------*/
    PCON = 0x80;
    PLLCON = 0x30;
    SCON = 0x50;
    TMOD |= 0x20;
    TH1 = 0xF7;
    TR1 = 1;
    TI = 1; 
/*-----------------------------------------------
Configure the A/D to sequentially convert each
input channel.
-----------------------------------------------*/
    ADCCON1 = 0x80;
    ADCCON2 = CHAN;
    EA = 1;
    EADC = 1;

    while (1)
    {    
        SCONV = 1;
        BLINK = ~BLINK;
        pause(10000);        
    }

}


Это сообщение отредактировал(а) BrAgOl - 15.11.2011, 11:23
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

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


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

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

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


 




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


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

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