Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Подкарване на PIC12 UART
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=9043
Страница 1 от 1

Автор:  michev [ Чет Юли 21, 2011 1:28 pm ]
Заглавие:  Подкарване на PIC12 UART

Здравейте.
Вече втори ден ме тормози конфигурирането на UART-a на pic12f1822.
Не предава и това е :(
До момента съм:
- направил всички изводи цифрови
- направил нужните изводи - входове и изходи
- определил през APFCON кой извод на UARTA на кой пин ще е мапнат (в случая RX = RA5 = pin 2; TX = RA4 = pin 3)
- определил скоростта на предаване (9600 bsp, при чип на 32Mhz)
- активирал предаването по уарт
- конфигурирал UART в асинхронен режим
- активирал уарт-а
И въпреки всичко явно съм отървал нещо.
И да допълня - като казвам че не предава имам в предвид че никакъв сигнал не излиза от извода.

Код:
LIST   P=12F1822,ST=OFF,R=DEC,F=INHX32
INCLUDE   P12F1822.INC

__CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
__CONFIG _CONFIG2, _WRT_OFF & _PLLEN_ON & _STVREN_OFF & _BORV_19 & _LVP_OFF

org 0x00
goto hw_init


; uart_send
;;;;;;;;;;;;;;;;;;;;;;;;;
uart_send:            ;
   btfss   PIR1, TXIF   ;
   goto   $-1         ;
                  ;
   banksel TXREG      ;
   movwf   TXREG      ;
                  ;
   banksel 0         ;
                  ;
   return            ;
;;;;;;;;;;;;;;;;;;;;;;;;;

hw_init:
   banksel OSCCON      ;
   movlw 0xF0         ;Set OSCCON<4:7> bits
   movf   OSCCON      ;PLL x4, 8Mhz int. osc. = 32Mhz
                  ;
   banksel PORTA       ;
   clrf PORTA          ;Init PORTA
   banksel LATA      ;Data Latch
   clrf LATA         ;
   banksel ANSELA      ;
   clrf ANSELA         ;digital I/O
   banksel TRISA      ;
   movlw B'00101000'   ;Set RA5 and RA3 as inputs
   movwf TRISA       ;and set RA<2:0> and RA4 as
                  ;outputs
                  ;
   banksel APFCON      ;
   bsf   APFCON, TXCKSEL ;Set RA4 as UART TX
   bsf APFCON, RXDTSEL ;Set RA5 as UART RX
                  ;
   banksel SPBRG      ;
   movlw   207         ;
   movwf   SPBRG      ; UART speed 9600@32Mhz

   banksel TXSTA      ;
   movlw   B'00100100'   ;
   movwf   TXSTA      ; High baud rate - on, TX - on
   
   banksel RCSTA      ;RCSTA: RECEIVE STATUS AND CONTROL REGISTER
   movlw   B'10010000' ;
   movwf   RCSTA      ;Serial port - on, Asynchronous mode - on
   
main:
   nop

   movlw   'X'
   call uart_send

   goto main

END


Автор:  CarBeta [ Чет Юли 21, 2011 4:20 pm ]
Заглавие: 

PIR1 е в банка 0

Автор:  npelov [ Чет Юли 21, 2011 4:30 pm ]
Заглавие: 

Изглежда като по книга. Само, че при мен поне по подразбиране числата са шеснайсетични. т.е. movlw 207 трябва да стане movlw .207 за да си сигурен че го приема десетично. Не че това е проблема ...

А ей го на ... преди main: сетнеш отново банка 0 защото RCSTA не е в банка 0 ... а следващия регистър който четеш е PIR1 -> банка 0

Автор:  npelov [ Чет Юли 21, 2011 4:30 pm ]
Заглавие: 

CarBeta написа:
PIR1 е в банка 0


:)

Автор:  michev [ Чет Юли 21, 2011 4:48 pm ]
Заглавие: 

Да, прави сте - докато чаках някой да отговори Fan ми подсказа за въпросната банка.
Промених кода до
Код:
uart_send:            ;
   btfss   PIR1, TXIF   ;
   goto   $-1         ;
                  ;
   banksel TXREG      ;
   movwf   TXREG      ;
                  ;
   [b]banksel 0[/b]         ;
                  ;
   return   

В момента имам изходящ "трафик", но не се възприема от терминала от другата страна.
Искам само да добавя че проблема ми е на 100% софтуерен, тъй като с някакъв код взет на готово успях да пратя успешно информация от контролера към терминала.
Сега въпроса който стои е - какво съм объркал по конфигурацията за скоростта?

п.п: То този избор на банка и преди си го е имало написан. Всъщност добавих избор на банка точно преди етикет "main", както и непосредствено преди викане на uart_send.

Автор:  michev [ Чет Юли 21, 2011 5:09 pm ]
Заглавие: 

Край на драмата :D
Проблемите бяха 2:
- не съм избирал правилната банка при предаване
- грешна инструкция при конфигуриране на PLL (Писал съм movf вместо movwf).

Благодаря на всички за помощта.

Автор:  npelov [ Чет Юли 21, 2011 5:11 pm ]
Заглавие: 

Код:
т.е. movlw 207 трябва да стане movlw .207 за да си сигурен че го приема десетично


не четеш ли warning-те.

Автор:  michev [ Чет Юли 21, 2011 5:18 pm ]
Заглавие: 

Това npelov, звучи като виц - то почти на всеки ред изписва warning.
Въпреки това "R=DEC" т.е default radix = decimal. Ако асемблера ще си мисли че може би било шестнадесетично, въпреки че съм му казал да е десетично - е**м ти и микрочепския асемблер :)
Както казах в предния си пост - грешките бяха от друго естество.
Отново благодаря на отзовалите се.

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/