ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
18 апреля
705036
Точка опоры (11.10.2016 14:37 - 23.10.2016 13:27, просмотров: 3968)
Попадалась-ли кому такая фигня в синхронном USART для 51-х, что при приёме контроллер не генерирует синхроимпульсы на TxD? Новости: Правильный ответ, как и следовало ожидать, - "сам дурак". Конструкция "temp2 = (temp2 << 8) + UART_getc();" выполняется существенно дольше (около 2,5 раз), чем "UART_putc(0xA5);". Поэтому надо было при существенно другом времени развёртки выискивать пачки синхроимпульсов при имитации приёма. После укорочения (для теста) этой конструкции до "temp2 = UART_getc();" и установки синхронности (по таймеру) серий передач/приёмов - "потерянные" синхроимпульсы не замедлили найтись. Код и хекс - в архиве. Правда, как я уже отметил, это уже только академический интерес представляло, и синхронный режим USART'а мне вообще не был нужен. Былое: Atmel'овский мануал на стр. 101 говорит, что синхроимпульсы на TxD в синхронном режиме (Mode 0) формируются и при передаче и при чтении.
RECEIVE enables SHIFT CLOCK to the alternate output function line of P3.1. Shift CLOCK makes transitions at S3P1 and S6P1 of every machine cycle.
Под рукой старенький уже T89C51RD2 (ещё без A впереди) и на нём наблюдаю осциллографом такую фигню на тестовой программе (в зависимости от состояния одного из пинов она генерирует либо только синхронную передачу, либо передачу и прием вперемешку). И такая-же старая AT89S8253 - с тем-же результатом. do { if (P1 & 0x1) { // 1 передача и 4 чтения, если P1.0 = 1 UART_putc(0xA5); temp2 = UART_getc(); temp2 = (temp2 << 8) + UART_getc(); temp2 = (temp2 << 8) + UART_getc(); temp2 = (temp2 << 8) + UART_getc(); } else { // 5 передач, если P1.0 = 0 UART_putc(0x80); UART_putc(0x08); UART_putc(0xAA); UART_putc(0x55); UART_putc(0x11); tact_delay(1); // small delay } if (!(--temp1)) LED_toggle(); // Мигать индикатором для контроля } while (1);
Заказать импортные ЭК - https://shop.fulcrum.ru/buy