Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: ivan_fd  
PIC16F877A и RS232
Kernel Дата: Вс, 21.10.2012, 20:24  |                                                                                                                Сообщение # 1
Группа: Удаленные
Ранг: 
Сообщений:
Репутация:   ±
Замечания:   ±
На сайте с

Статус:

Пытаюсь передать байт информации из PIC16F877A (с использованием MAX232) через встроенный uart пика на компорт компа.
На компе полученные данные смотрю через RealTerm

Code

define OSC 4  
DEFINE HSER_ODD 1
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 20h
DEFINE HSER_BAUD 115200

TRISA = %00000000    ' Установить PORTA  на вход
TRISB = %00000000    ' Установить PORTB  на выход

PORTB = %00000000
      
     BI1    VAR     byte        'временная переменная
     B1     VAR     byte        'выходной байт
     
  main:    
    
     BI1 = portB
     B1 = ~BI1         'инвертирую значения переменной BI1 по-битово

      hserout [B1]  ' вывожу значения через uart
   
       pause 100
goto main


Т.к. в начале portB =%00000000 то после инвертирования должно получиться значение 11111111 и на выходе должно получиться значение FF (если перевести в HEX), но вместо этого получаю FE, т.е. 11111110

В чем проблема где ошибка? Подскажите.
ЯНДЕКС Дата: 21.10.2012
ilyafm98 Дата: Пн, 05.11.2012, 23:12  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Новенький
Сообщений: 18
Репутация: 0   ±
Замечания:   ±
На сайте с 08.12.2010

Статус: Offline

Тут есть инструмент для рассчета значений регистров модуля USART. У вас в прошивке указана тактовая частота 4 МГц и скорость 115200 - при этих значениях ошибка в скорости будет составлять 8,5 %, соответственно ничего принять или передать не получится.
Попробуйте поставить скорость 9600 и попробовать что либо принять или передать. Если нужна скорость выше то рекомендую поднять тактовую частоту до 20 МГц.

Добавлено (05.11.2012, 23:12)
---------------------------------------------
И вот тут еще ошибка, должно быть:

Code


TRISA = %11111111   ' Установить PORTA  на вход  
TRISB = %00000000    ' Установить PORTB  на выход

Kernel Дата: Пн, 12.11.2012, 23:31  |                                                                                                                Сообщение # 3
Группа: Удаленные
Ранг: 
Сообщений:
Репутация:   ±
Замечания:   ±
На сайте с

Статус:

Quote (ilyafm98)
Тут есть инструмент для рассчета значений регистров модуля USART. У вас в прошивке указана тактовая частота 4 МГц и скорость 115200 - при этих значениях ошибка в скорости будет составлять 8,5 %, соответственно ничего принять или передать не получится.
Попробуйте поставить скорость 9600 и попробовать что либо принять или передать. Если нужна скорость выше то рекомендую поднять тактовую частоту до 20 МГц.

Добавлено (05.11.2012, 23:12)
---------------------------------------------
И вот тут еще ошибка, должно быть:


Поясню, что я делаю. Есть плата кнопок где каждая кнопка висит на порте В при замыкании кнопки на pin порта В приходит +5 (т.е. логическая единица). Моя задача, чтобы эта плата через UART с помощью max232 передавала 1 байт. Структура которого следующая: если ниодна кнопка не нажата, то байт имеет значение %11111111, если нажата кнопка 1 то байт будет выглядеть %11111110, если кнопка 2, то %11111101 и т.д.

У меня порт А вообще не используется.
Поднимать частоту кварца не могу, т.к. есть готовая плата с уже готовой аналогичной прошивкой и кварцев 4 Мгц и все работает замечательно. Я просто хочу повторить ее
Покопавшись по иностранным форумам нашел одну интересную вещь. На больших скоростях необходимо менять значение HSER_TXSTA с 20 на 24

У меня получилось следующее
Code
   
define OSC 4

define HSER_TXSTA 24h
define HSER_EVEN none
DEFINE HSER_ODD none

DEFINE HSER_BAUD 115200
DEFINE HSER_BRGH 1
DEFINE HSER_SPBRG 1

TRISB = %11111111
PORTB = %00000000

       I1      VAR     byte       ' временные переменные
      
       B1      var     byte        'выходной байт 1
    
main:    
        
             I1 = PORTB
             B1 = ~I1

   hserout [B1]  ' вывожу значения через uart
     
        pause 100
goto main  

но проблема в том, что после перепрошики я получаю свой байт %11111111($FF - в HEX), но стоит мне к примеру нажать кнопку 1 то я вместо положенного %11111110 ($FE) значения получаю %01111110 ($7E) и так со всеми кнопками. Т.е. куда-то девается старший 7-ой бит

В чем проблема?
  • Страница 1 из 1
  • 1
Поиск: