Настраиваю прием МИДИ сообщений через UART на примере команды 0xFE –это Active Sensing (System Real-Time Messages), генерируется вне зависимости от нажатия нот – что удобно. Идет только эта команда, что успешно проверяется утилитами МИДИ монитор, с отключенными фильтрами. Период команды примерно около 1 сек. Для контроля кода приема применяю ЖКИ индикатор. Но на нем устойчиво отражается FC. Предполагаю: 1) ошибка в выводе на индикатор., битовый сдвиг и т.п. 2) ошибка в Коэф деления проца. 3) распиновка миди кабеля (инверсия и т.п.) 4) инверсия в оптроне/ток-уровень, но стандартная схема, а именно: при наличии тока в петле, оптрон открывается и формирует уровень «нуля» (0 вольт) = стартовому биту для UART на порту МК. Делал через буфер, с последующим "неторопливым" выводом его... та же проблема. Вообще, если FF -то FE, если FE - то FC, если FC - то выводится F8... типа сдвига 1 влево... Библа LCD распространенная в Инете...
#define F_CPU 8000000L //#define USART1_F 31250 int main(void) { UCSR1A=0x00; //прием с прерыванием, передача. 8-N-1 UCSR1B=0x98; UCSR1C=0x86;
UBRR1H=0x00; UBRR1L=0x0F; // явное указания коэф. Деления, код 0х10 также не катит(( sei(); }
ISR(USART1_RXC_vect) {
unsigned char lef = 0; if (UCSR1A & (1<<7)) { // разбираем по тетрадам, затем в ASCII и на индикатор
lef = (UDR1>>4) ; if (lef <10) { lef=lef+0x30; } else { lef=lef+0x37; } lcd_dat(lef);
lef = UDR1 & 0x0F; if (lef < 10) { lef=lef+0x30; } else { lef=lef+0x37; } lcd_dat(lef); } }
|