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

 
 
> лог некой шины, Как это реализовать более оптимально?
Sirko
сообщение Jun 29 2011, 14:26
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795



Необходимо снять лог некой шины, у которой частота в районе мегагерца.
Код простой
Код
u08 array[1000];
u08* pArr = &array[999];
while(pArr >= array)
    *pArr-- = PINA;
У меня получается приблизительно 18 тактов на цикл. Можно ли это улучшить?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Sirko
сообщение Jul 2 2011, 18:33
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795



Цитата
Необходимо снять лог некой шины, у которой частота в районе мегагерца.

Наивный, однако wink.gif

После некоторых телодвижений - Mega162 была задвинута в сторонку.
Еще после некоторых телодвижениий эйфории от юзания XMega тоже поубавилось.

В конечном итоге, в ходе издевательств над собой и процом, оказалось, что Мега, погнанная до 48Мгц с четырьмя тактами на одно измерение, судя по всему, не отражает достоверно состояние шины т.к. есть одиночные показания некоторых бит. Стало быть, есть вероятность, что какие-нибудь данные могут проскочить мимо.
Что-ж, видать, не судьба.

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

Исходник приложу - вдруг какие-нибудь мысли появятся.
CODE
typedef unsigned char u08;
typedef unsigned int u16;
typedef unsigned long u32;

#define F_CPU 48000000UL

#include <avr/io.h>
#include <util/delay.h>


#define USART USARTC0
#define OnLight PORTQ.OUTCLR = PIN2_bm
#define OffLight PORTQ.OUTSET = PIN2_bm
#define ToggleLight PORTQ.OUTTGL = PIN2_bm
#define IsPressedButton (PORTQ.IN & PIN3_bm)

#define GetPortOne PORTK.IN
#define GetPortSecond PORTK.IN

#define ScanPorts10(p) do{*p-- = GetPortOne; *p-- = GetPortSecond; /* 0 */\
*p-- = GetPortOne; *p-- = GetPortSecond; /* 1 */\
*p-- = GetPortOne; *p-- = GetPortSecond; /* 2 */\
*p-- = GetPortOne; *p-- = GetPortSecond; /* 3 */\
*p-- = GetPortOne; *p-- = GetPortSecond; /* 4 */\
*p-- = GetPortOne; *p-- = GetPortSecond; /* 5 */\
*p-- = GetPortOne; *p-- = GetPortSecond; /* 6 */\
*p-- = GetPortOne; *p-- = GetPortSecond; /* 7 */\
*p-- = GetPortOne; *p-- = GetPortSecond; /* 8 */\
*p-- = GetPortOne; *p-- = GetPortSecond; /* 9 */}while(0)

#define ScanPorts100(p) do{ScanPorts10(p); /* 0 */\
ScanPorts10(p); /* 1 */\
ScanPorts10(p); /* 2 */\
ScanPorts10(p); /* 3 */\
ScanPorts10(p); /* 4 */\
ScanPorts10(p); /* 5 */\
ScanPorts10(p); /* 6 */\
ScanPorts10(p); /* 7 */\
ScanPorts10(p); /* 8 */\
ScanPorts10(p); /* 9 */}while(0)

#define ScanPorts1000(p) do{ScanPorts100(p); /* 0 */\
ScanPorts100(p); /* 1 */\
ScanPorts100(p); /* 2 */\
ScanPorts100(p); /* 3 */\
ScanPorts100(p); /* 4 */\
ScanPorts100(p); /* 5 */\
ScanPorts100(p); /* 6 */\
ScanPorts100(p); /* 7 */\
ScanPorts100(p); /* 8 */\
ScanPorts100(p); /* 9 */}while(0)


#define PutChar(ch) do{}while(!(USART.STATUS & USART_DREIF_bm));\
USART.DATA = ch;


#define SIZE_ARRAY 8000
unsigned char array[SIZE_ARRAY];

void sendDigit(u16 digit){
PutChar(digit/1000 + '0'); digit %= 1000;
PutChar(digit/100 + '0'); digit %= 100;
PutChar(digit/10 + '0'); digit %= 10;
PutChar(digit + '0');
PutChar(' ');
PutChar(' ');
}

void sendBusState(u08 state){
for(u08 i=0; i<8; ++i){
PutChar(state & _BV(7) ? '1' : '0');
PutChar('\t');
state <<= 1;
}
}

int main(void){

OSC.XOSCCTRL=0x4b; // диапазон: 2-9 МГц, внешний резонатор, с временем запуска 16 000 циклов
OSC.CTRL=0x08; // включаем генератор на внешнем кварцевом резонаторе
while(!(OSC.STATUS&0x08)); // ждём готовности генератора на внешнем кварцевом резонаторе

OSC.PLLCTRL=0xc6; // внешний источник синхро, множитель=6
OSC.CTRL=0x18; // включаем синтезатор частоты
while(!(OSC.STATUS&0x10)); // ждём готовности синтезатора частоты

CPU_CCP=0xd8; // разрешить (сигнатурой) изменение важного регистра (следущая строка)
CLK.CTRL=0x04; // источник системной синхронизации - синтезатор частоты
CLK.PSCTRL=0x00; // Коэф. деления предделителей A, B и C = 1.

PORTC.DIRSET = PIN3_bm;
PORTC.DIRCLR = PIN2_bm;

USART.CTRLC = (uint8_t) USART_CHSIZE_8BIT_gc | USART_PMODE_DISABLED_gc;
USART.BAUDCTRLA = (u08)289; // Битрейт 921600 при 48МГц clock
USART.BAUDCTRLB = (289 >> 8) | ((-7) << USART_BSCALE0_bp);
USART.CTRLB |= USART_TXEN_bm;

PORTQ.DIRSET = PIN2_bm; // PQ2 Лампа
PORTQ.DIRCLR = PIN3_bm; // PQ3 Кнопка
PORTQ.PIN3CTRL = PORT_OPC_WIREDORPULL_gc; // Подтяжка вниз


PORTK.DIR = PORTJ.DIR = 0;
PORTJ.PIN0CTRL =
PORTJ.PIN1CTRL =
PORTJ.PIN2CTRL =
PORTJ.PIN3CTRL =
PORTJ.PIN4CTRL =
PORTJ.PIN5CTRL =
PORTJ.PIN6CTRL =
PORTJ.PIN7CTRL =
PORTK.PIN0CTRL =
PORTK.PIN1CTRL =
PORTK.PIN2CTRL =
PORTK.PIN3CTRL =
PORTK.PIN4CTRL =
PORTK.PIN5CTRL =
PORTK.PIN6CTRL =
PORTK.PIN7CTRL = PORT_OPC_WIREDANDPULL_gc; // Подтяжка вверх


while(1){

while(!IsPressedButton){
_delay_ms(250);
ToggleLight;
}

u08 *p = &array[SIZE_ARRAY-1];

while(!(PORTJ.IN & PIN7_bm)); // Ждать появления питания на девайсе

ScanPorts1000(p);
ScanPorts1000(p);
ScanPorts1000(p);
ScanPorts1000(p);

p = &array[SIZE_ARRAY-1];
u16 index = SIZE_ARRAY-1;

PutChar('-'); PutChar('-'); PutChar('-'); PutChar('-');
static u16 currentSample = 0;
sendDigit(currentSample++); PutChar('\n'); PutChar('\r');

do{
sendDigit(index--);
PutChar('\t');

//sendBusState(*p--);
//PutChar('\t');

sendBusState(*p);
PutChar('\n');
PutChar('\r');
static u08 pause = 0;
if(!pause--)
_delay_ms(10); // Для компенсации "несинхронности UART"
}while(p-- != array);

PutChar('\n');
PutChar('\r');
PutChar('\n');
PutChar('\r');
PutChar('\n');
PutChar('\r');

_delay_ms(500);
}
}


Сообщение отредактировал IgorKossak - Jul 2 2011, 20:08
Причина редактирования: [codebox]
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jul 2 2011, 20:22
Сообщение #3


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(Sirko @ Jul 2 2011, 17:33) *
Наивный, однако wink.gif

Да, наивный и упрямый, поскольку, чтобы считать сигнал около мегагерца, нужна частота выборок около двух мегагерц. Следовательно, при тактовой частоте проца 20 МГц, необходимое число тактов на цикл 20/2=10 машинных циклов. Десяти циклов должно хватить за глаза. Скажу так, за 5 циклов можно считать из порта, записать в память, передвинуть указатель и проверить его на конец массива. Ну и ещё чего-нибудь, скажем помигать светодиодом и опросить кнопки. Ну или непрерывно писать в буфер циклически и по запросу выдавать весь массив, который записан на текущее время.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Sirko   лог некой шины, Как это реализовать более оптимально?   Jun 29 2011, 14:26
- - galjoen   Цитата(Sirko @ Jun 29 2011, 18:26) У меня...   Jun 29 2011, 14:54
- - kovigor   Цитата(Sirko @ Jun 29 2011, 17:26) У меня...   Jun 29 2011, 15:00
- - Sirko   Цитатаменее чем за 20 тактов не только...Возможно,...   Jun 29 2011, 16:08
- - =GM=   Цитата(Sirko @ Jun 29 2011, 13:26) Можно ...   Jun 29 2011, 16:10
|- - demiurg_spb   У xMega есть DMA... Правда xMega живьём не видел и...   Jun 29 2011, 17:37
|- - V_G   Цитата(demiurg_spb @ Jun 30 2011, 04:37) ...   Jun 30 2011, 05:02
- - Sirko   Цитатаи не знаюАналогично. Сам сегодня щупаю впер...   Jun 29 2011, 17:49
|- - kovigor   Цитата(Sirko @ Jun 29 2011, 20:49) Сам се...   Jun 29 2011, 18:35
- - Sirko   ЦитатаНа асме можно улучшить до 3 тактов.В три так...   Jun 29 2011, 20:34
|- - =GM=   Цитата(Sirko @ Jun 29 2011, 19:34) В три ...   Jun 30 2011, 13:09
- - Палыч   Цитата(Sirko @ Jun 29 2011, 18:26) У меня...   Jun 30 2011, 04:32
- - alexeyv   ЦитатаУ меня получается приблизительно 18 тактов н...   Jun 30 2011, 06:05
|- - rx3apf   Цитата(alexeyv @ Jun 30 2011, 10:05) Отко...   Jun 30 2011, 15:41
- - Sirko   Странновато как-то: Попробовал на ноуте скомпилить...   Jun 30 2011, 09:48
- - alexeyv   ЦитатаА в пятой студии свой компилятор? Так же как...   Jul 1 2011, 13:07
- - Sirko   ЦитатаСкажу так, за 5 циклов можно считать, записа...   Jul 2 2011, 20:50
|- - rx3apf   Цитата(Sirko @ Jul 3 2011, 00:50) Это че,...   Jul 2 2011, 21:45
- - Sirko   Попробую прокоментировать, если че поправьте. Loo...   Jul 2 2011, 22:33
|- - rx3apf   Цитата(Sirko @ Jul 3 2011, 02:33) Попробу...   Jul 3 2011, 07:11
- - Sirko   ЦитатаВот тут неправильно.Понял. Спасибо. Но тогд...   Jul 3 2011, 07:58
|- - rx3apf   Цитата(Sirko @ Jul 3 2011, 11:58) Понял. ...   Jul 3 2011, 09:45
- - Sirko   Спасибо, буду знать.   Jul 3 2011, 09:51
- - defunct   Цитата(Sirko @ Jul 3 2011, 12:51) Спасибо...   Jul 4 2011, 13:25


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

 


RSS Текстовая версия Сейчас: 12th August 2025 - 02:13
Рейтинг@Mail.ru


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