16f1827 USART kullanımı!

Başlatan erdogan2734, 27 Temmuz 2018, 13:24:21

erdogan2734

  Arkadaşlar Merhaba;

Elimde iki adet 16f1827 mevcut, usart ile haberleştirmeye çalışıyorum.
Serin-Serout , ya da kesme kullanamadan HSERIN-HSEROUT komutları ile haberleşme sağlıyorum.
Ancak ne zaman kesme ile haberleşmeye çalışsam haberleşme olayını gerçekleştiremiyorum.

Derken datasheet den aşağıdaki kodlarıda hem alıcıya hem vericiye ekledim.
Dolayısı ile çalıştırabildim.
İhtiyacı olan olursa bu kodları kullanabilir.
İsterseniz modaretör konuyu silebilir.
Teşekkürler.
Aşağıdaki kod çalışıyor.

TXSTA.5=1
TXSTA.2=1
RCSTA.7=1
RCSTA.4=1


VERICI:
;-------------------------------------------------------------------------------
;**** Added by Fuse Configurator ****
; Use the Fuse Configurator plug-in to change these settings

Device = 16F1827

Config1 FOSC_INTOSC, WDTE_OFF, PWRTE_ON, MCLRE_OFF, CP_OFF, CPD_OFF, BOREN_OFF, CLKOUTEN_OFF, IESO_OFF, FCMEN_OFF
Config2 WRT_OFF, PLLEN_OFF, STVREN_ON, LVP_OFF ,BORV_25

;**** End of Fuse Configurator Settings ****
;-------------------------------------------------------------------------------

Xtal=4
Include "modedefs.bas" 
;Calculated Baudrate = 2404 @ Xtal 4MHz, Error = 0,17%
Declare Hserial_Baud =2400
Declare Hserial_RCSTA=$90h 'burada hata olmuş aşağıdaki gibi olması gerekiyor
Declare Hserial_TXSTA =$20h 'burada hata olmuş aşağıdaki gibi olması gerekiyor 
Declare Hserial_SPBRG= 25
Declare Hserial_Clear= On
Declare FSR_CONTEXT_SAVE=On

'RCSTA = $90   ' Enable serial port & continuous receive
'TXSTA = $20   ' Enable transmit, BRGH = 1
'SPBRG = 103   ' 2400 Baud @ 0,0%
'SPBRGH = 6
'BAUDCON.3 = 0 ' Enable 16 bit baudrate generator

'********************DEĞİŞKENLER*********************************
OSCCON=%01101010
CM1CON0=0
CM2CON0=0

FVRCON =0              'voltaj referanslarını iptal ediyoruz                     
DACCON0=0              'dac devre dışı
SRCON0=0               'sr latch kontrol devre dışı      
SRCON1=0               'sr latch kontrol devre dışı 
TXSTA.5=1
TXSTA.2=1
RCSTA.7=1
RCSTA.4=1


TRISA=0
ANSELA=0
PORTA=0
'---------------------
TRISB=%00000010
ANSELB=0

Symbol RX    = PORTB.1
PORTB=0
'---------------------

Dim VERI As Byte


TEST:

VERI=15
GoSub SENT
DelayMS 1000
VERI=14
GoSub SENT
DelayMS 1000

GoTo TEST


SENT:

HSerOut [Rep $AA\5,Rep $00\5,Rep $FF\5]
HSerOut ["D","N","M",VERI]

Return


End



ALICI

;-------------------------------------------------------------------------------
;**** Added by Fuse Configurator ****
; Use the Fuse Configurator plug-in to change these settings

Device = 16F1827

Config1 FOSC_INTOSC, WDTE_OFF, PWRTE_ON, MCLRE_OFF, CP_OFF, CPD_OFF, BOREN_OFF, CLKOUTEN_OFF, IESO_OFF, FCMEN_OFF
Config2 WRT_OFF, PLLEN_OFF, STVREN_ON, LVP_OFF ,BORV_25

;**** End of Fuse Configurator Settings ****
Include "modedefs.bas" 
Xtal=4

;Calculated Baudrate = 2404 @ Xtal 4MHz, Error = 0,17%
Declare Hserial_Baud =2400
Declare Hserial_RCSTA=$90h 'burada hata olmuş aşağıdaki gibi olması gerekiyor
Declare Hserial_TXSTA =$20h 'burada hata olmuş aşağıdaki gibi olması gerekiyor 
Declare Hserial_SPBRG= 25
Declare Hserial_Clear= On
Declare FSR_CONTEXT_SAVE=On

'RCSTA = $90   ' Enable serial port & continuous receive
'TXSTA = $20   ' Enable transmit, BRGH = 1
'SPBRG = 103   ' 2400 Baud @ 0,0%
'SPBRGH = 6
'BAUDCON.3 = 0 ' Enable 16 bit baudrate generator

Symbol GIE   =INTCON.7   'genel interruptları açıyor
Symbol PEIE  =INTCON.6   'peripheralinterruptları açıyor
Symbol RCIE  =PIE1.5     'USART Recive interrupt enable bit
Symbol RCIF  =PIR1.5     'USART Receive interrupt flag bit  


'**KESME DEĞERLERİ**********'*
    INTCON=%11000000                 
    On_Hardware_Interrupt GoTo INT   
    RCIE=1                           
'*****************************



'********************DEĞİŞKENLER*********************************
OSCCON=%01101010
CM1CON0=0
CM2CON0=0

FVRCON =0              'voltaj referanslarını iptal ediyoruz                     
DACCON0=0              'dac devre dışı
SRCON0=0               'sr latch kontrol devre dışı      
SRCON1=0               'sr latch kontrol devre dışı 
'MDCON=0                'modülator çıkışı iptal 
TXSTA.5=1
TXSTA.2=1
RCSTA.7=1
RCSTA.4=1


TRISA=%00000000
ANSELA=0
PORTA=0
'---------------------
TRISB=%00000010
ANSELB=0
PORTB=0
'---------------------
Dim AL    As Byte :AL=0
Dim TEMP  As Byte 





TEST:


If AL=14 Then 
Toggle PORTA.0
al=0
endif

If AL=15 Then 
Toggle PORTA.1
al=0
endif

GoTo TEST

'*******************KESME****************************


INT:
    Context Save
    GIE=0
    HSerIn 5,ATLA, [Wait("DNM"),AL]
ATLA:    
    TEMP=RCREG 
    GIE=1
    Context Restore
End



Erdoğan
İmkansızın zaman aldığı bir dünya'da bana zorluktan bahsetme!

ete

Yanlış anlaşılma olmaması için olaya müdahele etmek zorundayım. Sanki değerler rastgele ve tesadüfen bulunmuş gibi gözüküyor. Yardımcı olacağına kafa karıştırıyor bana kalırsa.

4 Mhz osilatör frekansında ve 2400 baud haberleşme hızı için Standart Usart configurasyonları şöyle çıkar;
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 25  ' 2400 Baud @ 4MHz, 0,17%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

Şimdi TXSTA=$20 yada binary olarak bakarsak %00100000 burada TXSTA.5=1 olup diğer bitler sıfırdır.
Peki çalışıyor denilen değer de;
TXSTA.5=1
TXSTA.2=1
verilmiş bu ise %00100100 ve hex olarak $24 sayısına eşdeğerdir. 

Peki neden böyle derseniz sorunun cevabı 16F1827 de USART değil EUSART olmasından kaynaklanıyor. Yani Extended (gelişmiş) USart.  Peki bu özelliğe karşın kullanılacak değerler ise,

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
DEFINE HSER_SPBRG 160 ' 2400 Baud @ 4MHz, -0,08%
SPBRGH = 1
BAUDCON.3 = 1         ' Enable 16 bit baudrate generator

Buradan da görüleceği üzere EUSART için değerler farklı çıkıyor.  Kullanılması gereken son verdiğim değerler olmalıdır.
Bütün bu hesaplanan değerleri Pic Multi-Calc isimli kısa programcık ile yapıyorum. Şiddetle öneriyorum.

Ete


erdogan2734

Değerli açıklamalarınız için teşekkürler hocam.
Erdoğan
İmkansızın zaman aldığı bir dünya'da bana zorluktan bahsetme!

Hattuşa

slm;
aşağıda ki kodla usarttan data alış verişi yapmak istiyorum. daha öncesinde 16F1824 ile aynı kodla çalıştırıdm. ancak 16f1827 ile çalışmıyor. işin ilginç tarafı isis similasyonda TX çıkışı var osilaskobunda görüyorum. ancak gerçekte MCU nun TX pininde hiç bir şey yok TX ve RX de HC-06 bluetooth var. işlemcileri di...netten yeni aldım 2 adet ve ikiside aynı...
sorun neyden kaynaklı olabilir?

Declare Hserial_Baud  = 115200      ' Set baud rate to 9600
Declare Hserial_RCSTA = %10010000  ' Bit7 SPEN: Serial Port Enable bit
Declare Hserial_TXSTA = %10101100  ' Bit5 TXEN: tx enable , Bit3 BRGH: High Baud Rate Select
Declare Hserial_Clear = On         ' Optionally clear the buffer before receiving
Declare Hserial_SPBRG =16       '
Declare FSR_CONTEXT_SAVE = On


Symbol PEIE = INTCON.6 ' Peripheral Interrupt Enable
Symbol GIE = INTCON.7  ' Global Interrupt Enable
Symbol RCIE = PIE1.5   ' USART Receive Interrupt Enable
Symbol RCIF = PIR1.5   ' USART Receive Interrupt Flag
Symbol TMR1IE = PIE1.0  
Symbol TMR1IF = PIR1.0  

APFCON0.7 =0
APFCON1.0 =0

  GIE = 0
  PEIE = 1
  TMR1IE =1
  TMR1IF =0
  RCIE =1
  RCIF =0

ete

#4
Haberleşme paremetreleri büyük ölçüde işlemci OSC frekansına bağlıdır. Programda bu konuda bir satır göremedim. Haberleşme hızı 115.200 baud gözüküyor. Bu yüksek OSC frekansı gerektirir. EN azından 20 Mhz olması gerekir. Aksi halde %-3 küsür hata payı çıkıyor. Sıfır civarında çıkması idealdir.
OSC frekansı 32 Mhz ise aşağıdaki parametreler kullanılması gerekir.

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
DEFINE HSER_SPBRG 68  ' 115200 Baud @ 32MHz, 0,64%
SPBRGH = 0
BAUDCON.3 = 1         ' Enable 16 bit baudrate generator


Ete

Hattuşa

hocam programın bir kısmını vermiştim, osc ayarları aşağıda ki gibidir. aynı ayarlar hatta aynı kodla 16f1824 gerçekte çalıştı. ama 16f1827 çalışmadı acaba ek bir ayar mı gerektiriyor?
datasheette bulamadım.
APFCON0.7 =0
APFCON1.0 =0
ayarları default değerleri belki açılışta farklı çıkarsa diye ekledim


Device 16F1827

Config1 FOSC_INTOSC, WDTE_OFF, PWRTE_ON, MCLRE_OFF, CP_OFF, CPD_OFF, BOREN_OFF, CLKOUTEN_OFF, IESO_OFF, FCMEN_OFF
Config2 WRT_OFF, PLLEN_ON, STVREN_ON, BORV_19, LVP_OFF
Xtal 32
OSCCON =%11110000     '8 mhz dahili osc
Declare All_Digital TRUE
TRISA =%00001100
TRISB =%01000010
PORTA =0
PORTB =0

WPUA =0
CM1CON0 =0
CM1CON1 =0
ANSELA =%00001100
ANSELB =%00100000
ADCON0 =1
ADCON1 =%11100000   'fosc 64
DACCON0=0  
SRCON0=0 
SRCON1=0

Hattuşa

HOCAM ÖZÜR DİLERİM;
gene kendi aptallığım yüzünden çalışmamış, yolları büyütec altında kontrol ettiğimde TX hattı gnd ye çapak ile şase olmuş, çapağı aldığımda herşey normale döndü,2 saatlik saç yolma operasyonundan sonra

Powered by EzPortal