Работа с UART

Поклонники продукции Microchip Technology Inc тусуются тут.
DarkWolf
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср ноя 05, 2014 19:04:31

Работа с UART

Сообщение DarkWolf »

Всем доброго времени суток! Работаю над чтением по UART GPS данных с SIMM68m. Контроллер PIC18F47J53, кварц на 24 МГц. Программирую в среде MicroPascal используя встроенные библиотеки.

Подключаю UART на ножки RC0 - Rx, RC1 - Tx. Настраиваю на вход и выход, хоть в даташите сказано, что настройка автоматическая. Делаю ремап, инициализирую на скорость 115200, обрабатываю прерывание(в него заходит проверял), но вот в итоге буфер чтения всегда пустой. Не могу понять куда копать.

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

procedure interrupt;
var delim:string[2];
begin
  if PIR3.RC2IF=1 then begin  //Прерывание от GPS
     delim:=chr($0D)+chr($0A);
     if UART_Remappable_Data_Ready()<>0 then 
     begin
           RC6_bit :=1;
          UART_Remappable_Read_Text(gps_buff1,delim,200);
     end;
     PIR3.RC2IF:=0;
  end;
  
end;

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

procedure InitKernel();
begin
     pmpen_bit := 0;    // Отключаем паралельный порт
     CM1CON := 0;       // Отключаем анаоговые компараторы
     CM2CON := 0;

     //Настройка портов Аналог/Цифра  Все порты цифра
     ANCON0 := %11111111;
     ANCON1 := %11111111;
         
      //Инициализация портов ввода вывода       1 - вход 0 - выход
     LATA:=0;
     TRISA:=%00101100;
     PORTA:=0;

     LATB :=0;
     TRISB := %11100001;
     PORTB := %00000000;

     LATC :=  0;
     TRISC := %00100001;
     PORTC:=  0;
    
     LATD :=0;
     TRISD := 0;
     PORTD:=0;

     //RE2 изначально равен 1 (дешифратор не активен)
     LATE :=0;
     TRISE := %00000000;
     PORTE:= %00000100;
     
     // Ремапим UART2
     Unlock_IOLOCK();
     PPS_Mapping(12, _OUTPUT, _TX2_CK2);
     PPS_Mapping(11, _INPUT, _RX2_DT2);
     Lock_IOLOCK();    
     
     //Инициализируем UART2
     UART_Remappable_Init(115200);
     //U2OD_bit :=1;
     delay_ms(100);

    // sim68_Sleep();  // Отправляем в сон навигатор
     //запуск часов
     Clock_write($0C,0);
     //Тестируем карту памяти
     FS_SDSel();
     // инициализируем карточку если ошибка выдаём сообщение и выключаемся
     if FS_SDinit()<>0 then begin
     repeat until PORTA.B5<>1;
            delay_ms(200);
            PowerOff;
     end;
     // включаем подсветку
     Filename := 'regul.cfg';
     pregLigth := FS_Config_Read(0);
     SendToWK2(0x01,pregLigth);
     delay_ms(500); //Делаем задержку перед включением подсветки
     // Сброс и инициализация LCD дисплея
     InitDisplay();
end;
Реклама
-=Vovka=-
Опытный кот
Сообщения: 844
Зарегистрирован: Пн апр 11, 2011 10:08:52

Re: Работа с UART

Сообщение -=Vovka=- »

Лично я с новым для меня оборудованием поступаю так: подключаю к компьютеру через переходник и при помощи программы RS232 отлаживаю диалог, а потом уже подключаю к микроконтроллеру ;)
Реклама
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25261
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Работа с UART

Сообщение КРАМ »

В ПЕРВУЮ очередь настраивают эхо. В части МК даже есть такой режим - ничего не надо перемыкать.
-=Vovka=-
Опытный кот
Сообщения: 844
Зарегистрирован: Пн апр 11, 2011 10:08:52

Re: Работа с UART

Сообщение -=Vovka=- »

Режим эха? Что-то не припомню такого в этом семействе...
"Ничего не надо перемыкать" - а если порт битый? Толку от эха?
А если у SIMM68m проблема с портом, то как обмен отлаживать?
ТС имеет ДВА не проверенных устройства... Ладно, пусть шаманит, может угадает... ;)
В общем лично мне не понятен совет КРАМ-а...
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25261
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Работа с UART

Сообщение КРАМ »

Совет очень простой. Проверить УАРТ контроллера. Стандартная процедура, прежде чем подключаться к другому устройству.
Реклама
DarkWolf
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср ноя 05, 2014 19:04:31

Re: Работа с UART

Сообщение DarkWolf »

Спасибо за советы! Uart устройства работает, проверял осцилографам, пачки данных идут и так же приходят на контроллер. В начале были неправильно соеденены устройство и контроллер TX<->TX, Rx<->RX, исправив это появилась новая проблема.. после

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

UART_Remappable_Init(115200);
Контроллер виснет.. Пробывал менять скорость ничего не помогает.
Реклама
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25261
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Работа с UART

Сообщение КРАМ »

Контроллер не умеет виснуть. Контроллер может уйти на нештатное исполнение кода. Для этого существует аппаратная отладка (дебаг).
DarkWolf
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср ноя 05, 2014 19:04:31

Re: Работа с UART

Сообщение DarkWolf »

Ура, получил наконец то сообщения от GPS. Причиной "зависания" был постоянный уход в прерывание и не верная скорость, всетаки 9600 а не 115200. Осталась последняя проблема это в начало посылки добавляется 2 байта.

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

     $P$GNRMC,135549.041,V,,,,,0.27,0.00,100419,,,N*51 

     $G$GNRMC,135551.041,V,,,,,0.40,0.00,100419,,,N*59
должно приходить

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

     $GNRMC,135549.041,V,,,,,0.27,0.00,100419,,,N*51 

     $GNRMC,135551.041,V,,,,,0.40,0.00,100419,,,N*59
Не приложу ума, в какую сторону нужно копать!?
DarkWolf
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср ноя 05, 2014 19:04:31

Re: Работа с UART

Сообщение DarkWolf »

Доброго времени суток.

Что бы не создавать новых тем напишу в этой. Сново вопрос про UART. Соединяю два мк PIC18F47j53. Посылаю байт 0xBB, вторым мк принимаю и отправляю вновь. Смотрю осцилографом на порт приходит то что надо, принимает мк и отправляет тот же байт, но вот в обработчике не видно его светодиод не загорается. Предпологается использовать совместно с SPI (пин RC7 общий для SPI и UART). И еще вопрос, должны ли совпадать уровни сигнала? У меня на TX единица 3V, а на RX еденица 5 V

принимающая сторона

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

procedure EUSART1_Initialize();
begin
    TRISC.B7 := 1;
    PORTC.B7 := 0;
    LATC.B7  := 0;
    // disable interrupts before changing states
    // ABDOVF no_overflow; TXCKP async_noninverted_sync_fallingedge; BRG16 16bit_generator; WUE disabled; ABDEN disabled; RXDTP not_inverted;
    BAUDCON1 := 0x08;

    // SPEN enabled; RX9 8-bit; CREN enabled; ADDEN disabled; SREN disabled;
    RCSTA1 := 0x90;
    // TX9 8-bit; TX9D 0; SENDB sync_break_complete; TXEN enabled; SYNC asynchronous; BRGH hi_speed; CSRC slave_mode;
    //TXSTA1 := 0x24;
    // TX9 8-bit; TX9D 0; SENDB sync_break_complete; TXEN enabled; SYNC asynchronous; BRGH lo_speed; CSRC slave_mode;
    TXSTA1 := 0x20;
    //
    SPBRG1 := 0x08;
    //
    SPBRGH1 := 0x00;
end;

procedure EUSART1_Write(tx_byte: byte);
begin
  while(TRMT1_bit <> 1) do ;
        TXREG := tx_byte;
end;

function EUSART1_Read(): byte;
begin
    if(RCSTA1.OERR) then
    begin
        CREN1_bit := 0;
        CREN1_bit := 1;
    end;
    result := RCREG1;
end;

function EUSART1_Data_Ready(): byte;
begin
     if (RCIF_bit = 0) then 
       result := 0 else
       result := 1;
end;

// Обработчик в прерывании
procedure interrupt;
begin
  if (PIR1.RC1IF) then
  begin
       if (EUSART1_Data_Ready() = 1) then
       begin
         pByteUART := EUSART1_Read;
         if pByteUART = 0xBB then
            PORTD.B4 := 1
            else
            PORTD.B4 := 0;
         EUSART1_Write(pByteUART);
       end;
     PIR1.RC1IF := 0;
  end;
end;
driver_gv
Потрогал лапой паяльник
Сообщения: 399
Зарегистрирован: Сб авг 08, 2009 23:02:57
Откуда: Ростов-на-Дону
Контактная информация:

Re: Работа с UART

Сообщение driver_gv »

Первое - согласовать уровни . Приемник RX при питании 5 вольт требует логический ноль ниже 0,2 питания и единицу выше 0,8 питания. Контроллер от 3,3 вольт такого обеспечить не может.
__________________
Все, что нельзя запрограммировать на ассемблере, приходится паять
DarkWolf
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср ноя 05, 2014 19:04:31

Re: Работа с UART

Сообщение DarkWolf »

[uquote="driver_gv",url="/forum/viewtopic.php?p=3660499#p3660499"]Первое - согласовать уровни . Приемник RX при питании 5 вольт требует логический ноль ниже 0,2 питания и единицу выше 0,8 питания. Контроллер от 3,3 вольт такого обеспечить не может.[/uquote]

Пробовал закольцевать UART на одном и втором контроллере, прием и передача работают в рамках одного контроллера. А вот между контроллерами не работает. Если правильно понимаю, то раз принимает и передает в кольце, значит 0 и 1 распознаются.
driver_gv
Потрогал лапой паяльник
Сообщения: 399
Зарегистрирован: Сб авг 08, 2009 23:02:57
Откуда: Ростов-на-Дону
Контактная информация:

Re: Работа с UART

Сообщение driver_gv »

Вам проще питать оба контролера от одного уровня напряжения. Либо три либо пять. И все заработает.
__________________
Все, что нельзя запрограммировать на ассемблере, приходится паять
DarkWolf
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср ноя 05, 2014 19:04:31

Re: Работа с UART

Сообщение DarkWolf »

Контроллеры питаются от от одного уровня 3.3. Но на линии RX сделана включение разрешения работы с этой линией, так как используется еще SPI. И вот микросхема на выходе дает 5 вольт.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25261
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Работа с UART

Сообщение КРАМ »

Лично я ничего не понял про SPI... Какое он имеет отношение к UART-у? Схему можно привести?
DarkWolf
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср ноя 05, 2014 19:04:31

Re: Работа с UART

Сообщение DarkWolf »

Схему выложу завтра. Открылась еще одна особенность. Один контроллер работает с кварцем на 24 МГц. Второй - 19,44. Инициализацию UART провел исходя из частоты кварца. В итоге тоже самое: если замкнуть в кольцо TX-RX передача и прием работают, а вот между собой не хочет принимать. Нужно ли что то еще настраивать?
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25261
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Работа с UART

Сообщение КРАМ »

Какой то треш, а не объяснения...
Разница частот слишком мала, чтобы быть существенной при настройке рейта. И несовпадение рейтов передатчика и приемников не может привести к отсутствию связи, а лишь ошибкам при передаче, включая ошибку фрейма. Вход в прерывание у приемника должен быть даже при одном импульсе на его входе.
Отсутствие приема возможно при переполнении буфера приемника. Восстановить связь можно, только перезапустив модуль УАРТ. Сброс флага OERR вручную невозможен, он сбрасывается автоматически при перезапуске.
DarkWolf
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср ноя 05, 2014 19:04:31

Re: Работа с UART

Сообщение DarkWolf »

Скорее всего мои кривые руки чего то не так делали. В общем сейчас прием и передача работают, но беда теперь другая: В цикле от 0 до 255 посылаю в порт UART число 0xAA принимаю вторым мк и вновь оправляю первому. Первым мк принимаю в массив и потом записываю в файл. В итоге приходит сплошной мусор. Скорость настраиваю исходя из частоты кварца, по формуле из datashit. Подскажите, куда стоит еще посмотреть? Возможно совпадение, но похоже, что первый байт правильный приходит.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25261
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Работа с UART

Сообщение КРАМ »

FERR и OERR какое значение имеют?
Рейт можно посмотреть осциллографом на выходе Tx. И сравнить у двух МК.
DarkWolf
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср ноя 05, 2014 19:04:31

Re: Работа с UART

Сообщение DarkWolf »

Проверял по отдельность FERR и OERR устанавливаются в 1.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25261
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Работа с UART

Сообщение КРАМ »

Их нельзя проверять в останове на брекпойнте. Нужно копировать регистр в переменную и только в этой переменной проверять.
Ни один из битов не должен быть установлен. Это ошибки фрейма (отсутствие стоп-бита) и переполнения буфера.
Ответить

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