Zigrund 0 18 апреля, 2011 Опубликовано 18 апреля, 2011 · Жалоба проблема может статься в задержке распространения сигнала по проводникам. плавное нарастание сигнала на порту и соответсвенно неправильная фиксация сигнала. необходимо как-то прикинуть скорость нарастания сигнала при тактовой частоте 5 мГц и длине проводников. Фронты наблюдаю на осцилографе, всё красиво. Никаких завалов нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Слесарь 9 18 апреля, 2011 Опубликовано 18 апреля, 2011 · Жалоба У тебя есть осцилограф :05: Если бы у меня был осцилограф, я бы попробывал программно сгенерировать максимальную частоту на порту контроллера. Чтоб шла красиво. От этого, чисто по слесарски, прикинул бы максимально возможную частоту которую смог бы этим портом надежно фиксировать. Просто разделить частоту генерации на десять, вот и будет частота фиксации Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zigrund 0 18 апреля, 2011 Опубликовано 18 апреля, 2011 · Жалоба У тебя есть осцилограф :05: Если бы у меня был осцилограф, я бы попробывал программно сгенерировать максимальную частоту на порту контроллера. Чтоб шла красиво. От этого, чисто по слесарски, прикинул бы максимально возможную частоту которую смог бы этим портом надежно фиксировать. Просто разделить частоту генерации на десять, вот и будет частота фиксации Я так делал. Делал следующее. while(1) { FIO2SET_bit.P2_22 = 1; FIO2CLR_bit.P2_22 = 1; } И получилось всего 1 MHz. И это с 72 MHz? Такой навороченны кантроллер. Я тут очти всё запустил, а считать частоту не могу. ( Я ещё так забодяжил, тоже не помогло. void CameraTest(void) { BYTE str1[40]; DWORD PixelCount = 0; bool FlagReady = false; while(1) { m4: if(HSYNC == 0) { PixelCount = 0; goto m3; } goto m4; m3: if(HSYNC) goto m1; goto m3; m1: if(HSYNC == 0) goto m2; if(PCLK) { if(FlagReady) { //BmpBuff[PixelCount] = 0x56; PixelCount ++; FlagReady = false; } } else FlagReady = true; goto m1; m2: sprintf((char*)str1,"%u",PixelCount); lcd_put_str(10, 28, str1, 0x00FFFFFF,0); } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Слесарь 9 18 апреля, 2011 Опубликовано 18 апреля, 2011 · Жалоба Я так делал. Делал следующее. while(1) { FIO2SET_bit.P2_22 = 1; FIO2CLR_bit.P2_22 = 1; } И получилось всего 1 MHz. И это с 72 MHz? Такой навороченны кантроллер. Я тут очти всё запустил, а считать частоту не могу. ( Маловато, при учете что требуется 4 ... 8 тактов для грязной генерации на порту контроллера. Может все дело в конфигурации проца? Как там настроен умножитель частоты тактового генератора? Ведь кварц у тебя значительно меньшей частоты? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zigrund 0 18 апреля, 2011 Опубликовано 18 апреля, 2011 · Жалоба Маловато, при учете что требуется 4 ... 8 тактов для грязной генерации на порту контроллера. Может все дело в конфигурации проца? Как там настроен умножитель частоты тактового генератора? Ведь кварц у тебя значительно меньшей частоты? Да вроде всё верно. Вот мой код: void InitClock(void) { MAMCR_bit.MODECTRL = 0; MAMTIM_bit.CYCLES = 3; // FCLK > 40 MHz MAMCR_bit.MODECTRL = 2; // 1. Init OSC SCS_bit.OSCRANGE = 0; SCS_bit.OSCEN = 1; // 2. Wait for OSC ready while(!SCS_bit.OSCSTAT); // 3. Disconnect PLL PLLCON_bit.PLLC = 0; PLLFEED = 0xAA; PLLFEED = 0x55; // 4. Disable PLL PLLCON_bit.PLLE = 0; PLLFEED = 0xAA; PLLFEED = 0x55; // 5. Select source clock for PLL CLKSRCSEL_bit.CLKSRC = 1; // Selects the main oscillator as a PLL clock source. // 6. Set PLL settings 288 MHz PLLCFG_bit.MSEL = 24-1; PLLCFG_bit.NSEL = 2-1; PLLFEED = 0xAA; PLLFEED = 0x55; // 7. Enable PLL PLLCON_bit.PLLE = 1; PLLFEED = 0xAA; PLLFEED = 0x55; // 8. Wait for the PLL to achieve lock while(!PLLSTAT_bit.PLOCK); // 9. Set clk divider settings CCLKCFG = 4-1; // 1/4 Fpll - 72 MHz USBCLKCFG = 6-1; // 1/6 Fpll - 48 MHz PCLKSEL0 =0x55595555; // òàéìåð 0 72ÌÃö PCLKSEL1 =0x55555555; // 10. Connect the PLL PLLCON_bit.PLLC = 1; PLLFEED = 0xAA; PLLFEED = 0x55; // stop all Peripherals' clocks PCONP = 0xFFFFFFFF; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zigrund 0 18 апреля, 2011 Опубликовано 18 апреля, 2011 · Жалоба Коллеги, кто ещё что посоветует? Прерывание счиатете делать бессмыслено, если так в цикле считаьт не могу? Как - то даже стыдно за этот контроллер, 72 Mhz, а даже 1,1 поднять не может. Мега точно бы 1,1 подняла, а мне надо 4,5. Не понимаю, или я, или лыжи, или контроллер? ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 18 апреля, 2011 Опубликовано 18 апреля, 2011 · Жалоба Если бы у меня был осцилограф, я бы попробывал программно сгенерировать максимальную частоту на порту контроллера. Чтоб шла красиво. От этого, чисто по слесарски, прикинул бы максимально возможную частоту которую смог бы этим портом надежно фиксировать. Просто разделить частоту генерации на десять, вот и будет частота фиксации У меня был... я сгенерировал... http://electronix.ru/forum/index.php?showt...st&p=913156 можем прикинуть... раз 500000 в секунду словить можно рассчитывать. Процессор, правда, другой, но вряд ли на большее стоит надеяться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zigrund 0 18 апреля, 2011 Опубликовано 18 апреля, 2011 · Жалоба У меня был... я сгенерировал... http://electronix.ru/forum/index.php?showt...st&p=913156 можем прикинуть... раз 500000 в секунду словить можно рассчитывать. Процессор, правда, другой, но вряд ли на большее стоит надеяться. Вы имеете ввиду, что максимум 500 kHz считать можно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 18 апреля, 2011 Опубликовано 18 апреля, 2011 · Жалоба Я не верю, что контроллер на частоте 72 MHz, не может счиать каки-то хилых 5 MHz. Лучше поверьте. Известно, что GPIO - это тормоз. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 18 апреля, 2011 Опубликовано 18 апреля, 2011 · Жалоба Лучше поверьте. Известно, что GPIO - это тормоз. Наверное, дело не в GPIO, а в архитектуре и системе команд ARM. Напрямую ни к чему во всем громадном адресном пространстве не обратиться, все посредством косвенной адресации через регистры. Сначала загрузить адрес, потом по этому адресу прочитать, потом что-нибудь сделать, потом записать обратно. И так со всеми переменными, кроме локальных, которые удастся поместить в регистры. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zigrund 0 18 апреля, 2011 Опубликовано 18 апреля, 2011 · Жалоба Наверное, дело не в GPIO, а в архитектуре и системе команд ARM. Напрямую ни к чему во всем громадном адресном пространстве не обратиться, все посредством косвенной адресации через регистры. Сначала загрузить адрес, потом по этому адресу прочитать, потом что-нибудь сделать, потом записать обратно. И так со всеми переменными, кроме локальных, которые удастся поместить в регистры. Я тоже заметил по листингу, что уж через чур много команда на асемблере. По опыту написания программ на PIC, я бы 10 командами уложился, а там и куча целая. А какой выход? Или это гиблое дело. У меня ещё имеется кортекс с максимальной рабочей частотой 120 мегагерц. Может на нём попробывать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 18 апреля, 2011 Опубликовано 18 апреля, 2011 · Жалоба А какой выход? Или это гиблое дело. У меня ещё имеется кортекс с максимальной рабочей частотой 120 мегагерц. Может на нём попробывать? нет выхода :( Можете на 120MHz Cortex, будет быстрее, как понимаете, раза в 1.5 - 2. Еще шину замените на 16-битовую, читайте за один раз два байта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 18 апреля, 2011 Опубликовано 18 апреля, 2011 · Жалоба Во-первых, я не помню, но посмотрите, есть ли в Вашем камне Fast-GPIO. Если есть, то будет лучше. Если нет, то имейте в виду что: 1. Доступ к GPIO весит 7 тактов через APB. Значит надо минимизировать количество обращений. Оптимально сделать так, чтобы стробы и данные были в одном порту - например данные на битах 0-7, PCLK на бите 8, HSYNC на бите 9. Плюс выполнять код из ОЗУ. Тогда выглядеть это должно так: __ramfunc unsigned int GetScanLine(unsigned char *dest, unsigned int *port) { unsigned int v; unsigned char *d=dest; while((*port)&(1<<9)); //Ждем начала строки do { while(!((v=*port)&(1<<8))); //Ждем пикселя *d++=v; //Сохраняем while((v=*port)&(1<<8)); //Ждем конца строба пикселя, оптимальнее заменить на просто достаточную задержку } while(!(v&(1<<9))); //Пока не закончилась строка return d-dest; } void CameraTest(void) { ..... while(1) { while(!(FIO2PIN&(1<<9))); //А вдруг начало в середине строки PixelCount=GetScanLine(BmpBuff,&FIO2PIN); sprintf((char*)str1,"%u",PixelCount); lcd_put_str(10, 28, str1, 0x00FFFFFF,0); } О, написал, и увидел, что у Вас и так Fast-GPIO. Проверьте точные частоты ядра и периферии, ибо чтение для Fast-GPIO весит 3 такта, запись 2. PS И посмотрите на результат компиляции, будете вполне довольны, как на асме, не хуже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zigrund 0 19 апреля, 2011 Опубликовано 19 апреля, 2011 · Жалоба Во-первых, я не помню, но посмотрите, есть ли в Вашем камне Fast-GPIO. Если есть, то будет лучше. Если нет, то имейте в виду что: 1. Доступ к GPIO весит 7 тактов через APB. Значит надо минимизировать количество обращений. Оптимально сделать так, чтобы стробы и данные были в одном порту - например данные на битах 0-7, PCLK на бите 8, HSYNC на бите 9. Плюс выполнять код из ОЗУ. Тогда выглядеть это должно так: О, написал, и увидел, что у Вас и так Fast-GPIO. Проверьте точные частоты ядра и периферии, ибо чтение для Fast-GPIO весит 3 такта, запись 2. PS И посмотрите на результат компиляции, будете вполне довольны, как на асме, не хуже. Сделал, по Вашему совету. Все стробы считал, но записываь во внешнюю память уже не получается, не успевает: Вот мой последний оптимизированный код: void CameraTest(BYTE *BmpBuff) { unsigned char v; __disable_interrupt(); BYTE str1[40]; DWORD PixelCount = 0; bool FlagReady = false; m4: if(HSYNC == 0x0) { PixelCount = 0x0; goto m3; } goto m4; m3: if(HSYNC) goto m1; goto m3; m1: v = FIO2PIN2; if((v & 0x40) == 0x0) goto m2; if((v & 0x80)) { if(FlagReady) { //BmpBuff[PixelCount] = 0x56; PixelCount ++; //for(char i = 0;;); FlagReady = false; } } else FlagReady = true; goto m1; m2: sprintf((char*)str1,"%u",PixelCount); lcd_put_str(10, 28, str1, 0x00FFFFFF,0); goto m4; } Но это всего 1,1 МГц. А надо 4,5. Как я понял, надо искать другой контроллер. :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zigrund 0 19 апреля, 2011 Опубликовано 19 апреля, 2011 · Жалоба void CameraTest(BYTE *BmpBuff) 92 { \ CameraTest: \ 00000000 F0402DE9 PUSH {R4-R7,LR} \ 00000004 2CD04DE2 SUB SP,SP,#+44 \ 00000008 0040B0E1 MOVS R4,R0 93 unsigned char v; 94 __disable_interrupt(); \ 0000000C 00000FE1 MRS R0,CPSR \ 00000010 C00080E3 ORR R0,R0,#0xC0 \ 00000014 00F021E1 MSR CPSR_c,R0 95 BYTE str1[40]; 96 DWORD PixelCount = 0; \ 00000018 0000A0E3 MOV R0,#+0 \ 0000001C 0060B0E1 MOVS R6,R0 97 bool FlagReady = false; \ 00000020 0000A0E3 MOV R0,#+0 \ 00000024 0070B0E1 MOVS R7,R0 98 m4: if(HSYNC == 0x0) \ ??CameraTest_0: \ 00000028 AF01E0E3 MVN R0,#-1073741781 \ 0000002C FE0DC0E3 BIC R0,R0,#0x3F80 \ 00000030 0200D0E5 LDRB R0,[R0, #+2] \ 00000034 400010E3 TST R0,#0x40 \ 00000038 0200001A BNE ??CameraTest_1 99 { 100 PixelCount = 0x0; \ 0000003C 0000A0E3 MOV R0,#+0 \ 00000040 0060B0E1 MOVS R6,R0 101 goto m3; \ 00000044 000000EA B ??CameraTest_2 102 } 103 goto m4; \ ??CameraTest_1: \ 00000048 F6FFFFEA B ??CameraTest_0 104 m3: if(HSYNC) goto m1; \ ??CameraTest_2: \ 0000004C AF01E0E3 MVN R0,#-1073741781 \ 00000050 FE0DC0E3 BIC R0,R0,#0x3F80 \ 00000054 0200D0E5 LDRB R0,[R0, #+2] \ 00000058 400010E3 TST R0,#0x40 \ 0000005C 0000001A BNE ??CameraTest_3 105 goto m3; \ ??CameraTest_4: \ 00000060 F9FFFFEA B ??CameraTest_2 106 m1: v = FIO2PIN2; \ ??CameraTest_3: \ 00000064 AF01E0E3 MVN R0,#-1073741781 \ 00000068 FE0DC0E3 BIC R0,R0,#0x3F80 \ 0000006C 0200D0E5 LDRB R0,[R0, #+2] \ 00000070 0050B0E1 MOVS R5,R0 107 if((v & 0x40) == 0x0) goto m2; \ 00000074 400015E3 TST R5,#0x40 \ 00000078 0B00001A BNE ??CameraTest_5 108 if((v & 0x80)) 109 { 110 if(FlagReady) 111 { 112 //BmpBuff[PixelCount] = 0x56; 113 PixelCount ++; 114 //for(char i = 0;;); 115 FlagReady = false; 116 } 117 } 118 else FlagReady = true; 119 goto m1; 120 m2: sprintf((char*)str1,"%u",PixelCount); \ 0000007C 0620B0E1 MOVS R2,R6 \ 00000080 ........ ADR R1,??DataTable3 ;; 0x25, 0x75, 0x00, 0x00 \ 00000084 04008DE2 ADD R0,SP,#+4 \ 00000088 ........ BL sprintf 121 lcd_put_str(10, 28, str1, 0x00FFFFFF,0); \ 0000008C 0000A0E3 MOV R0,#+0 \ 00000090 00008DE5 STR R0,[SP, #+0] \ 00000094 FF34E0E3 MVN R3,#-16777216 \ 00000098 04208DE2 ADD R2,SP,#+4 \ 0000009C 1C10A0E3 MOV R1,#+28 \ 000000A0 0A00A0E3 MOV R0,#+10 \ 000000A4 ........ BL _Z11lcd_put_strttPhjj 122 goto m4; \ 000000A8 DEFFFFEA B ??CameraTest_0 \ ??CameraTest_5: \ 000000AC 800015E3 TST R5,#0x80 \ 000000B0 0600000A BEQ ??CameraTest_6 \ 000000B4 FF7017E2 ANDS R7,R7,#0xFF ;; Zero extend \ 000000B8 000057E3 CMP R7,#+0 \ 000000BC 0500000A BEQ ??CameraTest_7 \ 000000C0 016096E2 ADDS R6,R6,#+1 \ 000000C4 0000A0E3 MOV R0,#+0 \ 000000C8 0070B0E1 MOVS R7,R0 \ 000000CC 010000EA B ??CameraTest_7 \ ??CameraTest_6: \ 000000D0 0100A0E3 MOV R0,#+1 \ 000000D4 0070B0E1 MOVS R7,R0 \ ??CameraTest_7: \ 000000D8 E1FFFFEA B ??CameraTest_3 \ 000000DC REQUIRE _A_FIO2PIN 123 } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться