COKPOWEHEU писал(а):Они там зачем-то написаны, хотя по смыслу именно в тех местах бесполезны. Вот и интересно.
По идее контроллер должен успевать, но не UART. Если ширина импульса 0.33 мкс и пауза между ними 0.7 мкс, период колебаний 1.03 мкс что соответствует частоте 971 кГц, по 10 бит на посылку UART получается требуется скорость обмена не менее 9.7 мегабит в секунду. Даже если такое позволяет контроллер (хотя не позволяет, его частота должна быть более 77 МГц), стабильность будет на нуле.
На счет того, что данные не соответствуют ожиданиям - я не знаю, какая там схема, вдруг не все напряжения успевают установиться.
Прерывание прервано быть не может, если этого специально не разрешить, но здесь этого не делается. sei сразу перед reti не успеет отработать.
схема довольно простая, все напрямую без резисторов и конденсаторов,
то, что я подключаюсь к устройству и оно продолжает стабильно работать говорит о том, что какие то серьезные помехи я не вношу
посылки идут не постоянно, а пачками, на это я и рассчитываю судя по тому, что у FT245 два буфера 384 и 128 байт, мне на буфер байт 700 будет за глаза
провел эксперимент:
-включил только прерывание INT0 по нарастающему фронту
-записал данные с PINA в буфер на 255 байт
-отключил прерывание по INT0
-включил прерывание по UDRE1
-отправил данные с буфера на комп
опять получил ерунду((((
Код: Выделить всё
#define UART_UDRTE_EN (UCSR1B |= _BV(UDRIE1))
#define UART_UDRTE_DES (UCSR1B &= ~_BV(UDRIE1))
#define EXT_INT0_EN (EIMSK |= _BV(INT0))
#define EXT_INT0_DES (EIMSK &= ~_BV(INT0))
#define DATA PINA
unsigned char countData = 0;
unsigned char dataBuffer[255];
unsigned char dataBuff;
unsigned char countSendBuffer = 0;
ISR(INT0_vect){
if(countData < 255){
dataBuffer[countData] = DATA;
countData ++;
} else {
EXT_INT0_DES;
UART_UDRTE_EN;
}
}
ISR(USART1_UDRE_vect){
UDR1 = dataBuffer[countSendBuffer];
countSendBuffer ++;
if(countSendBuffer == countData){
UART_UDRTE_DES;
}
}
если не через буфер, а напрямую в UDR1 кидать, то вначале пару байт правильные приходят