PIC18F блокируется при быстрой отправке данных - PullRequest
2 голосов
/ 14 ноября 2010

Я работаю с PIC18F и пытаюсь отправить данные через гипертерминал.Когда я посылаю данные с медленной скоростью, нажимая одну кнопку каждые полсекунды, она получает данные и корректно выводит их, но когда я начинаю нажимать клавиши с более высокой скоростью, MCU блокируется.Не уверен, с чем это связано.

while(index<length){
    while(PIR1bits.RCIF==0); // Wait till char recieved
    sendData(str2,9); // confirm reception

    Delay1KTCYx(5); //delay because without it, it messes up.
    rxData[index]= RCREG; //char array
    index++;
}

Скорость передачи данных 2400 На PIC и гипертерминале.

Это наш цикл приема.sendData - это просто отладочный код, который мы отправляем со словами «получены».Это то, как мы знаем, когда оно замерзло.

Оно не останавливается при одинаковом количестве циклов каждый раз, оно зависит только от того, насколько быстро мы вводим данные.

Ответы [ 3 ]

2 голосов
/ 14 ноября 2010

(я работал над микроконтроллерами, но не имел дела с PIC, поэтому постараюсь помочь с общими проблемами)

  1. Вы не проверяете флаги ошибок приемника. Приемник может заблокироваться в состоянии «Ошибка переполнения» и больше не получать до тех пор, пока вы не сбросите флаг «Перегрузка». Добавьте проверку на наличие ошибок и устраните их в соответствии с документацией PIC.

  2. Хорошей практикой является чтение полученного байта как можно раньше, когда указано завершение приема, поэтому попытайтесь переместиться rxData[index]= RCREG; сразу после while(PIR1bits.RCIF==0);. Это снижает вероятность

  3. Вы не показали код для sendData. Может быть пропущена проверка состояния готовности TX и условий ошибки, поэтому она также может заблокироваться.

  4. Немотивированная задержка означает, что вы уже где-то ошибаетесь. Попробуйте удалить его, а затем отладочный код.

  5. Вам следует проверить прием и передачу отдельно. Сначала проверьте передатчик: попробуйте вывести длинную строку текста через UART без какого-либо приема. (Скажем, напишите программу «Hello world!»:))

  6. Проверьте только один код приемника: удалите передачу из программы, подключите светодиод (вольтметр, осциллограф, все, что у вас есть) к свободному выводу GPIO, а затем заставляйте его переключать логический уровень на нем при каждом получении байта. Если для этого требуется всего несколько тактов, это не должно мешать приему или блокировке.

0 голосов
/ 17 ноября 2010

На большинстве микроконтроллеров переполнение приемника UART приведет к тому, что вновь полученный байт будет отброшен и установлен флаг, но приемник продолжит работать в обычном режиме.На PIC переполнение приемника приведет к смерти UART, пока бит CREN не будет очищен и сброшен.

0 голосов
/ 14 ноября 2010

Может быть, когда вы отправляете 2 символа, пока он занят отправкой «полученных», один из них отбрасывается, и вы никогда не достигаете своего length?

...