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

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

Сообщение 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
Реклама
Вымогатель припоя
Сообщения: 557
Зарегистрирован: Пн мар 23, 2009 04:03:45

Сообщение stas00n »

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

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

stas00n писал(а):Ваш код в симуляторе работает. Не совсем понятно, что означает
evil_laugh писал(а):на RC6 (выводе передатчика) ничего не появляется.
Если Вы смотрите на состояние битов PORTC, то они и не будут меняться, т.к. там отображается состояние защелки, а у Вас подключен периферийный модуль. Посмотрите описание порта.
Откройте настройки симулятора (Degugger -> Settings) , на вкладке UART1 IO поставьте галку Enable и вывод в окно. В окне вывода появится закладка SIM Uart1 - там можно любоваться на передаваемые буковки 'U' :)))
Дело не в том, что пины отображают состояние защелки. Можете включить ССР в режиме ШИМа и убедится, что с некоторыми временными ограничениями выход модуля будет симулирован именно на пине (в режиме логического анализатора). Просто общее функционирование симулятора не поддеоживает УАРТ (что записано в лимитейшн на симулятор). Однако есть отдельный инструмент, который показывает работу УАРТа. О нем Вы любезно объяснили... :)
Кстати пошаговое исполнение в дебаге тоже не обработает УАРТ.
Вообще, режим реального времени при железной отладке имеет значительные ограничения...
Родился
Сообщения: 10
Зарегистрирован: Вт дек 14, 2010 20:06:39

Сообщение evil_laugh »

Спасибо всем огромное :)
Если Вы смотрите на состояние битов PORTC, то они и не будут меняться, т.к. там отображается состояние защелки, а у Вас подключен периферийный модуль. Посмотрите описание порта.
Да, именно туда я и смотрю. Но ведь, действительно, ШИМ прекрасно симулируется...
Откройте настройки симулятора (Degugger -> Settings) , на вкладке UART1 IO поставьте галку Enable и вывод в окно. В окне вывода появится закладка SIM Uart1 - там можно любоваться на передаваемые буковки 'U' :)))
Спасибо! Сделал :)) почему-то буковки U передаются как-то странно, по одной всякий раз, как в TXREG загружаются новые данные....
Просто общее функционирование симулятора не поддеоживает УАРТ (что записано в лимитейшн на симулятор).
...
Кстати пошаговое исполнение в дебаге тоже не обработает УАРТ.
Мда, серьёзный промах с моей стороны. Ограничения на симулятор-то я и не догадался почитать. Исправлюсь. А то ведь так и буду в следующий раз голову ломать... А флаги не сбрасываются и регистр не обнуляется тоже из-за этого?
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 25581
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

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

Сообщение evil_laugh »

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

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

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

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