|
Вопросы по ADuC7061 |
|
|
|
Nov 13 2010, 04:36
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 10-10-07
Из: Челябинск
Пользователь №: 31 206

|
Здравствуйте! Никак не удается запустить АЦП в ADuC7061. В регистре ADCSTA постоянно установлен бит ADC0CERR. Бит завершения преобразования ADC0RDY устанавливается, значит АЦП работает. На входе около 1,3В, опроное напряжение выбрано AVDD (2,5В). В чем может быть проблема? Настройка АЦП приведена ниже.
//-------------- Установка необходимой частоты генератора ------------------ POWKEY1 = 0x1; POWCON0 = 0x78; //Set core to max CPU //speed of 10.24 MHz POWKEY2 = 0xF4;
//------------- Настройка АЦП ----------------------- // Configure ADC0 for continuous conversions, 1Khz, AIN0 in Single-ended mode ADCFLT = 0x7; // Chop off, 1Khz samping rate, SF = 7. No averaging ADCMDE = BIT0 + BIT7; // Continuous Conversion mode, Normal mode, 4Mhz clock source to ADC. ADC0CON = // Gain = 1, Buffer on. BIT4 + BIT5 + //(AVDD, AGND) reference BIT6 + // AIN0 selected in Single ended mode BIT10 + // Unipolar ADC input BIT12 + // ------------------------------ опорное напряжение выше 1,35В BIT15; // Primary channel ADC enable. ADCCFG = 0;
|
|
|
|
|
 |
Ответов
|
Nov 19 2010, 04:12
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 10-10-07
Из: Челябинск
Пользователь №: 31 206

|
Привожу текст программы, которую сейчас ковыряю. Данная программа взята из примеров, но почему-то без дополнительных костылей не работает. Как уже говорил ранее, UART отсылает первые 2 байта из массива szTemp[] и умолкает, хотя прерывания генерируются. CODE // Bit Definitions #define BIT0 0x01 #define BIT1 0x02 #define BIT2 0x04 #define BIT3 0x08 #define BIT4 0x10 #define BIT5 0x20 #define BIT6 0x40 #define BIT7 0x80 #define BIT8 0x100 #define BIT9 0x200 #define BIT10 0x400 #define BIT11 0x800 #define BIT12 0x1000 #define BIT13 0x2000 #define BIT14 0x4000 #define BIT15 0x8000 #include <Analogdevices/ioaduc7061.h> # include "stdio.h" # include "string.h" #include <intrinsics.h> #include <arm_interrupt.h> volatile unsigned char bSendResultToUART = 0; // Flag used to indicate ADC0 resutl ready to send to UART unsigned char szTemp[16] = ""; // Used to store ADC0 result before printing to UART unsigned char ucTxBufferEmpty = 0; // Used to indicate that the UART Tx buffer is empty volatile unsigned long ulADC0Result = 0; // Variable that ADC0DAT is read into in ADC0 IRQ float V; int main(void) { unsigned char i = 0; unsigned char nLen = 0; POWKEY1 = 0x1; POWCON0 = 0x78; // Set core to max CPU speed of 10.24Mhz POWKEY2 = 0xF4; // Initialize the UART for 9600-8-N GP1CON = BIT0 + BIT4; // Select UART functionality for P1.0/P1.1 COMCON0 = BIT7; // Enable access to COMDIV registers COMDIV0 = 0x21; // Set baud rate to 9600. COMDIV1 = 0x00; //COMDIV2 = 0x21 + BIT11; // Enable fractional divider for more accurate baud rate setting COMCON0 = BIT0 + BIT1 + BIT2; COMIEN0 = BIT0 + BIT1; // Enable UART interrupts when Rx full and Tx buffer empty. // Configure ADC0 for continuous conversions, 1Khz, AIN0 in Single-ended mode ADCMSKI = BIT0; // Enable ADC0 result ready interrupt source ADCFLT = 0x7; // Chop off, 1Khz samping rate, SF = 7. No averaging ADCMDE = BIT0 + BIT7; // Continuous Conversion mode, Normal mode, 4Mhz clock source to ADC. ADC0CON = BIT4 + BIT6 + BIT7 + BIT8 + // AIN0 selected in Single ended mode BIT10 + // Unipolar ADC output BIT15; // Gain = 1, Buffer on. Also, Int reference, ADCCFG = 0; IRQEN = BIT10 + BIT11; // Enable ADC and UART interrupts __enable_interrupt(); bSendResultToUART = 0; while (1) {
if (bSendResultToUART == 1) // Is there an ADC0 result ready for UART transmission? { sprintf ( (char*)szTemp, "%lu\r",ulADC0Result ); // Send the ADC0 Result to the UART nLen = strlen((char*)szTemp); for ( i = 0 ; i < nLen ; i++ ) // loop to send ADC0 result { COMTX = szTemp[i]; ucTxBufferEmpty = 0; while (ucTxBufferEmpty == 0) } } } } #pragma vector = 0x18 __irq __arm void IRQ_Handler(void) { unsigned long IRQSTATUS = 0; unsigned char ucCOMIID0 = 0;
IRQSTATUS = IRQSTA; // Read off IRQSTA register if ((IRQSTATUS & BIT11) == BIT11) //UART interrupt source { ucCOMIID0 = COMIID0; if ((ucCOMIID0 & 0x2) == 0x2) // Transmit buffer empty { ucTxBufferEmpty = 1; } }
if ((IRQSTATUS & BIT10) == BIT10) //If ADC0 interrupt source { ulADC0Result = ADC0DAT; // Read ADC0 conversion result bSendResultToUART = 1; } } Оказалось, причина умолкания UARTа в том, что регистр COMRX нигде не считывался, соответственно, флаг прерывания по приему не сбрасывался и программа крутилась в прерывании по UART. Вот, что добавил: if ((ucCOMIID0 & 0x4) == 0x4) // Receive buffer empty { V=COMRX; } Теперь вопрос. Как организовать прием и обработку 9-ого бита данных?
Сообщение отредактировал IgorKossak - Nov 19 2010, 07:33
Причина редактирования: Пользуйтесь тэгами
|
|
|
|
|
Nov 19 2010, 10:19
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (gmp @ Nov 19 2010, 06:12)  Привожу текст программы, которую сейчас ковыряю. 1) ucTxBufferEmpty должен быть volatile. 2) CODE COMTX = szTemp[i]; ucTxBufferEmpty = 0; while (ucTxBufferEmpty == 0); попробуйте переделать в CODE ucTxBufferEmpty = 0; COMTX = szTemp[i]; while (ucTxBufferEmpty == 0); или CODE while (ucTxBufferBusy == 1); ucTxBufferBusy = 1; COMTX = szTemp[i]; QUOTE (gmp @ Nov 19 2010, 06:12)  Данная программа взята из примеров Такими примерами лучше не пользоваться. QUOTE (gmp @ Nov 19 2010, 06:12)  Теперь вопрос. Как организовать прием и обработку 9-ого бита данных? Понятия не имею. Может кто-то другой подскажет, или придется вам перечитывать даташит и думать, думать, думать...
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
gmp Вопросы по ADuC7061 Nov 13 2010, 04:36 AHTOXA Цитата(gmp @ Nov 13 2010, 09:36) На входе... Nov 13 2010, 07:45 gmp Сконфигурировал на подачу внешней опоры(установил ... Nov 13 2010, 08:49 AHTOXA Хм. А куда у вас подключен ADC5? Nov 13 2010, 15:34 gmp Никуда не подключен. Он разве не относительно нуля... Nov 14 2010, 04:47 AHTOXA Да фиг его знает. В даташите написано:
Цитата[0001... Nov 14 2010, 07:12 gmp Да пробовал уже, ошибка и все. Попробовал включить... Nov 14 2010, 16:28 AHTOXA А с внутренней опорой - работает? Nov 14 2010, 22:25 gmp В однополярном режиме от внутренней опоры тоже не ... Nov 15 2010, 02:58 gmp Сегодня скачал Keil, там вообще все по другому раб... Nov 15 2010, 11:58 AHTOXA Но программа-то нормально заливается? Сделайте как... Nov 15 2010, 15:56 gmp Программа компилится и заливается нормально. В под... Nov 16 2010, 03:02 gmp Сегодня наконец-то удалось запустить АЦП. Измерени... Nov 17 2010, 05:06 Сергей Борщ QUOTE (gmp @ Nov 17 2010, 07:06) в регист... Nov 17 2010, 07:46 gmp Если вы про окно "Register", то перехода... Nov 17 2010, 09:40 Сергей Борщ QUOTE (gmp @ Nov 17 2010, 11:40) Может гд... Nov 17 2010, 11:12 gmp Добавил #pragma vector = 0x18, если на этот адрес ... Nov 18 2010, 03:15 Сергей Борщ QUOTE (gmp @ Nov 18 2010, 05:15) Бит I в ... Nov 18 2010, 11:31 gmp Да, спасибо, я уже проделал данные манипуляции (до... Nov 18 2010, 13:28 Сергей Борщ QUOTE (gmp @ Nov 18 2010, 15:28) Кстати, ... Nov 18 2010, 13:42  gmp Цитата(Сергей Борщ @ Nov 18 2010, 18:42) ... Nov 18 2010, 15:58 gmp Я пример этот взял, чтобы можно было на что-то опи... Nov 19 2010, 11:21 gmp Привожу кусок кода с обработкой 9-ого бита, может ... Nov 24 2010, 04:56
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|