реклама на сайте
подробности

 
 
5 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Какую максимальную частоту можно считать с портов контроллера?, LPC2478
Prinz
сообщение Apr 15 2011, 11:24
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 184
Регистрация: 11-09-08
Пользователь №: 40 121



Использую контроллер LPC2478.
Перефирия на частоте 72МГц.
Подскажите пожалуйста какую максимальную частоту можно считать этим контроллером с его портов?
И как будет быстрее в прерывании по изменении порта или в лмнлвнлм цикле?
Как правильно настроить ИАР для этого?
Поделитесь Ваши опытом пожалуйста. Самостоятельно у меня получилось считать только до 1 MHz. И то с натягом.
Заранее спасибо.
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 15 2011, 11:30
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Для точного захвата внешних сигналов следует использовать аппаратные таймеры с функцией capture или counter. GPIO для этого плохо подходит.
Go to the top of the page
 
+Quote Post
Prinz
сообщение Apr 15 2011, 11:37
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
kovigor
сообщение Apr 15 2011, 12:02
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(Prinz @ Apr 15 2011, 14:37) *
И как это делается, привидите примерчик пожалуйста.


Боюсь, что никак. Слишком быстро. Или же без всякого таймера в цикле ждать фронтов строба и захватывать данные на шине, и то я ничего не обещаю. Я бы CPLD поставил или обычный регистр ...
Go to the top of the page
 
+Quote Post
Rst7
сообщение Apr 16 2011, 15:12
Сообщение #5


Йа моск ;)
******

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



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

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


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Prinz
сообщение Apr 18 2011, 05:33
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 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, тоже думал.
А где в мане этот раздельчик?
А можно примерчик на асемблере, если не сложно, а то на арм написания программ на асме у меня ещё не было.
Go to the top of the page
 
+Quote Post
Prinz
сообщение Apr 18 2011, 07:36
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 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 выглядеь будет?
Go to the top of the page
 
+Quote Post
kovigor
сообщение Apr 18 2011, 07:52
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(Prinz @ Apr 18 2011, 10:36) *
Вот этотим кусочком я пытаюсь сосчитать стробы.
Подскажите, как он на asm выглядеь будет?


А вы посмотрите файл листинга и узнаете. От себя добавлю, что ваша идея почти наверняка обречена на неудачу. 4.5МГц - это явно очень быстро. А современные компиляторы генерируют ну почти оптимальный код, и чтобы сделать лучше, программируя на ассемблере, придется серьезно потрудиться ...
Go to the top of the page
 
+Quote Post
Prinz
сообщение Apr 18 2011, 08:04
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 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] !!!
Go to the top of the page
 
+Quote Post
kovigor
сообщение Apr 18 2011, 08:17
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(Prinz @ Apr 18 2011, 11:04) *
Может вы своим провессиональным взглядом, что подскажите??? Где, что надо умотать, чтобы шустрее работало.
У меня даже 1 мегагерц сейчас пиксели пропускаются.


А вы попробуйте сначала сделать вообще без прерывания (для проверки). Запретите все прерывания и просто в цикле ждите фронтов синхроимпульсов или того, что у вас там вместо них, и по этим фронтам читайте ваши данные. Успеете ? Ну, тогда и с прерываниями можно потягаться. Нет ? Тогда и пробовать нечего ...
Go to the top of the page
 
+Quote Post
Слесарь
сообщение Apr 18 2011, 08:18
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 884
Регистрация: 7-11-09
Из: Ростовская обл.
Пользователь №: 53 484



Я при тактовой частоте 24 мГц PIC контроллера, устойчиво, с программной фильтрацией промежуточного пограничного состояние аналогового сигнала, считываю с порта частоту до 200 кГц. А так вообще, думаю что 1мкс импульс регистрировал бы портом без проблем.
Go to the top of the page
 
+Quote Post
Prinz
сообщение Apr 18 2011, 08:35
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 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.
Go to the top of the page
 
+Quote Post
Слесарь
сообщение Apr 18 2011, 08:36
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 884
Регистрация: 7-11-09
Из: Ростовская обл.
Пользователь №: 53 484



Цитата(Prinz @ Apr 18 2011, 12:35) *
Мне надо 4,5MHz.

Тогда надо использовать встроенный специальный счетчик, если он есть в МК
Go to the top of the page
 
+Quote Post
Prinz
сообщение Apr 18 2011, 08:46
Сообщение #14


Частый гость
**

Группа: Участник
Сообщений: 184
Регистрация: 11-09-08
Пользователь №: 40 121



Цитата(Слесарь @ Apr 18 2011, 14:36) *
Тогда надо использовать встроенный специальный счетчик, если он есть в МК


По стробу надо считывать данные ещё 8 bit.
Я не верю, что контроллер на частоте 72 MHz, не может счиать каки-то хилых 5 MHz.
Может есть какой способ?
Go to the top of the page
 
+Quote Post
Слесарь
сообщение Apr 18 2011, 08:58
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 884
Регистрация: 7-11-09
Из: Ростовская обл.
Пользователь №: 53 484



проблема может статься в задержке распространения сигнала по проводникам. плавное нарастание сигнала на порту и соответсвенно неправильная фиксация сигнала. необходимо как-то прикинуть скорость нарастания сигнала при тактовой частоте 5 мГц и длине проводников.
Go to the top of the page
 
+Quote Post

5 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 09:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01527 секунд с 7
ELECTRONIX ©2004-2016