Zigrund 0 15 апреля, 2011 Опубликовано 15 апреля, 2011 · Жалоба Использую контроллер LPC2478. Перефирия на частоте 72МГц. Подскажите пожалуйста какую максимальную частоту можно считать этим контроллером с его портов? И как будет быстрее в прерывании по изменении порта или в лмнлвнлм цикле? Как правильно настроить ИАР для этого? Поделитесь Ваши опытом пожалуйста. Самостоятельно у меня получилось считать только до 1 MHz. И то с натягом. Заранее спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 15 апреля, 2011 Опубликовано 15 апреля, 2011 · Жалоба Для точного захвата внешних сигналов следует использовать аппаратные таймеры с функцией capture или counter. GPIO для этого плохо подходит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zigrund 0 15 апреля, 2011 Опубликовано 15 апреля, 2011 (изменено) · Жалоба Для точного захвата внешних сигналов следует использовать аппаратные таймеры с функцией capture или counter. GPIO для этого плохо подходит. Я немного не понял, как это сделать. Поясню свой вопрос. Имеется 8bit шина данных и три строба. Самый быстрый строб, ко которому надо записывать эти 8bit меняется с частотой 4,5 МегаГерца. Можно понизить до 2,25, но лучше не надо. И как это делается, привидите примерчик пожалуйста. Я это никогда не пользовал, поэтому не очень представляю, как параллельную шину считать. Изменено 15 апреля, 2011 пользователем Prinz Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kovigor 6 15 апреля, 2011 Опубликовано 15 апреля, 2011 · Жалоба И как это делается, привидите примерчик пожалуйста. Боюсь, что никак. Слишком быстро. Или же без всякого таймера в цикле ждать фронтов строба и захватывать данные на шине, и то я ничего не обещаю. Я бы CPLD поставил или обычный регистр ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 16 апреля, 2011 Опубликовано 16 апреля, 2011 · Жалоба Строб заводите на ножку прерывания. Режим для этого прерывания используете FIQ. Прямо на ассемблере пишете код прерывания (из трех команд - чтение из порта, запись с автоинкрементом), помятуя, что в FIQ есть банкирование регистров и, следовательно, можно не сохранять регистры (некоторые, в общем за подробностями в мануал по ARM). Кстати, в том же мане есть такой раздельчик - "Примеры кода". Там есть такой "Soft-DMA", именно через FIQ. В общем, может и успеть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zigrund 0 18 апреля, 2011 Опубликовано 18 апреля, 2011 · Жалоба Боюсь, что никак. Слишком быстро. Или же без всякого таймера в цикле ждать фронтов строба и захватывать данные на шине, и то я ничего не обещаю. Я бы CPLD поставил или обычный регистр ... Плис не нужен, надо на контроллере. Сейчас буду пробовать на asm цикл писать. А команды асемблера для этого контроллера где можно глянуть? Строб заводите на ножку прерывания. Режим для этого прерывания используете FIQ. Прямо на ассемблере пишете код прерывания (из трех команд - чтение из порта, запись с автоинкрементом), помятуя, что в FIQ есть банкирование регистров и, следовательно, можно не сохранять регистры (некоторые, в общем за подробностями в мануал по ARM). Кстати, в том же мане есть такой раздельчик - "Примеры кода". Там есть такой "Soft-DMA", именно через FIQ. В общем, может и успеть. Про FIQ, тоже думал. А где в мане этот раздельчик? А можно примерчик на асемблере, если не сложно, а то на арм написания программ на асме у меня ещё не было. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zigrund 0 18 апреля, 2011 Опубликовано 18 апреля, 2011 · Жалоба Был бы рад краткому курсу по asm LPC ) void CameraTest(void) { BYTE str1[40]; SCS |= 0x1; FIO0DIR_bit.P0_22 = 0; #define HSYNC FIO0PIN_bit.P0_22 FIO2DIR_bit.P2_22 = 0; #define PCLK FIO2PIN_bit.P2_22 DWORD PixelCount = 0; bool FlagReady = false; while(1) { while(HSYNC == 1); PixelCount = 0; while(HSYNC == 0); while(1) { if(HSYNC == 0) break; if(PCLK == 1) { if(FlagReady) { //BmpBuff[PixelCount] = 0x56; PixelCount ++; FlagReady = false; } } else FlagReady = true; } sprintf((char*)str1,"%u",PixelCount); lcd_put_str(10, 28, str1, 0x00FFFFFF,0); } } Вот этотим кусочком я пытаюсь сосчитать стробы. Подскажите, как он на asm выглядеь будет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kovigor 6 18 апреля, 2011 Опубликовано 18 апреля, 2011 · Жалоба Вот этотим кусочком я пытаюсь сосчитать стробы. Подскажите, как он на asm выглядеь будет? А вы посмотрите файл листинга и узнаете. От себя добавлю, что ваша идея почти наверняка обречена на неудачу. 4.5МГц - это явно очень быстро. А современные компиляторы генерируют ну почти оптимальный код, и чтобы сделать лучше, программируя на ассемблере, придется серьезно потрудиться ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zigrund 0 18 апреля, 2011 Опубликовано 18 апреля, 2011 (изменено) · Жалоба А вы посмотрите файл листинга и узнаете. От себя добавлю, что ваша идея почти наверняка обречена на неудачу. 4.5МГц - это явно очень быстро. А современные компиляторы генерируют ну почти оптимальный код, и чтобы сделать лучше, программируя на ассемблере, придется серьезно потрудиться ... 59 void CameraTest(void) 60 { \ CameraTest: \ 00000000 30402DE9 PUSH {R4,R5,LR} \ 00000004 2CD04DE2 SUB SP,SP,#+44 61 62 BYTE str1[40]; 63 64 SCS |= 0x1; \ 00000008 ........ LDR R0,??DataTable1 ;; 0xe01fc1a0 \ 0000000C 000090E5 LDR R0,[R0, #+0] \ 00000010 010090E3 ORRS R0,R0,#0x1 \ 00000014 ........ LDR R1,??DataTable1 ;; 0xe01fc1a0 \ 00000018 000081E5 STR R0,[R1, #+0] 65 FIO0DIR_bit.P0_22 = 0; \ 0000001C FF05A0E3 MOV R0,#+1069547520 \ 00000020 FF0980E3 ORR R0,R0,#0x3FC000 \ 00000024 000090E5 LDR R0,[R0, #+0] \ 00000028 4008D0E3 BICS R0,R0,#0x400000 \ 0000002C FF15A0E3 MOV R1,#+1069547520 \ 00000030 FF1981E3 ORR R1,R1,#0x3FC000 \ 00000034 000081E5 STR R0,[R1, #+0] 66 #define HSYNC FIO0PIN_bit.P0_22 67 FIO2DIR_bit.P2_22 = 0; \ 00000038 FF01E0E3 MVN R0,#-1073741761 \ 0000003C FE0DC0E3 BIC R0,R0,#0x3F80 \ 00000040 000090E5 LDR R0,[R0, #+0] \ 00000044 4008D0E3 BICS R0,R0,#0x400000 \ 00000048 FF11E0E3 MVN R1,#-1073741761 \ 0000004C FE1DC1E3 BIC R1,R1,#0x3F80 \ 00000050 000081E5 STR R0,[R1, #+0] 68 #define PCLK FIO2PIN_bit.P2_22 69 DWORD PixelCount = 0; \ 00000054 0000A0E3 MOV R0,#+0 \ 00000058 0040B0E1 MOVS R4,R0 70 bool FlagReady = false; \ 0000005C 0000A0E3 MOV R0,#+0 \ 00000060 0050B0E1 MOVS R5,R0 71 72 while(1) 73 { 74 while(HSYNC == 1); \ ??CameraTest_0: \ ??CameraTest_1: \ 00000064 AF01E0E3 MVN R0,#-1073741781 \ 00000068 FF0DC0E3 BIC R0,R0,#0x3FC0 \ 0000006C 000090E5 LDR R0,[R0, #+0] \ 00000070 400810E2 ANDS R0,R0,#0x400000 \ 00000074 200BB0E1 LSRS R0,R0,#+22 \ 00000078 010050E3 CMP R0,#+1 \ 0000007C F8FFFF0A BEQ ??CameraTest_1 75 PixelCount = 0; \ 00000080 0000A0E3 MOV R0,#+0 \ 00000084 0040B0E1 MOVS R4,R0 76 while(HSYNC == 0); \ ??CameraTest_2: \ 00000088 AF01E0E3 MVN R0,#-1073741781 \ 0000008C FF0DC0E3 BIC R0,R0,#0x3FC0 \ 00000090 000090E5 LDR R0,[R0, #+0] \ 00000094 400810E2 ANDS R0,R0,#0x400000 \ 00000098 200BB0E1 LSRS R0,R0,#+22 \ 0000009C 000050E3 CMP R0,#+0 \ 000000A0 F8FFFF0A BEQ ??CameraTest_2 77 while(1) 78 { 79 if(HSYNC == 0) break; \ ??CameraTest_3: \ 000000A4 AF01E0E3 MVN R0,#-1073741781 \ 000000A8 FF0DC0E3 BIC R0,R0,#0x3FC0 \ 000000AC 000090E5 LDR R0,[R0, #+0] \ 000000B0 400810E2 ANDS R0,R0,#0x400000 \ 000000B4 200BB0E1 LSRS R0,R0,#+22 \ 000000B8 000050E3 CMP R0,#+0 \ 000000BC 0B00001A BNE ??CameraTest_4 80 if(PCLK == 1) 81 { 82 if(FlagReady) 83 { 84 //BmpBuff[PixelCount] = 0x56; 85 PixelCount ++; 86 FlagReady = false; 87 } 88 } 89 else FlagReady = true; 90 } 91 sprintf((char*)str1,"%u",PixelCount); \ 000000C0 0420B0E1 MOVS R2,R4 \ 000000C4 ........ ADR R1,??DataTable0 ;; 0x25, 0x75, 0x00, 0x00 \ 000000C8 04008DE2 ADD R0,SP,#+4 \ 000000CC ........ BL sprintf 92 lcd_put_str(10, 28, str1, 0x00FFFFFF,0); \ 000000D0 0000A0E3 MOV R0,#+0 \ 000000D4 00008DE5 STR R0,[sP, #+0] \ 000000D8 FF34E0E3 MVN R3,#-16777216 \ 000000DC 04208DE2 ADD R2,SP,#+4 \ 000000E0 1C10A0E3 MOV R1,#+28 \ 000000E4 0A00A0E3 MOV R0,#+10 \ 000000E8 ........ BL _Z11lcd_put_strttPhjj \ 000000EC DCFFFFEA B ??CameraTest_0 \ ??CameraTest_4: \ 000000F0 AF01E0E3 MVN R0,#-1073741781 \ 000000F4 FE0DC0E3 BIC R0,R0,#0x3F80 \ 000000F8 000090E5 LDR R0,[R0, #+0] \ 000000FC 400810E2 ANDS R0,R0,#0x400000 \ 00000100 200BB0E1 LSRS R0,R0,#+22 \ 00000104 010050E3 CMP R0,#+1 \ 00000108 0600001A BNE ??CameraTest_5 \ 0000010C FF5015E2 ANDS R5,R5,#0xFF ;; Zero extend \ 00000110 000055E3 CMP R5,#+0 \ 00000114 E2FFFF0A BEQ ??CameraTest_3 \ 00000118 014094E2 ADDS R4,R4,#+1 \ 0000011C 0000A0E3 MOV R0,#+0 \ 00000120 0050B0E1 MOVS R5,R0 \ 00000124 DEFFFFEA B ??CameraTest_3 \ ??CameraTest_5: \ 00000128 0100A0E3 MOV R0,#+1 \ 0000012C 0050B0E1 MOVS R5,R0 \ 00000130 DBFFFFEA B ??CameraTest_3 \ 00000134 REQUIRE _A_SCS \ 00000134 REQUIRE _A_FIO0DIR \ 00000134 REQUIRE _A_FIO0PIN \ 00000134 REQUIRE _A_FIO2DIR \ 00000134 REQUIRE _A_FIO2PIN 93 } 94 } Может вы своим провессиональным взглядом, что подскажите??? Где, что надо умотать, чтобы шустрее работало. У меня даже 1 мегагерц сейчас пиксели пропускаются. Изменено 18 апреля, 2011 пользователем IgorKossak [codebox] !!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kovigor 6 18 апреля, 2011 Опубликовано 18 апреля, 2011 · Жалоба Может вы своим провессиональным взглядом, что подскажите??? Где, что надо умотать, чтобы шустрее работало. У меня даже 1 мегагерц сейчас пиксели пропускаются. А вы попробуйте сначала сделать вообще без прерывания (для проверки). Запретите все прерывания и просто в цикле ждите фронтов синхроимпульсов или того, что у вас там вместо них, и по этим фронтам читайте ваши данные. Успеете ? Ну, тогда и с прерываниями можно потягаться. Нет ? Тогда и пробовать нечего ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Слесарь 9 18 апреля, 2011 Опубликовано 18 апреля, 2011 · Жалоба Я при тактовой частоте 24 мГц PIC контроллера, устойчиво, с программной фильтрацией промежуточного пограничного состояние аналогового сигнала, считываю с порта частоту до 200 кГц. А так вообще, думаю что 1мкс импульс регистрировал бы портом без проблем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zigrund 0 18 апреля, 2011 Опубликовано 18 апреля, 2011 · Жалоба А вы попробуйте сначала сделать вообще без прерывания (для проверки). Запретите все прерывания и просто в цикле ждите фронтов синхроимпульсов или того, что у вас там вместо них, и по этим фронтам читайте ваши данные. Успеете ? Ну, тогда и с прерываниями можно потягаться. Нет ? Тогда и пробовать нечего ... Так я перед вызовам функции так и делаю: __disable_interrupt(); CameraTest(); Это я Вам привёл мой код, который я сейчас тестирую. Так, что все прерывания запрещены. ( Я при тактовой частоте 24 мГц PIC контроллера, устойчиво, с программной фильтрацией промежуточного пограничного состояние аналогового сигнала, считываю с порта частоту до 200 кГц. А так вообще, думаю что 1мкс импульс регистрировал бы портом без проблем. Мне надо 4,5MHz. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Слесарь 9 18 апреля, 2011 Опубликовано 18 апреля, 2011 · Жалоба Мне надо 4,5MHz. Тогда надо использовать встроенный специальный счетчик, если он есть в МК Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zigrund 0 18 апреля, 2011 Опубликовано 18 апреля, 2011 · Жалоба Тогда надо использовать встроенный специальный счетчик, если он есть в МК По стробу надо считывать данные ещё 8 bit. Я не верю, что контроллер на частоте 72 MHz, не может счиать каки-то хилых 5 MHz. Может есть какой способ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Слесарь 9 18 апреля, 2011 Опубликовано 18 апреля, 2011 · Жалоба проблема может статься в задержке распространения сигнала по проводникам. плавное нарастание сигнала на порту и соответсвенно неправильная фиксация сигнала. необходимо как-то прикинуть скорость нарастания сигнала при тактовой частоте 5 мГц и длине проводников. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться