PIC16F876A: Работа с USART, вопрос.

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
evil_laugh
Родился
Сообщения: 10
Зарегистрирован: Вт дек 14, 2010 20:06:39

PIC16F876A: Работа с USART, вопрос.

Сообщение evil_laugh »

Всем добрый день :)

Болею, времени до фига, достал ноутбук и решил разобраться в интерфейсе USART на примере PIC16F876A. Пишу на ассемблере. Среда MPLAB.

Покурил даташит и поставил для себя учебную задачу: передать b'01010101' в асинхронном режиме.

В даташите сказано: для того, чтобы начать передачу, выберите частоту тактового генератора, выберите режим, включите передачу, загрузите в TXREG ваши данные, и передача начнётся незамедлительно.

Почитал, как всё это происходит. Написано: как только в TXREG загружаются данные, они незамедлительно отправляются в регистр TSR, после чего поднимается флаг, показывающий, что в TSR что-то есть, и (внимание) регистр TXREG обнуляется. Начинается передача.

Написал программу согласно этим шагам. Запускаю пошаговое выполнение. Что я вижу? Данные в TXREG загружаются. Флаг, показывающий, что в TSR что-то есть, поднимается (значит, данные перекинулись из TXREG в TSR?). Но регистр TXREG не обнуляется и на RC6 (выводе передатчика) ничего не появляется. Но через некоторое время флаг "полного TSR" опускается, якобы "передача закончена"... а на RC6 по прежнему все нули :)

Ах, да, ещё написано, что как только я загружу данные в TXREG, должен сброситься флаг "пустого TXREG", он же PIR1<4>. Он не сбрасывается :(

В чём дело? :( Даташит выкурил, не понимаю :( все мозги сломал...

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

;   Попытка передать данные через интерфейс USART

   processor   16f876a

   radix   hex

   #include   <p16f876a.inc>

      ;     32109876543210
   __CONFIG   b'11111100111010'   ;керамика 20 МГц, все таймеры отключены, защита кода отключена, защита от записи отключена, LVP отключено

   org      0x00

   goto   start

start

   call   init   


;////////настройка USART/////////////

;настройка Baud Rate Generator
;из таблицы 10-3 берём значение BRG=d'0'

   bsf      STATUS,5   ;банк1
   movlw   d'0'
   movwf   SPBRG   ;загружаем значение
   bsf      TXSTA,BRGH   ;Высокая скорость

;/////НАСТРОЙКА РЕГИСТРА TXSTA///////////////////////


   bcf      TXSTA,SYNC   ;Асинхронный режим


   bcf      STATUS,5   ;банк0

;///////НАСТРОЙКА РЕГИСТРА RCSTA////////////////

   bsf      RCSTA,SPEN   ;включаем последовательный порт

   bsf      STATUS,5   ;банк1

   bcf      TXSTA,6      ;выбираем 8-битную передачу

   bsf      TXSTA,5   ;включаем передачу (Здесь PIR1<4> поднимается, т. к. в регистре TXREG ничего нет)

start_transm

   bcf      STATUS,5   ;банк0

   movlw   b'01010101'   ;данные для передачи
   movwf   TXREG      ;загружаем (Здесь PIR1<4> должен сброситься, а он не сбрасывается)

   nop                     ;Здесь регистр TXREG должен обнулиться, а он не обнуляется :(

   bsf      STATUS,5   ;банк1
   

   ;Но бит TMRT после загрузки данных становится равным 0, а это значит, что в регистре TSR что-то есть.

tr_in_progr

   btfss   TXSTA,1      ;проверяем бит TRMT, пока он не стал равным 1
      goto   tr_in_progr   ;если он равен 0 - передача ещё идёт (но в это время на RC6 ничего не меняется)
   goto   start_transm   ;если нет - новая передача (бит TMRT всё же становится равным 1, якобы "передача закончена")
   


init

;/////////////IO PORTS///////////

   bcf      STATUS,6   
   bsf      STATUS,5   ;банк1

   clrf   TRISA
   clrf   TRISB
   clrf   TRISC

;данные будут передаваться через RC6, согласно даташиту делаем RC6 и RC7 входами

        bsf     TRISC,7
        bsf     TRISC,6

   bcf      STATUS,5   ;банк0

   clrf   PORTA
   clrf   PORTB   
   clrf   PORTC

   return

end
stas00n
Вымогатель припоя
Сообщения: 557
Зарегистрирован: Пн мар 23, 2009 04:03:45

Re: PIC16F876A: Работа с USART, вопрос.

Сообщение stas00n »

Ваш код в симуляторе работает. Не совсем понятно, что означает
evil_laugh писал(а):на RC6 (выводе передатчика) ничего не появляется.

Если Вы смотрите на состояние битов PORTC, то они и не будут меняться, т.к. там отображается состояние защелки, а у Вас подключен периферийный модуль. Посмотрите описание порта.
Откройте настройки симулятора (Degugger -> Settings) , на вкладке UART1 IO поставьте галку Enable и вывод в окно. В окне вывода появится закладка SIM Uart1 - там можно любоваться на передаваемые буковки 'U' :)))
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25155
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: PIC16F876A: Работа с USART, вопрос.

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

stas00n писал(а):Ваш код в симуляторе работает. Не совсем понятно, что означает
evil_laugh писал(а):на RC6 (выводе передатчика) ничего не появляется.

Если Вы смотрите на состояние битов PORTC, то они и не будут меняться, т.к. там отображается состояние защелки, а у Вас подключен периферийный модуль. Посмотрите описание порта.
Откройте настройки симулятора (Degugger -> Settings) , на вкладке UART1 IO поставьте галку Enable и вывод в окно. В окне вывода появится закладка SIM Uart1 - там можно любоваться на передаваемые буковки 'U' :)))


Дело не в том, что пины отображают состояние защелки. Можете включить ССР в режиме ШИМа и убедится, что с некоторыми временными ограничениями выход модуля будет симулирован именно на пине (в режиме логического анализатора). Просто общее функционирование симулятора не поддеоживает УАРТ (что записано в лимитейшн на симулятор). Однако есть отдельный инструмент, который показывает работу УАРТа. О нем Вы любезно объяснили... :)
Кстати пошаговое исполнение в дебаге тоже не обработает УАРТ.
Вообще, режим реального времени при железной отладке имеет значительные ограничения...
evil_laugh
Родился
Сообщения: 10
Зарегистрирован: Вт дек 14, 2010 20:06:39

Re: PIC16F876A: Работа с USART, вопрос.

Сообщение evil_laugh »

Спасибо всем огромное :)

Если Вы смотрите на состояние битов PORTC, то они и не будут меняться, т.к. там отображается состояние защелки, а у Вас подключен периферийный модуль. Посмотрите описание порта.

Да, именно туда я и смотрю. Но ведь, действительно, ШИМ прекрасно симулируется...
Откройте настройки симулятора (Degugger -> Settings) , на вкладке UART1 IO поставьте галку Enable и вывод в окно. В окне вывода появится закладка SIM Uart1 - там можно любоваться на передаваемые буковки 'U' :)))

Спасибо! Сделал :)) почему-то буковки U передаются как-то странно, по одной всякий раз, как в TXREG загружаются новые данные....
Просто общее функционирование симулятора не поддеоживает УАРТ (что записано в лимитейшн на симулятор).
...
Кстати пошаговое исполнение в дебаге тоже не обработает УАРТ.

Мда, серьёзный промах с моей стороны. Ограничения на симулятор-то я и не догадался почитать. Исправлюсь. А то ведь так и буду в следующий раз голову ломать... А флаги не сбрасываются и регистр не обнуляется тоже из-за этого?
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25155
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: PIC16F876A: Работа с USART, вопрос.

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

... А флаги не сбрасываются и регистр не обнуляется тоже из-за этого?


Откровенно сказать, не помню...
Я когда то давно выяснил все это (ограничения на симуляцию периферии) и больше этого не делал.
Тем более, что для приема нужно еще и хитромудрый стимул писать...
evil_laugh
Родился
Сообщения: 10
Зарегистрирован: Вт дек 14, 2010 20:06:39

Re: PIC16F876A: Работа с USART, вопрос.

Сообщение evil_laugh »

КРАМ, stas00n, спасибо вам. Залил прошивку в Протеус, в нём всё прекрасно работает :)

Следующий шаг - попробовать разобраться с MSSP, а конкретно с SPI. Именно по этому интерфейсу работает одна микруха-ЦАП, с которой захотелось поработать. Попробую-с... Раньше начинал читать этот раздел даташита, чото не осиливал. Теперь есть конкретная задача, надеюсь, что дело пойдёт легче, а нет - так попрошу помощи уважаемых котов :)

Кстати, а этот модуль поддерживается симулятором? В протеус заливать всякий раз прошивку зело неудобно... :(
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»