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 »

я про то, что "goto wait_symbol" всегда будет работать ...


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

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

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

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

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