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

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

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

 

Фронты наблюдаю на осцилографе, всё красиво. Никаких завалов нет.

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


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

У тебя есть осцилограф :05:

 

Если бы у меня был осцилограф, я бы попробывал программно сгенерировать максимальную частоту на порту контроллера. Чтоб шла красиво. От этого, чисто по слесарски, прикинул бы максимально возможную частоту которую смог бы этим портом надежно фиксировать. Просто разделить частоту генерации на десять, вот и будет частота фиксации

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


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

У тебя есть осцилограф :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);    
      }
    }

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


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

Я так делал. Делал следующее.

 

while(1)

{

FIO2SET_bit.P2_22 = 1;

FIO2CLR_bit.P2_22 = 1;

}

 

И получилось всего 1 MHz. И это с 72 MHz?

Такой навороченны кантроллер. Я тут очти всё запустил, а считать частоту не могу. (

Маловато, при учете что требуется 4 ... 8 тактов для грязной генерации на порту контроллера. Может все дело в конфигурации проца? Как там настроен умножитель частоты тактового генератора? Ведь кварц у тебя значительно меньшей частоты?

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


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

Маловато, при учете что требуется 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;
}

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


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

Коллеги, кто ещё что посоветует?

Прерывание счиатете делать бессмыслено, если так в цикле считаьт не могу?

Как - то даже стыдно за этот контроллер, 72 Mhz, а даже 1,1 поднять не может. Мега точно бы 1,1 подняла, а мне надо 4,5.

Не понимаю, или я, или лыжи, или контроллер? )

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


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

Если бы у меня был осцилограф, я бы попробывал программно сгенерировать максимальную частоту на порту контроллера. Чтоб шла красиво. От этого, чисто по слесарски, прикинул бы максимально возможную частоту которую смог бы этим портом надежно фиксировать. Просто разделить частоту генерации на десять, вот и будет частота фиксации

У меня был... я сгенерировал...

http://electronix.ru/forum/index.php?showt...st&p=913156

можем прикинуть... раз 500000 в секунду словить можно рассчитывать.

Процессор, правда, другой, но вряд ли на большее стоит надеяться.

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


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

У меня был... я сгенерировал...

http://electronix.ru/forum/index.php?showt...st&p=913156

можем прикинуть... раз 500000 в секунду словить можно рассчитывать.

Процессор, правда, другой, но вряд ли на большее стоит надеяться.

 

Вы имеете ввиду, что максимум 500 kHz считать можно?

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


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

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

Лучше поверьте. Известно, что GPIO - это тормоз.

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


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

Лучше поверьте. Известно, что GPIO - это тормоз.

Наверное, дело не в GPIO, а в архитектуре и системе команд ARM. Напрямую ни к чему во всем громадном адресном пространстве не обратиться, все посредством косвенной адресации через регистры. Сначала загрузить адрес, потом по этому адресу прочитать, потом что-нибудь сделать, потом записать обратно. И так со всеми переменными, кроме локальных, которые удастся поместить в регистры.

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


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

Наверное, дело не в GPIO, а в архитектуре и системе команд ARM. Напрямую ни к чему во всем громадном адресном пространстве не обратиться, все посредством косвенной адресации через регистры. Сначала загрузить адрес, потом по этому адресу прочитать, потом что-нибудь сделать, потом записать обратно. И так со всеми переменными, кроме локальных, которые удастся поместить в регистры.

Я тоже заметил по листингу, что уж через чур много команда на асемблере. По опыту написания программ на PIC, я бы 10 командами уложился, а там и куча целая.

А какой выход? Или это гиблое дело. У меня ещё имеется кортекс с максимальной рабочей частотой 120 мегагерц. Может на нём попробывать?

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


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

А какой выход? Или это гиблое дело. У меня ещё имеется кортекс с максимальной рабочей частотой 120 мегагерц. Может на нём попробывать?

нет выхода :(

Можете на 120MHz Cortex, будет быстрее, как понимаете, раза в 1.5 - 2.

Еще шину замените на 16-битовую, читайте за один раз два байта.

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


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

Во-первых, я не помню, но посмотрите, есть ли в Вашем камне 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 И посмотрите на результат компиляции, будете вполне довольны, как на асме, не хуже.

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


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

Во-первых, я не помню, но посмотрите, есть ли в Вашем камне 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.

Как я понял, надо искать другой контроллер. :(

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


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

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              }

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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