usart haberleşme hakkında örnek kod

Başlatan tmr01, 14 Ocak 2007, 23:46:57

mytap

Kodları inceledim fakat alıcı modda bir WAIT komudu mevcut bu komut pek verimli çalıştığı söylenemez özellikle hassas zamanlama gerektiren algoritmalarda sürekli problem çıkartıyor.

kararımca dinleme şu şekilde olması gerekir.
Aşağıdaki intconun gömülü registerleri ve bu registerlere atanan semboller gözükmekte.

SYMBOL RBIF = INTCON.0 ' RB Port Interrupt Flag
SYMBOL INTF = INTCON.1 ' RB0 External Interrupt Flag
SYMBOL T0IF = INTCON.2 ' TMR0 Overflow Interrupt Flag
SYMBOL RBIE = INTCON.3 ' RB Port Change Interrupt Enable
SYMBOL INTE = INTCON.4 ' RB0 External Interrupt Enable
SYMBOL T0IE = INTCON.5 ' TMR0 Overflow Interrupt Enable
SYMBOL PEIE = INTCON.6 ' Peripheral Interrupt Enable
SYMBOL GIE = INTCON.7  ' Global Interrupt Enable

;--------------Program-------------
On Interrupt Goto Global_INT
option_reg=%11000000
intcon=%11111000 ; Global(7.Bit), Usart(6.Bit), TMR(5.Bit), RB0(4.bit), RB Port(3.Bit) kesmeleri aktif 

Start:
    pauseus 100
Goto Start

Disable
 Global_INT:
IF RCIF = 1 THEN GOTO Usart_INT ; Usart alıcı int bayrak
IF INTF = 1 THEN GOTO RB0_INT  ; RB0 int bayrak
IF RBIF = 1 THEN GOTO RB_INT   ;RB4-RB7 int bayrak
IF T0IF = 1 THEN GOTO TMR_INT ;TMR0 int bayrak
 RESUME
 ENABLE

;---------USART KESME-----------
DISABLE
Usart_INT:
RC_AL = RCREG ; RCREG registeri okundu RCIF bayrağı temizlendi
IF RC_AL = "A" THEN HSERIN [DEC AL] ; yukardaki msjda bu rutinden bahsetmiştim
RCIF=0 ; şüpeli durumlar için tekrar bayrağı sildik
RESUME
ENABLE

;---------RB0 KESME--------------
DISABLE  
RB0_INT:
.
.
.
INTF=0
RESUME
ENABLE

;--------RB4-7 KESME-------------
DISABLE
RB_INT:
.
.
.
RBIF=0
RESUME
ENABLE

;--------TMR KESME---------------
DISABLE
TMR_INT:
.
.
.
T0IF=0
RESUME
ENABLE

END


Kesmelerin nasıl kullanacağı hakkında bir algoritma hazırladım umarım kesmeleri nasıl kullanacağın hakkında yararlı olur. Diğer yandan usart kesme rutininin içindeki kod kümesini incele ve bu şekilde yaklaş. Bu sana herzaman avantaj sağlıcaktır. Programları 20Mhz ayarla ve 20Mhz işlemci ve 20Mhz cristal kullan.
-------------------------------------------------------- hayırlı günler, iyi çalışmalar..  --------------------------------------------------------

sitenindelisi

Muhakkak her yiğidin yoğurt yemesi farklıdır fakat bu algoritma bana doğru gelmedi, özellikle PBP gibi donanımsal kesme desteği olmayan bir compiler için.

Benim fikrimce, ISR içine girdiğiniz de sadece flag denetim ve/veya kontrollerini yapıp, hızlı bir şekilde ISR yi terk etmeli, ilgili rutine/fonksiyona gitmeli ve MCU yu yeniden kesme alabilir hale getirmelisiniz.
ISR girişinde kendimizi sağlama almak için INTCON.7 nin denetimini yapmalı ve sıfırlanıncaya kadar kilitlemeliyiz.
GOTO MAIN
DISABLE
INT:
asm
BTFSC   INTCON, GIE
GOTO    $-1
endasm
IF  RCIF = 1 THEN   _USART_RX
.
.
RESUME
ENABLE

_USART_RX:
RC_AL = RCREG


MAIN:
.
.
.
GOTO MAIN


Mantığımı izah edebilmek için temsilen verdim.Sözdizimi rastgeledir.

mytap

Önceki msjlarımdada dediğim gibi PROTON kullanıyorum. PBP da denemedim 2 yıldır basic editörü olarak PROTON kullanıyorum. Bir sistemde yukardaki gibi kontrol kullanmıştım halen çalışmakta. Proton güçlü bir editör. İşimizi kolaylaştırmak için herşey düşünülmüş..
-------------------------------------------------------- hayırlı günler, iyi çalışmalar..  --------------------------------------------------------

sitenindelisi

Sanırım bir yanlış anlaşılma oldu. Ben doğru gelmedi derken, çalışmaz anlamında söylemedim. Çalışması için bir engel yok. Kodlama tekniği açısından söyledim.

mytap

Arkadaşın problemi için sanırım bu kadar örnek ve yardım yeterli sanıyorum bilmiyorum başka ne yapabilirz. Sizin kodlarınıza şöyle bir baktım yani başka dicek bişey kalmadı aslında.
-------------------------------------------------------- hayırlı günler, iyi çalışmalar..  --------------------------------------------------------