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

wmakc

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

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

  • Посещение

Весь контент wmakc


  1. Продолжаю писать программу, столкнулся с такой проблемой: Контроллер общается по UART с компьютером. При получении тревоги от средства обнаружения, должен ответить этому средству не прекращая общаться с компьютером. Проблема в том, что если ставить приоритет прерываний от компьютера выше, то контроллер не всегда будет реагировать на тревогу, если на оборот, то будут теряться сообщения от компьютера. Так то он вродебы чаще всего успевает, но видимо из-за того что используются функции при обращении с Uart, то контроллер ждет появления данных на порту прежде чем их считать и если данные передаются по двум портам одновременно, то он обработает по одному. При использовании PDC может получиться так что в буфер данные еще не считались, и при проверке, контроллер может не обработать сообщение. Объясните как правильно организовать алгоритм или направьте куда-нибудь где можно об этом почитать.
  2. Разобрался, прерывания нормально работают. Проблема в том, что у меня на одном UARTе висит камера, которую нужно постоянно опрашивать. Примерно раз в 10 секунд. Интерфейс 485, поэтому либо передача либо прием. С другого USARTа приходят команды управления камерой, поэтому когда они приходят, их нужно перенаправлять на нее. После этого камера отсылает ответ. Так вот ответ работает по прерыванию. Проблема возникает как я понимаю из-за того, что камера иногда может отсылать посылки с задержками, при этом контроллер, так как нет прерывания возвращается в функцию опроса. Мне бы сделать так, чтобы после обработки прерывания он возвращался не в точку, где закончил выполнение программы, а куда-нибудь в другое место. int main(void) { // -- Заполняем массив состояний камер значениями 0x04(Камера выключена) -------- for(i=1; i<6; i++) { Status[i] = 0x04; } // ------------------------------------------------------------------------------ // Status[1] = 0x01; GetNumberBLVS(); // Получение номера БЛВС PIO(); // Включаем порты управления передатчиками и приемниками ConfigureUsartDirect(); // Конфигурация Usart, ретранслирующего от ПЭВМ к БЛВС и ВК ConfigureUsartReverse(); // Конфигурация Usart, ретранслирующего от ВК, БЛВС к ПЭВМ ConfigureUsartVk(); // Конфигурация Usart для работы с ВК ConfigureUsartAlarm(); // Конфигурация Usart для работы со средством обнаружения ConfigurePDC(); // Конфигурация PDC USART_DIRECT->US_IER = AT91C_US_RXRDY; // Включение прерываний по USART_DIRECT USART_REVERSE->US_IER = AT91C_US_RXRDY; //AT91C_US_ENDRX;//AT91C_US_RXBUFF; // Включение прерываний по USART_REVERSE USART_VK->US_IER = AT91C_US_RXRDY;//AT91C_US_RXRDY; // Включение прерываний по USART_VK USART_ALARM->US_IER = AT91C_US_ENDRX;//AT91C_US_RXRDY; // Включение прерываний по USART_ALARM unsigned char CountVK = 1; // Счетчик номера опрашиваемой камеры while(1) { CommandVk = 0x00; if(CountVK==6) //Сбрасываем счетчик, когда опрошено 5 камер { CountVK=1; } USART_VK->US_IDR = AT91C_US_RXRDY; Query(NumBLVS, CountVK); //В этой функции проводится опрос камер USART_VK->US_IER = AT91C_US_RXRDY; //А сюда мне бы надо попасть после обработки ответа от камеры CountVK++; // Увеличение счетчика номера камеры } }
  3. Сделал PDC для всех используемых USARTов. Немного переделал функции от AT91RM9200. Вот примерный алгоритм 1) Сначала открываем для каждого USARTa. // --Конфигурация PDC ------------------------ void ConfigurePDC() { AT91F_PDC_Open (AT91C_BASE_PDC_US0); // Настройка PDC для USART_DIRECT AT91F_PDC_Open (AT91C_BASE_PDC_US5); AT91F_PDC_Open (AT91C_BASE_PDC_US2); AT91F_PDC_Open (AT91C_BASE_PDC_US3); } // ------------------------------------------- 2) Для приема, передачи написал такие функции 2.1) Ретрансляция из порта в порт unsigned int PDC_ReceiveWrite ( AT91PS_PDC pPDCRecive, AT91PS_PDC pPDCWrite, char *pBuffer, unsigned int szBuffer) { if (AT91F_PDC_IsRxEmpty(pPDCRecive)) { //* Buffer and next buffer can be initialized AT91F_PDC_SetRx(pPDCRecive, pBuffer, szBuffer); AT91F_PDC_SetTx(pPDCWrite, pBuffer, szBuffer); return 1; } else { return 0; } } При срабатывании прерывания у меня данные сразу ретранслируются. Можно и буфер отслеживать. 2.2) Передача в порт unsigned int PDC_Send( AT91PS_PDC pPDC, char *pBuffer, unsigned int szBuffer) { if (AT91F_PDC_IsTxEmpty(pPDC)) { //* Buffer and next buffer can be initialized AT91F_PDC_SetTx(pPDC, pBuffer, szBuffer); return 2; } else { //* All buffer are in use... return 0; } } Использую один буфер, так как мне его хватает. Возникла только проблема с самими прерываниями. Не всегда срабатывают. В чем отличие AT91C_US_RXRDY от AT91C_US_ENDRX ?
  4. Разобрался в инициализации PDC. Завтра выложу, что получилось. Так у меня не только перенаправление из канала в канал, но и еще прослушивание линнии. Поэтому pdc и требуется, чтобы все успевать
  5. Вот начал переделывать программу, чтобы использовался PDC Для первоначальной настройки этого хватит? void ConfigurePDC() { AT91F_PDC_Open (AT91C_BASE_PDC_US5); AT91F_PDC_SetNextRx (AT91C_BASE_PDC_US5, Buf2, 1); AT91F_PDC_SetNextTx (AT91C_BASE_PDC_US5, Buf2, 1); AT91F_PDC_SetRx (AT91C_BASE_PDC_US5, Buf1, 1); AT91F_PDC_SetTx (AT91C_BASE_PDC_US5, Buf1, 1); } Взял функции для At91rm9200, но как понял они для моего контроллера тоже подходят, так как регистры не поменялись. Решил в прерывания по Usart добавить функции PDC: AT91F_PDC_ReceiveFrame (AT91C_BASE_PDC_US5, Buf1, 1, Buf2, 1); AT91F_PDC_SendFrame (AT91C_BASE_PDC_US5, Buf1, 1, Buf2, 1); Только когда проверяю буферы, они остаются пустыми.
  6. Вот код main, здесь только инициализация Uartoв производится и постоянный опрос камеры. int main(void) { // -- Заполняем массив состояний камер значениями 0x04(Камера выключена) -------- for(i=1; i<6; i++) { Status[i] = 0x04; } // ------------------------------------------------------------------------------ ConfigureUsartDirect(); // Конфигурация Usart, ретранслирующего от ПЭВМ к БЛВС и ВК ConfigureUsartReverse(); // Конфигурация Usart, ретранслирующего от ВК, БЛВС к ПЭВМ ConfigureUsartVk(); // Конфигурация Usart для работы с ВК ConfigureUsartAlarm(); // Конфигурация Usart для работы со средством обнаружения USART_DIRECT->US_IER = AT91C_US_RXRDY; // Включение прерываний по USART_DIRECT USART_REVERSE->US_IER = AT91C_US_RXBUFF; // Включение прерываний по USART_REVERSE USART_VK->US_IER = AT91C_US_RXRDY; // Включение прерываний по USART_VK USART_ALARM->US_IER = AT91C_US_RXRDY; // Включение прерываний по USART_ALARM unsigned char CountVK = 1; // Счетчик номера опрашиваемой камеры // Основной цикл программы while(1) { if(CountVK==6) //Сбрасываем счетчик, когда опрошено 5 камер { CountVK=1; } Query(NumBLVS, CountVK); CountVK++; // Увеличение счетчика номера камеры } А это инициализация одного из Usartoв. void ConfigureUsartReverse(void) { #define MODE_ASYNCHRONOUS (AT91C_US_CHRL_8_BITS | AT91C_US_PAR_NONE | AT91C_US_NBSTOP_1_BIT) const Pin pinsUsart[] = {USART_REVERSE_TXD, USART_REVERSE_RXD}; PIO_Configure(pinsUsart, PIO_LISTSIZE(pinsUsart)); PMC_EnablePeripheral(USART_REVERSE_ID); USART_Configure(USART_REVERSE, MODE_ASYNCHRONOUS, 115200, BOARD_MCK); // Configure the interrupt AIC_ConfigureIT(USART_REVERSE_ID, AT91C_AIC_PRIOR_HIGHEST, ISR_UsartReverse); AIC_EnableIT(USART_REVERSE_ID); // Enable receiver & transmitter USART_SetReceiverEnabled(USART_REVERSE, 1); USART_SetTransmitterEnabled(USART_REVERSE, 1); } Правда я думаю я в прерываниях не до конца разобрался, поэтому так и выходит, что либо они все время срабатывают, либо не работают. Еще возник вопрос, думаю сделать ретрансляцию через PDC, чтобы не загружать процессор. Правда в даташите на контроллер немного написано, да и примеров для работы с PDC под этот контроллер нет. Может кто посоветует пример для другого какого, чтобы я мог разобраться?
  7. Дело в том, что с датчиком просто идет обмен данными и никакие прерывания не используются. Прерывания должны обрабатываться по другому usartу.
  8. дело в том, что по одному usartу контроллер постоянно опрашивает датчик, а при появлении данных на другом, он должен прерваться, обработать их. Но этого не происходит. Он как висит на датчике, так и продолжает висеть.
  9. AT91C_BASE_US0->US_IER = AT91C_US_RXRDY; // 1 AT91C_BASE_US0->US_IER = AT91C_US_RXBUFF; // 2 1. Как я понял это прерывание срабатывает при появлении данных 2. А это при заполнении буфера Если обмен данных идет по другому usart, то при первом случае прерывание не срабатывает, пока не закончится обмен. А при втором, прерывание вызывается всегда, даже когда нет обмена с этим usartом. Мне нужно организовать передачу по 4 usartам. 1)По одному идет обмен с устройством. Для него должен быть минимальный приоритет. 2)По второму обмен с датчиком. При срабатывании датчика, должен происходить обмен с ним. У него максимальный приоритет. 3)По последним двум проводится ретрансляция данных. Забыл написать контроллер Atmel At91sam9g20.
  10. Немного разобрался с датчиком и набросал программу, включает ИК - подсветку, при низкой освещенности // Датчик освещенности #define DATCHIK_ADRESS (0x49) // Адрес датчика int Osveshennost(unsigned char ADC0) { int VklIK = 0; unsigned char *Control, *Timing, *ID, *ADC; // Значения регистров датчика TWID_Write(&twid, DATCHIK_ADRESS, 0x80, 1, 0x02, 1, 0); // Включение датчика !!! Почему-то включается не по 0x3, а по 0x2. do { /* // Управляем временем интегрирования TWID_Write(&twid, DATCHIK_ADRESS, 0x81, 1, 0x0B, 1, 0); mdelay(200); TWID_Write(&twid, DATCHIK_ADRESS, 0x81, 1, 0x03, 1, 0); */ TWID_Read(&twid, DATCHIK_ADRESS, 0xAC, 1, ADC, 2, 0); //Считываем значения ADC }while(ADC[0]==0x00); //Пока датчик не начнет присылать значения int i = 0; for(i=0; i<96; i++) //считываем нужное количество значений с датчика { TWID_Read(&twid, DATCHIK_ADRESS, 0xAC, 1, ADC, 2, 0); // USART_Write(AT91C_BASE_US0, ADC[0], 0); // USART_Write(AT91C_BASE_US0, ADC[1], 0); } if(ADC[1]==0x00) { if(ADC[0]<ADC0) { VklIK = 1; //Включаем ИК-прожектор если низкая освещенность } } //Выключаем датчик TWID_Write(&twid, DATCHIK_ADRESS, 0x80, 1, 0x00, 1, 0); //Записываем 0x00 для выключения return VklIK; }
  11. частота нормальная. другие устройства по twi работают, а этот датчик никак не хочет
  12. напряжение на датчик подается 2,5v. Непонятно почему он не реагирует на команды записи. а при чтении выдает неправильные данные
  13. датчик освещенности APDS-9300

    Кто-нибудь пробовал подключать такой датчик или какой-нибудь аналогичный? Не могу разобраться почему не отзывается по i2c. Может у него и контроллера интерфейсы отличаются?
  14. Компилирую buildroot с linux4sam.org При этом выдает ошибку checking dlfcn.h usability... yes checking dlfcn.h presence... yes checking for dlfcn.h... yes checking how to run the C++ preprocessor... /lib/cpp configure: error: C++ preprocessor "/lib/cpp" fails sanity check See `config.log' for more details. make: *** [/home/max/broot/buildroot-v23434/toolchain_build_arm_nofpu/gmp-4.2.2-host/.configured] Ошибка 1 файл config.log config.txt Как ее исправить?
  15. сборка bootstrap

    Можно поподробнее где в виндовс и что нужно прописать, чтобы запустить компиляцию?
  16. сборка bootstrap

    я тоже хочу запустить atbootstrap. У меня к тебя вопрос, ты установил компилятор на Windows или Ubuntu? Просто я пытался поставить на Ubuntu, но так и не понял, как это правильно сделать, до этого с линуксом почти не работал.
  17. Хочу запустить линукс на плате, но так как плохо разбираюсь не могу запустить компилятор в Ubuntu. Скачал кросс-компилятор от Codesourcery. На сайте http://dmilvdv.narod.ru/AT91SAM9260/index.html?ubifs.html указано, что для компиляции нужно созадать файл с содержимым #!/bin/sh export PATH=/<path to toolchain>/arm-2007q1/bin:${PATH} make CROSS_COMPILE=arm-none-eabi- Мне не ясно какое расширение должно быть у файла и как его запустить. Компилятор от Codesourcery можно просто распаковать или его нужно обязательно устанавливать?
  18. MT48H16M16LF

    С памятью разобрался. Стандартный загрузчик осуществляет инициализацию PC ножек, на которых висит сброс матрицы, из-за этого вначале картинка передается, а после и шли нули. Память оказалась не виновата. Осталось разобраться как запустить SAM-ICE для работы с 16 битной памятью.
  19. MT48H16M16LF

    Картинка сбрасывается в SDRAM, начало картинки приходит, каждый раз разное количество байт. Но дальше одни нули. Как будто SDRAM не успевает за ISI интерфейсом. Возможно я неправильно инициализирую память. Как мне ее проинициализировать в Keile через Sam-ice. Память 16 разрядная, а keil настроен на 32. Может у кого есть ini файл для инициализации 16 разрядной памяти.
  20. SAMBA и 16 bit SDRAM

    Разобрался сам. Если кому понадобится, то находим в директории самбы папку с библиотекой tcl скриптов, берем tcl файл используемой платы и в нем меняем разрядность памяти с 32 на 16.
  21. Оказалась проблема в плохой пропайке jtag разъема. А память MT48H16M32. Теперь ищу способ, чтобы запустить SAM-ICE для отладки в Keil. Как я понял, он использует ini файл для инициализации SDRAM. Вот только где в нем выбирается разрядность памяти?
  22. SAMBA и 16 bit SDRAM

    Как настроить samba, чтобы проинициализировть через нее 16 битную Sdram?
  23. Оказался неправильно подпаян кварц Slow Clock. Теперь по usb опознается нормально. Sam-ice говорит что не может остановить arm. Как будто не работает сброс
  24. 1. При подключении USB к плате, компьютер ее определяет, но пишет неизвестное устройство. 2. При подключении через SAM-ICE и запуске SAMBA появляется сообщение JTAG Timeout during adaptive clocking: RTCK did not respond. 3. Через J-Link Commander не определяется и выдает такие данные а при подключении отладочной платы приходит такой ответ то есть как я понимаю у меня процессор не определяется и SAM-ICE выбирает по умолчанию ARM7. В отличие от отладочной платы память используется 16 битная. Вопрос в том, как проверить плату на работоспособность.
  25. Немного разобрался, потребление удалось снизить. Только столкнулся с проблемой. Включаю прерывания по USART по заполнению буфера, выключаю ядро. Так оно сразу возвращается в обычный режим. Начал смотреть и заметил, что как только включаю прерывания по USART, так прерывание сразу срабатывает. Даже если нет никакой передачи данных на контроллер. Немогу понять с чем это связано
×
×
  • Создать...