Цитата
Необходимо снять лог некой шины, у которой частота в районе мегагерца.
Наивный, однако
После некоторых телодвижений - 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]