PIC16f88 не хочет принимать байт по UART

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
Аватара пользователя
MyxoMop
Мудрый кот
Сообщения: 1752
Зарегистрирован: Чт май 06, 2010 13:18:59

PIC16f88 не хочет принимать байт по UART

Сообщение MyxoMop »

Не понимаю, не хочет принимать байт и всё тут. Передача в терминал работает. На приеме висит в цикле ожидая флага RCIF в PIR1. Или в протеусе это в принципе не работает? Но передачу ведь его терминал принимает.
Вот просто тестовый код, потом все будет переписано по уму, это просто проверить саму возможность приема. В архиве моделька с кодом

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

 list		p=16f88		; list directive to define processor
 #include	<p16f88.inc>	; processor specific variable definitions
 errorlevel	-302, -307	

 __CONFIG _CONFIG1, H'3B0A'
 __CONFIG _CONFIG2, H'0000' 

 CBLOCK      0x70   ; all banks vars
    w_temp			; variable used for context saving
    status_temp	    ; variable used for context saving
    pclath_temp
 ENDC

 CBLOCK		0x20    ; bank 0 vars
    char0
    COUNT1
 ENDC 

;**********************************************************************
 ORG		0x000			; reset vector
 bsf			STATUS, RP0		; Bank 1
 movlw		 b'00000111'		; setting port to digital
 movwf		CMCON
 goto		main			; go to beginning of program

 ORG		0x004			; interrupt vector location
 retfie		

;**********************************************************************
main
 clrf	OSCCON
 movlw       b'10000001'
 movwf       OPTION_REG

 clrf	ANSEL			; digital I/O
 movlw	b'01111110'		; PORTB  0, 7-output
 movwf	TRISB
 movlw	b'11111111'		; PORTA  - input
 movwf	TRISA

 bcf		STATUS, RP0		; Bank 0
 clrf		PORTA
 clrf		PORTB

 bsf			STATUS, RP0		; Bank 1
	;---CONFIGURE SPBRG FOR DESIRED BAUD RATE
	movlw D'51'   	;baud rate =  19200bps  ->  x=Fosc/(baud_rate*16)-1
	movwf SPBRG   	;at 16MHZ
;---CONFIGURE TXSTA
	movlw B'00100100'	;Configures TXSTA as 8 bit transmission, transmit enabled, async mode, high speed baud rate
	movwf TXSTA
  	bsf PIE1, RCIE

 bcf		STATUS, RP0		; Bank 0
      movlw b'10010000'	;enable serial port receive
      movwf RCSTA

; bsf INTCON,6			; Peripheral Interrupt Enable
; bsf		INTCON, GIE		; Global Interrupt Enable

	movlw 0x41
	movwf char0   	;put A (ascii code 0x41) character to char0 register
main_cycle

;send  / TX
 	movlw 0x54		;T
	movwf TXREG   	;place the A character to TXREG
 	bsf	STATUS, RP0	; Bank 1
wthere1
	btfss TXSTA, TRMT	;check if TRMT is empty
    	goto wthere1   	;if not, check again
	bcf STATUS, RP0   ;bank 0, if TRMT is empty then the character has been sent

 	movlw 0x65		;e
	movwf TXREG   	;place the A character to TXREG
 	bsf	STATUS, RP0		; Bank 1
wthere2
	btfss TXSTA, TRMT ;check if TRMT is empty
    	goto wthere2   	;if not, check again
	bcf STATUS, RP0   ;bank 0, if TRMT is empty then the character has been sent

 	movlw 0x73		;s
	movwf TXREG   	;place the A character to TXREG
 	bsf	STATUS, RP0		; Bank 1
wthere3
	btfss TXSTA, TRMT ;check if TRMT is empty
    	goto wthere3   	;if not, check again
	bcf STATUS, RP0   ;bank 0, if TRMT is empty then the character has been sent

 	movlw 0x74		;t
	movwf TXREG   	;place the A character to TXREG
 	bsf	STATUS, RP0		; Bank 1
wthere4
	btfss TXSTA, TRMT ;check if TRMT is empty
    	goto wthere4   	;if not, check again
	bcf STATUS, RP0   ;bank 0, if TRMT is empty then the character has been sent

ccc1

;receive
 bcf  RCSTA, CREN		;CREN bit
 bsf  RCSTA, CREN		;CREN bit

wait_symbol  btfss PIR1, RCIF		;bit 5
 movlw b'00000001'	;инвертируем RB0
 xorwf PORTB, F
     goto wait_symbol
      movf RCREG, W
      movwf  COUNT1
;	bcf	PIR1, RCIF	;сбросится сам при чтении RCREG

 movlw b'10000000'	;инвертируем RB7
 xorwf PORTB, F

	incf char0, F
	movf char0, W
	movwf TXREG   	;place W to TXREG

 bsf			STATUS, RP0		; Bank 1
wthere5	btfss TXSTA, TRMT ;check if TRMT is empty
    	goto wthere5   	;if not, check again
	bcf STATUS, RP0   ;bank 0, if TRMT is empty then the character has been sent

 goto ccc1
; goto	main_cycle

 END 
Вложения
prot8.zip
(15.58 КБ) 135 скачиваний
Аватара пользователя
Родэрик
Нашел транзистор. Понюхал.
Сообщения: 162
Зарегистрирован: Чт ноя 26, 2015 23:22:35
Откуда: не с Уфы
Контактная информация:

Re: PIC16f88 не хочет принимать байт по UART

Сообщение Родэрик »

вот это :

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

wait_symbol  btfss PIR1, RCIF      ;bit 5
 movlw b'00000001'   ;инвертируем RB0
 xorwf PORTB, F
     goto wait_symbol
так и задумывалось?
и ещё - зачем включаете прерывания (gie)?

зы: вопрос по gie снимается ... сейчас только заметил, что те строки закомментированы
Последний раз редактировалось Родэрик Пн янв 13, 2025 18:54:03, всего редактировалось 1 раз.
Аватара пользователя
MyxoMop
Мудрый кот
Сообщения: 1752
Зарегистрирован: Чт май 06, 2010 13:18:59

Re: PIC16f88 не хочет принимать байт по UART

Сообщение MyxoMop »

Родэрик писал(а):так и задумывалось?
изначально конечно нет, просто чтоб видеть в каком месте затык, ну т.е. пока ждем приема - дергается нога для теста. Но без этого тоже не работало.
Родэрик писал(а):и ещё - зачем включаете прерывания (gie)?
так эта строка закомментирована, пробовал на всякий случай включать переферийные прерывания PEIE без глобального gie - не помогло. строку gie просто скопировал вместе с peie с другого проекта.
Аватара пользователя
Родэрик
Нашел транзистор. Понюхал.
Сообщения: 162
Зарегистрирован: Чт ноя 26, 2015 23:22:35
Откуда: не с Уфы
Контактная информация:

Re: PIC16f88 не хочет принимать байт по UART

Сообщение Родэрик »

я про то, что "goto wait_symbol" всегда будет работать ...
Аватара пользователя
MyxoMop
Мудрый кот
Сообщения: 1752
Зарегистрирован: Чт май 06, 2010 13:18:59

Re: PIC16f88 не хочет принимать байт по UART

Сообщение MyxoMop »

[uquote="Родэрик",url="/forum/viewtopic.php?p=4671167#p4671167"]я про то, что "goto wait_symbol" всегда будет работать ...[/uquote]

А, точно. Пропустил. Но на самом деле я это вставил совсем недавно, без этого в таком виде
wait_symbol btfss PIR1, RCIF ;bit 5
goto wait_symbol
тоже не работало.

Upd.
Щас убрал, перекомпилил - заработало!

Родэрик, большое спасибо.

Завтра начну писать настоящий код. Конечно таких останавливающих программу ждущих циклов не будет. Мне тут главное было отладить прием-передачу.
Ответить

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