|
|
  |
Какую максимальную частоту можно считать с портов контроллера?, LPC2478 |
|
|
|
Apr 15 2011, 11:37
|
Частый гость
 
Группа: Участник
Сообщений: 184
Регистрация: 11-09-08
Пользователь №: 40 121

|
Цитата(scifi @ Apr 15 2011, 17:30)  Для точного захвата внешних сигналов следует использовать аппаратные таймеры с функцией capture или counter. GPIO для этого плохо подходит. Я немного не понял, как это сделать. Поясню свой вопрос. Имеется 8bit шина данных и три строба. Самый быстрый строб, ко которому надо записывать эти 8bit меняется с частотой 4,5 МегаГерца. Можно понизить до 2,25, но лучше не надо. И как это делается, привидите примерчик пожалуйста. Я это никогда не пользовал, поэтому не очень представляю, как параллельную шину считать.
Сообщение отредактировал Prinz - Apr 15 2011, 12:00
|
|
|
|
|
Apr 16 2011, 15:12
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Строб заводите на ножку прерывания. Режим для этого прерывания используете FIQ. Прямо на ассемблере пишете код прерывания (из трех команд - чтение из порта, запись с автоинкрементом), помятуя, что в FIQ есть банкирование регистров и, следовательно, можно не сохранять регистры (некоторые, в общем за подробностями в мануал по ARM).
Кстати, в том же мане есть такой раздельчик - "Примеры кода". Там есть такой "Soft-DMA", именно через FIQ. В общем, может и успеть.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Apr 18 2011, 05:33
|
Частый гость
 
Группа: Участник
Сообщений: 184
Регистрация: 11-09-08
Пользователь №: 40 121

|
Цитата(kovigor @ Apr 15 2011, 18:02)  Боюсь, что никак. Слишком быстро. Или же без всякого таймера в цикле ждать фронтов строба и захватывать данные на шине, и то я ничего не обещаю. Я бы CPLD поставил или обычный регистр ... Плис не нужен, надо на контроллере. Сейчас буду пробовать на asm цикл писать. А команды асемблера для этого контроллера где можно глянуть? Цитата(Rst7 @ Apr 16 2011, 21:12)  Строб заводите на ножку прерывания. Режим для этого прерывания используете FIQ. Прямо на ассемблере пишете код прерывания (из трех команд - чтение из порта, запись с автоинкрементом), помятуя, что в FIQ есть банкирование регистров и, следовательно, можно не сохранять регистры (некоторые, в общем за подробностями в мануал по ARM).
Кстати, в том же мане есть такой раздельчик - "Примеры кода". Там есть такой "Soft-DMA", именно через FIQ. В общем, может и успеть. Про FIQ, тоже думал. А где в мане этот раздельчик? А можно примерчик на асемблере, если не сложно, а то на арм написания программ на асме у меня ещё не было.
|
|
|
|
|
Apr 18 2011, 07:36
|
Частый гость
 
Группа: Участник
Сообщений: 184
Регистрация: 11-09-08
Пользователь №: 40 121

|
Был бы рад краткому курсу по 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 выглядеь будет?
|
|
|
|
|
Apr 18 2011, 08:04
|
Частый гость
 
Группа: Участник
Сообщений: 184
Регистрация: 11-09-08
Пользователь №: 40 121

|
Цитата(kovigor @ Apr 18 2011, 13:52)  А вы посмотрите файл листинга и узнаете. От себя добавлю, что ваша идея почти наверняка обречена на неудачу. 4.5МГц - это явно очень быстро. А современные компиляторы генерируют ну почти оптимальный код, и чтобы сделать лучше, программируя на ассемблере, придется серьезно потрудиться ... CODE 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 мегагерц сейчас пиксели пропускаются.
Сообщение отредактировал IgorKossak - Apr 18 2011, 08:05
Причина редактирования: [codebox] !!!
|
|
|
|
|
Apr 18 2011, 08:35
|
Частый гость
 
Группа: Участник
Сообщений: 184
Регистрация: 11-09-08
Пользователь №: 40 121

|
Цитата(kovigor @ Apr 18 2011, 14:17)  А вы попробуйте сначала сделать вообще без прерывания (для проверки). Запретите все прерывания и просто в цикле ждите фронтов синхроимпульсов или того, что у вас там вместо них, и по этим фронтам читайте ваши данные. Успеете ? Ну, тогда и с прерываниями можно потягаться. Нет ? Тогда и пробовать нечего ... Так я перед вызовам функции так и делаю: __disable_interrupt(); CameraTest(); Это я Вам привёл мой код, который я сейчас тестирую. Так, что все прерывания запрещены. ( Цитата(Слесарь @ Apr 18 2011, 14:18)  Я при тактовой частоте 24 мГц PIC контроллера, устойчиво, с программной фильтрацией промежуточного пограничного состояние аналогового сигнала, считываю с порта частоту до 200 кГц. А так вообще, думаю что 1мкс импульс регистрировал бы портом без проблем. Мне надо 4,5MHz.
|
|
|
|
|
Apr 18 2011, 08:46
|
Частый гость
 
Группа: Участник
Сообщений: 184
Регистрация: 11-09-08
Пользователь №: 40 121

|
Цитата(Слесарь @ Apr 18 2011, 14:36)  Тогда надо использовать встроенный специальный счетчик, если он есть в МК По стробу надо считывать данные ещё 8 bit. Я не верю, что контроллер на частоте 72 MHz, не может счиать каки-то хилых 5 MHz. Может есть какой способ?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|