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

Какую максимальную частоту можно считать с портов контроллера?

Использую контроллер LPC2478.

Перефирия на частоте 72МГц.

Подскажите пожалуйста какую максимальную частоту можно считать этим контроллером с его портов?

И как будет быстрее в прерывании по изменении порта или в лмнлвнлм цикле?

Как правильно настроить ИАР для этого?

Поделитесь Ваши опытом пожалуйста. Самостоятельно у меня получилось считать только до 1 MHz. И то с натягом.

Заранее спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для точного захвата внешних сигналов следует использовать аппаратные таймеры с функцией capture или counter. GPIO для этого плохо подходит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для точного захвата внешних сигналов следует использовать аппаратные таймеры с функцией capture или counter. GPIO для этого плохо подходит.

 

Я немного не понял, как это сделать.

Поясню свой вопрос. Имеется 8bit шина данных и три строба. Самый быстрый строб, ко которому надо записывать эти 8bit меняется с частотой 4,5 МегаГерца. Можно понизить до 2,25, но лучше не надо.

И как это делается, привидите примерчик пожалуйста.

 

Я это никогда не пользовал, поэтому не очень представляю, как параллельную шину считать.

Изменено пользователем Prinz

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И как это делается, привидите примерчик пожалуйста.

 

Боюсь, что никак. Слишком быстро. Или же без всякого таймера в цикле ждать фронтов строба и захватывать данные на шине, и то я ничего не обещаю. Я бы CPLD поставил или обычный регистр ...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Строб заводите на ножку прерывания. Режим для этого прерывания используете FIQ. Прямо на ассемблере пишете код прерывания (из трех команд - чтение из порта, запись с автоинкрементом), помятуя, что в FIQ есть банкирование регистров и, следовательно, можно не сохранять регистры (некоторые, в общем за подробностями в мануал по ARM).

 

Кстати, в том же мане есть такой раздельчик - "Примеры кода". Там есть такой "Soft-DMA", именно через FIQ. В общем, может и успеть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Боюсь, что никак. Слишком быстро. Или же без всякого таймера в цикле ждать фронтов строба и захватывать данные на шине, и то я ничего не обещаю. Я бы CPLD поставил или обычный регистр ...

 

Плис не нужен, надо на контроллере.

Сейчас буду пробовать на asm цикл писать. А команды асемблера для этого контроллера где можно глянуть?

 

Строб заводите на ножку прерывания. Режим для этого прерывания используете FIQ. Прямо на ассемблере пишете код прерывания (из трех команд - чтение из порта, запись с автоинкрементом), помятуя, что в FIQ есть банкирование регистров и, следовательно, можно не сохранять регистры (некоторые, в общем за подробностями в мануал по ARM).

 

Кстати, в том же мане есть такой раздельчик - "Примеры кода". Там есть такой "Soft-DMA", именно через FIQ. В общем, может и успеть.

 

Про FIQ, тоже думал.

А где в мане этот раздельчик?

А можно примерчик на асемблере, если не сложно, а то на арм написания программ на асме у меня ещё не было.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Был бы рад краткому курсу по 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 выглядеь будет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот этотим кусочком я пытаюсь сосчитать стробы.

Подскажите, как он на asm выглядеь будет?

 

А вы посмотрите файл листинга и узнаете. От себя добавлю, что ваша идея почти наверняка обречена на неудачу. 4.5МГц - это явно очень быстро. А современные компиляторы генерируют ну почти оптимальный код, и чтобы сделать лучше, программируя на ассемблере, придется серьезно потрудиться ...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вы посмотрите файл листинга и узнаете. От себя добавлю, что ваша идея почти наверняка обречена на неудачу. 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 мегагерц сейчас пиксели пропускаются.

Изменено пользователем IgorKossak
[codebox] !!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

У меня даже 1 мегагерц сейчас пиксели пропускаются.

 

А вы попробуйте сначала сделать вообще без прерывания (для проверки). Запретите все прерывания и просто в цикле ждите фронтов синхроимпульсов или того, что у вас там вместо них, и по этим фронтам читайте ваши данные. Успеете ? Ну, тогда и с прерываниями можно потягаться. Нет ? Тогда и пробовать нечего ...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я при тактовой частоте 24 мГц PIC контроллера, устойчиво, с программной фильтрацией промежуточного пограничного состояние аналогового сигнала, считываю с порта частоту до 200 кГц. А так вообще, думаю что 1мкс импульс регистрировал бы портом без проблем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вы попробуйте сначала сделать вообще без прерывания (для проверки). Запретите все прерывания и просто в цикле ждите фронтов синхроимпульсов или того, что у вас там вместо них, и по этим фронтам читайте ваши данные. Успеете ? Ну, тогда и с прерываниями можно потягаться. Нет ? Тогда и пробовать нечего ...

 

Так я перед вызовам функции так и делаю:

 

 

__disable_interrupt();

CameraTest();

 

Это я Вам привёл мой код, который я сейчас тестирую.

Так, что все прерывания запрещены. (

 

Я при тактовой частоте 24 мГц PIC контроллера, устойчиво, с программной фильтрацией промежуточного пограничного состояние аналогового сигнала, считываю с порта частоту до 200 кГц. А так вообще, думаю что 1мкс импульс регистрировал бы портом без проблем.

Мне надо 4,5MHz.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне надо 4,5MHz.

Тогда надо использовать встроенный специальный счетчик, если он есть в МК

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда надо использовать встроенный специальный счетчик, если он есть в МК

 

По стробу надо считывать данные ещё 8 bit.

Я не верю, что контроллер на частоте 72 MHz, не может счиать каки-то хилых 5 MHz.

Может есть какой способ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

проблема может статься в задержке распространения сигнала по проводникам. плавное нарастание сигнала на порту и соответсвенно неправильная фиксация сигнала. необходимо как-то прикинуть скорость нарастания сигнала при тактовой частоте 5 мГц и длине проводников.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...