Страница 1 из 1

UART RS-485

Добавлено: Пн янв 13, 2014 11:00:31
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;
}

Re: UART RS-485

Добавлено: Пн янв 13, 2014 14:08:13
GARMIN
Ну вы хотя бы проверили бит готовности USART и бит окончания передачи, а то такая грустная программа...

Re: UART RS-485

Добавлено: Пн янв 13, 2014 14:54:41
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;
        }

Re: UART RS-485

Добавлено: Пн янв 13, 2014 15:13:33
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;
        }
Я либо что-то не догоняю, либо покажите дураку...

Re: UART RS-485

Добавлено: Пн янв 13, 2014 15:35:43
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)));
}

Re: UART RS-485

Добавлено: Пн янв 13, 2014 15:52:32
Gurvinok
В чем разница
это

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

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

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

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

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

(UCSRA & 0x20) >> 5
Или я не прав?

Re: UART RS-485

Добавлено: Пн янв 13, 2014 15:57:16
Gurvinok
К стати предыдущий пример тоже не работает.

Re: UART RS-485

Добавлено: Вс янв 19, 2014 23:54:36
Gurvinok
Вопрос можно закрывать. Разобрался. Вся проблема была в камне. Я по ходу превысил лимит перезаписей. Он бедняга в UART начал че попало пихать. И прерывания по совпадению таймера тоже плавать начали. С новым все ОК.