UART RS-485

Обсуждаем контроллеры компании Atmel.
Ответить
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 198
Зарегистрирован: Вт ноя 07, 2006 00:09:58
Откуда: Москва

Сообщение Gurvinok »

Всех с прошедшими праздниками.
Делаю небольшой девайс по мониторингу температуры. Головное устройство общается с ПК (тут все нормально), а вот датчик с головным связать надо по 485 интерфейсу. Вот тут и вопрос. Передаю и принимаю байты нормально без ошибок, а вот если пытаюсь передать от головного устройства байт и на датчике его проверить и при совпадении переслать его обратно, вот тут ничего не работает. Может кто подскажет, где может засесть баг. Датчик сделан на Мега8л. Пока пытаюсь общаться через преобразователь USB <=> RS-485
Вот основной код.

Код: Выделить всё

PORTD.2 = 0;  // max485  на чтение
delay_ms(50);
i = UDR;
if(i != 0)
{
PORTD.2 = 1; // max485 на запись
delay_ms(50);
UDR = i;
i = 0;
}
Я не волшебник, я только лечусь
Контактная информация:
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 960
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда

Сообщение GARMIN »

Ну вы хотя бы проверили бит готовности USART и бит окончания передачи, а то такая грустная программа...
Контактная информация:
Реклама
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 198
Зарегистрирован: Вт ноя 07, 2006 00:09:58
Откуда: Москва

Сообщение Gurvinok »

Не помогает.

Код: Выделить всё

        PORTD.2 = 0;  // max485  на чтение
        delay_ms(50);   
        
        if(RXC) 
        {
            i = UDR; // Если пришли данные, то читаем
            while(!UDRE) {}; // Сидим здесь пока не опустошится UDR
        }
        
        if(i != 0)
        {
        PORTD.2 = 1; // max485 на запись
        delay_ms(50);
        UDR = i;    
        while(!TXC) {}; // Ждем окончания передачи байта
        i = 0;
        }
Я не волшебник, я только лечусь
Контактная информация:
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 198
Зарегистрирован: Вт ноя 07, 2006 00:09:58
Откуда: Москва

Сообщение Gurvinok »

Вот такой вариант и он нормально работает в AVRStudio4, а в железе нет.

Код: Выделить всё

        PORTD.2 = 0;  // max485  на чтение
        delay_ms(50);   
        
        if((UCSRA & 0x80) >> 7) 
        {
            i = data; // Если пришли данные, то читаем
            while(!(UCSRA & 0x20) >> 5) {}; // Сидим здесь пока не опустошится UDR
        }
        
        if(i != 0)
        {
        PORTD.2 = 1; // max485 на запись
        delay_ms(50);
        UDR = i;    
        while(!(UCSRA & 0x40) >> 6) {}; // Ждем окончания передачи байта
        i = 0;
        }
Я либо что-то не догоняю, либо покажите дураку...
Я не волшебник, я только лечусь
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Сообщения: 502
Зарегистрирован: Чт фев 16, 2012 19:00:11

Сообщение zöner »

Код: Выделить всё

PORTD.2 = 0;
while (!(UCSRA & (1<<RXC)));
i = UDR;
if (i) {
  PORTD.2 = 1;
  delay_ms(1);
  UDR = i;
  while  (!(UCSRA & (1<<TXC)));
}
Реклама
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 198
Зарегистрирован: Вт ноя 07, 2006 00:09:58
Откуда: Москва

Сообщение Gurvinok »

В чем разница
это

Код: Выделить всё

(UCSRA & (1<<RXC))
и это

Код: Выделить всё

(UCSRA & 0x20)
Это же одно и тоже
Здесь я двигаю вправо на 5 для получения 1

Код: Выделить всё

(UCSRA & 0x20) >> 5
Или я не прав?
Я не волшебник, я только лечусь
Контактная информация:
Реклама
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 198
Зарегистрирован: Вт ноя 07, 2006 00:09:58
Откуда: Москва

Сообщение Gurvinok »

К стати предыдущий пример тоже не работает.
Я не волшебник, я только лечусь
Контактная информация:
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 198
Зарегистрирован: Вт ноя 07, 2006 00:09:58
Откуда: Москва

Сообщение Gurvinok »

Вопрос можно закрывать. Разобрался. Вся проблема была в камне. Я по ходу превысил лимит перезаписей. Он бедняга в UART начал че попало пихать. И прерывания по совпадению таймера тоже плавать начали. С новым все ОК.
Я не волшебник, я только лечусь
Контактная информация:
Ответить

Вернуться в «AVR»