Перейти к содержанию
    

gmp

Участник
  • Постов

    26
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о gmp

  • Звание
    Участник
    Участник
  • День рождения 30.09.1984

Информация

  • Город
    Array
  1. Посмтрите эту тему, может чем-то поможет. Ссылка
  2. Освоение ADuC7060

    Сам недавно начал осваивать ADUC7061. У вас разрешены прерывания по таймеру IRQEN |= 0x10; // Enable Timer1 interrupt source А обработка прерывания описана в программе? Если нет, то контроллер "крутится" по адресу 0x4 "Undefined instruction" и в "main" не попадет.
  3. Вопросы по ADuC7061

    Привожу кусок кода с обработкой 9-ого бита, может кому пригодится. Здесь 0x81, 0x3F и 0xC2 это адресные байты, которые мне надо обрабатывать. У вас могут быть свои. // Initialize the UART for 9600-9-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; COMCON0 = BIT0 + BIT1 + BIT3+BIT4 COMIEN0 = BIT0 + BIT1; // Enable UART interrupts when Rx full and Tx buffer empty. // Прерывания #pragma vector = 0x18 __irq __arm void IRQ_Handler(void) { unsigned long IRQSTATUS = 0; unsigned char ucCOMIID0 = 0; unsigned char ucCOMSTA0 = 0; unsigned char UDR_t; IRQSTATUS = IRQSTA; // Read off IRQSTA register if ((IRQSTATUS & BIT11) == BIT11) //UART interrupt source { ucCOMIID0 = COMIID0; if ((ucCOMIID0 & 0x4) == 0x4) // Receive buffer empty { UDR_t=COMRX; ucCOMSTA0=COMSTA0; if (((ucCOMSTA0 & 0x4) == 0x4)&&((UDR_t==0x81)||(UDR_t==0x3F))) bit9=1; else if (((ucCOMSTA0 & 0x4) != 0x4)&&(UDR_t==0xC2)) bit9=1; else bit9=0; .................... } } }
  4. Вопросы по ADuC7061

    Я пример этот взял, чтобы можно было на что-то опираться при обсуждении возникающих вопросов. Мне кажется, что не удобно приводить куски кода с кучей непонятных переменных, а здесь все просто. Сейчас сделал обработку 9-ого бита. Все работает пока идут запросом, например только четные байты, если приходит нечетный байт, то происходит перенастройка регистра, который определяет установлен ли 9-ый бит. при этом на этот запрос ответа не получаем. На следующий нечетный байт мы нормально отвечаем, это длится пока идут нечетные байты. Картина повторяется при приходе четного байта. Из-за потерь на перенастройку у головного устройства возникают ошибки по неответам - это плохо. Сейчас думаю как все поправить. Код пока не привожу, т.к. там сейчас черт ногу сломит.
  5. Вопросы по ADuC7061

    Привожу текст программы, которую сейчас ковыряю. Данная программа взята из примеров, но почему-то без дополнительных костылей не работает. Как уже говорил ранее, UART отсылает первые 2 байта из массива szTemp[] и умолкает, хотя прерывания генерируются. // 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-ого бита данных?
  6. Вопросы по ADuC7061

    Да я понимаю, просто в данный момент программы нет под рукой :)))
  7. Вопросы по ADuC7061

    Да, спасибо, я уже проделал данные манипуляции (добавил функцию enable_interrupt()). Но в ломаной версии IAR5, прерывания не заработали. Скачал новый v. 6.10, 32K Kickstart Edition. Там прерывания заработали. Кстати, как вы и говорили, если в дебагере смотреть регистры прерывания, то получаются некорректные результаты. И в обработчике прерывания нужно обязательно прописывать #pragma vector = 0x18, иначе не работает, хотя в примерах от самого IAR нет ни enable_interrupt(), ни #pragma vector = 0x18. Теперь настраиваю UART в 8-ми битном режиме, потом нужно будет как-то 9-ти битный режим запускать. Пока из массива в несколько байт, UART передает только первые 2 и умолкает.
  8. Вопросы по ADuC7061

    Добавил #pragma vector = 0x18, если на этот адрес поставить точку останова - туда программа НЕ попадает. Бит I в CPSR установлен в 1, хотя я его не устанавливал. Куда еще глянуть?
  9. Вопросы по ADuC7061

    Если вы про окно "Register", то перехода на обработку прерывания не происходит, хоть при открытом, хоть при закрытом окне. Может где-то нужно вектора прописывать? Кусок с прерываниями взял из примера. Вотподключенные файлы и разрешение прерываний: #include <Analogdevices/ioaduc7061.h> # include "stdio.h" # include "string.h" #include <intrinsics.h> IRQEN = BIT10 + BIT11; // Enable ADC and UART interrupts Вот описание обработки, но IAR сюда не переходит: __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; } }
  10. Проблемы с IRQ в IAR

    Тоже самое было у меня, правда проц ADuС. Программа постоянно крутилась в Abort_handler. Запустил проект из примера, там все работало. Установил в своем проекте все настройки, как в примере, все равно не помогло, тогда просто подменил в проекте примера исходник на свой, откомпилировал и все работает.
  11. Вопросы по ADuC7061

    Сегодня наконец-то удалось запустить АЦП. Измерение в однополярном режиме осуществляется относительно ADC5, а не массы, но это еще не все. Выяснилось, что если не отключать питания mIDAS-Link при перезапуске отладки, АЦП сразу инициализируется с ошибкой преобразования и никакие манипуляции не дают эффекта. Если при перезапуске отладки переподать питание на плату и только потом подключить mIDAS-Link, то все регистры инициализируются нулями и все нормально работает. Вот такая странность..... Теперь нужно заставить АЦП измерять напряжение до 2,2В (сейчас только 1,2В), запустить UART и добиться, чтобы в IAR срабатывали прерывания. Кстати о прерываниях. Они описаны в программе и разрешены, в регистрах высталяются биты, что прерывание произошло, но перехода в обработку прерывания не происходит, может какой файл нужно подключить?
  12. Вопросы по ADuC7061

    Программа компилится и заливается нормально. В поддержку написал, может что подскажут.
  13. Вопросы по ADuC7061

    Сегодня скачал Keil, там вообще все по другому работает. Может с дровами к JTAG (miDAS-Link) что не так?
  14. Вопросы по ADuC7061

    В однополярном режиме от внутренней опоры тоже не работает.
  15. Вопросы по ADuC7061

    Да пробовал уже, ошибка и все. Попробовал включить дифференциальный режим, что-то зашевелилось, ошибка не выскакивает, переключил обратно и снова ошибка. Причем ошибка выскакивает сразу после конфигурации АЦП.
×
×
  • Создать...