Jump to content

    

afad

Свой
  • Content Count

    210
  • Joined

  • Last visited

Everything posted by afad


  1. Проблема решена. WDT при инициализации находился в Power Down. Сбросил бит и все заработало.
  2. LPC1313 не заводится противосбойный таймер. Вроде все правильно инициализирую. void WDTInit(void) //Инициализация WDT {LPC_WDT->TC = 500000; //Once WDEN is set, the WDT will start after feeding LPC_WDT->MOD = 0x03; //WDEN+WDRESET LPC_SYSCON->WDTCLKSEL = 0x00; //Источник - Int-RC // LPC_SYSCON->WDTCLKSEL = 0x01; //Источник - main-clk (и так не работает) // LPC_SYSCON->WDTCLKSEL = 0x02; //Источник - WDT-RC (и так тоже не работает) LPC_SYSCON->WDTCLKUEN = 0x0001; //Установить источник клока LPC_WDT->FEED = 0xAA; LPC_WDT->FEED = 0x55; } После этого читаю счетчик (L=LPC_WDT->TV;), показывает значение 0х000000FF (значение по умолчанию), значит счетчик не записывается и не тикает. То же самое делал для LPC1768 - все работало, в чем проблема - не понимаю. PS. И в LPC1343 тоже WDT не включается. Значит дело не в микросхеме, а в программе.
  3. Вопрос снят. В файле системной инициализации для частоты 100 MHz (был готовый файл) были выключены UART2 и UART3 (соответствующие биты в регистре PCONP были =0). Установил правильно PCONP и все заработало.
  4. Есть плата с LPC1769, максимальная частота ядра для этого микроконтроллера - 120 MHz. Работал при частоте 72 MHz, все работало отлично. Увеличил частоту ядра до 100 MHz и стал виснуть. Выяснено, что виснет при попытке работать с UART2 и UART3. Причем виснет на этапе инициализации регистров этих UART-ов. Т.е., например, записываем: UART3->IER = 0x00; и все повисло. При этом, если работаем с UART0 и UART1 - нет проблем. Понизить частоту клока указанных UART-ов (задается в регистре PCLKSEL1) не привело ни к чему, по прежнему виснет. Вот и непонятно, чем UART2 и UART3 отличаются от UART0 и UART1. И как работать с UART2 и UART3 при частоте ядра 100 MHz?
  5. Делал для LPC1768, работающего на частоте 100 МГц, без особых ухищрений на С получилось записывать 4 Мегаслова в сек (чтение элемента массива из памяти и запись его в gpio, формирование импульса WR, инкремент указателя массива, и так по циклу). Возможно можно как-то оптимизировать, или написать на асме, вероятно можно увеличить скорость в несколько раз, но мне не нужно было, поэтому не заморачивался.
  6. Да, идея интересная: http://www.microtransat.org И вот еще: http://www.popmech.ru/article/3632-ro-47-botiki/
  7. Собственно в этом и вопрос, на выходе Quartus получается .pof или .sof файл, для заливки программатором. А я хочу .hex формат, чтобы заливать в FPGA из микроконтроллера. Есть такие установки (Assembler setting): "Generate Hexadecimal (Intel-Format) Output File (.hexout) for Target Device - Off" А как включить "ON", непонятно, вроде все перерыл, нигде не включается. Или плохо искал??? MAX по умолчанию генерил .hex-файл вместе с .pof, а QUARTUS не хочет.
  8. Попробуйте попробовать прочитать по адресу 0x00 число, должно быть 0x01, что означает, что микросхема фирмы Spansion. Не записываться может по причине того, что блоки памяти залочены, нужно сделать unlock. Я так думаю. Сейчас под рукой нет такой микросхемы, проверить не могу.
  9. Нужен программатор PIC18F14K50, попроще, что-то типа ПониПрог. Нужно разово записать готовую программку. Поискал в интернете, вариантов много, есть простые, программируют через LPT, но именно эту микросхему не прошивают. Может кто видел?
  10. Время - да хоть из какого. Но в RMC еще есть дата и признак достоверности данных. Вот пример расшифровки пакета, правда для другого модуля: $GPRMC,133147.000,V,5647.7429,N,03416.6492,E,,,190908,,*14 $GPRMC – заголовок 133147.000 – 13:31:47 – время. V – данные не достоверны (A – данные достоверны). ... 190908 – 19.09.08 – дата. 14 – контрольная сумма. Или пример пакета, когда данные достоверны: $GPRMC,133910.000,A,5647.7429,N,03416.6492,E,000.0,212.7,190908,009.6,E*65 А разве поправку можно ввести? А я по незнанию на микроконтроллере пересчитывал :-(
  11. Докопался, можно указать 64-битный адрес 0х00000000, тогда передача будет по 16-битному адресу. Но вот что непонятно. Когда одно конечное устройство - все работает отлично (передача происходит раз в полминуты, остальное время конечное устройство спит). Включаю второе устройство, одно из устройств (может быть любое) работает нормально, от второго сообщение может приходить примерно 1 раз из 5-10. Вероятность одновременной передачи сообщений минимальна. Причем это происходит, если конечные устройства на некотором удалении от координатора, когда близко - такого нет. В чем может быть проблема???
  12. Аналогичная задача. Делал широковещательную передачу, когда одно конечное устройство - работает, при включении нескольких конечных устройств некоторые посылки теряются. Сделал передачу конкретному координатору (с указанием 64-битного адреса), с подтверждением ACK - вроде заработало. Использовал пакет API 0x10, но там задается 64-битный адрес координатора (я так понял - это серийный номер, который нельзя изменить) и 16-битный адрес. Но допустим координатор сломался, его заменили (вместе с модулем), соответственно 64-битный номер сменился, и что, перешивать все конечные точки? Или как-то можно сделать НЕ широковещательную передачу (с подтверждением ACK) используя только 16-битный адрес??? В команде API 0x10 нужно указывать и 64-битный адрес и 16-битный, вот в чем проблема. В продолжение темы. Хм... Указываю 64-битный адрес 0x00000000 - сообщение приходит к координатору. Указываю 16-битный адрес не 0х0000 (у координатора всегда 0x0000, я так понял) - сообщение тоже приходит к координатору. Не понятно - это широковещательная передача или нет?
  13. Прерывания в С++

    Шайтан, заработало! Спасибо AHTOXA!
  14. Необходимо вставить в свой проект программу, написанную на C++. Раньше никогда не сталкивался с С++, всегда писал на С. Пытаюсь запустить простейшую программу - виснет в прерываниях. Вот текст: #include "lpc17xx.h" int main(void) {SystemInit(); GPIO0 -> FIODIR = 1<<24 | 1<<25; //P0.24, P0.25 - выходы TIM1 -> MR0 = 18000000/100 - 1; //Period = 10 ms TIM1 -> MCR = 3; //Interrupt and Reset on MR1 NVIC_EnableIRQ(TIMER1_IRQn); TIM1 -> TCR = 1; //Timer 1 enable while(1) { if((GPIO0->FIOPIN)&(1<<24)){GPIO0->FIOCLR=1<<24;} //Инвертируем P0.24 else{GPIO0->FIOSET=1<<24;} } } void TIMER1_IRQHandler(void) {TIM1 -> IR = 1; //Clear interrupt flag if((GPIO0->FIOPIN)&(1<<25)){GPIO0->FIOCLR=1<<25;} //Инвертируем Р0.25 else{GPIO0->FIOSET=1<<25;} } В программе на выводе P0.24 - меандр в основном цикле, на выводе P0.25 - меандр из программы прерываний - период 20 мс. Если файл называется main.c (значит проект на C), все работает :rolleyes: Если этот же файл переименовать в main.cpp (проект на С++), работает до первого прерывания (10 мс), потом виснет :crying: Т.е. на выводе P0.24 импульсы в течении 10 мс, потом видимо наступает прерывание и импульсы пропадают. Может как-то нужно изменить синтаксис, все же в С++ есть отличия от С? Среда программирования - Keil, микроконтроллер LPC1768.
  15. Да, действительно, чтобы P0.29 работал на выход, нужно оба P0.29 и P0.30 запрограммировать как выходы. Спасибо, sonycman.
  16. В контроллере LPC1768 нога 29 (P0.29) может использоваться как PIO и как USB. Никак не могу заставить ее работать в режиме PIO. Конфигурирую так: GPIO0 -> FIODIR |= 1<<29; //Выход PINCON -> PINSEL1 &= ~((1<<26) | (1<<27)); //PIO (not USB) В программе пытаюсь дергать ножкой: GPIO0 -> FIOCLR = 1<<29; и GPIO0 -> FIOSET = 1<<29; на выходе ничего (похоже притянуто внутренним резистором к 0). Другие ножки нормально управляются. Это тоже не помогает: PINCON -> PINMODE_OD0 &= ~(1<<29); //Not OD PINMODE для P0.29 не устанавливается. Где-то я затупил...
  17. Анонсировано 4 камня: http://www.nxp.com/documents/data_sheet/LPC4350_30_20_10.pdf
  18. Информация с сайта NXP, читаем и обсуждаем...
  19. Зайди на сайт ucrouter.ru > Загрузить > для платы EVM9200 есть файлы FLASH Write Utility. Это bin файлы, грузятся по X-модему во внутреннюю RAM и автоматически запускаются, в том же гипертерминале появится меню. Ничего страшного, если у тебя другая FLASH, главное можно проверить процесс загрузки. Исхордники там тоже есть.
  20. Вы это патентуете? http://www.rtcs.ru/popup_product.asp?id=6342
  21. Спасибо, заработало. Только добавил разрешение прерывания от компаратора T2.
  22. С целью минимизации потребления нужно усыплять на некоторое время прибор на ATMEGA164p. В активном режиме контроллер работает от внешнего кварца 3,6864 МHz. В неактивном режиме нужно минимизировать потребление. Просто включить делитель - неэффективно, все равно генератор кушает 250 мкА. Думаю правильно будет отключить генератор, и включить таймер Т2 на работу в асинхронном режиме от кварца 32 кГц и по прерыванию просыпаться. Проблема в том, что не включается генератор на 32 kHz. Может есть у кого пример включения асинхронного генератора 32 кГц и таймера Т2 от него. Для других ATMEG пример тоже подойдет, думаю отличия незначительные.
  23. Т.е. Вы предполагаете, что разработчик за свои деньги разработает и изготовит 300 комплектов устройств?
  24. Я врать не хочу, но запустите конфигурилку кернела. Там что-то было про WDT.Да, можно Linux-ом запустить внутренний WDT, проблема в том, что программа должна дойти до завершения загрузки Linux и всех прикладных программ и не повиснуть, и не застрять по пути в U-boot-e или еще где-то. Давайте это не обсуждать, к данной теме это не относится.