proton yardımı

Başlatan styx75, 23 Nisan 2014, 18:36:51

styx75

selam arkadaşlar. öncelikle herkezin 23 nisan ulusal EGEMENLİK cocuk bayramı kutlu olsun
1 gündür ugraşmama rağmen 18f4550 ve 16f628a yı usart haberleştiremedim okadar çok nette gezindim ama sonunda kafa çorba oldu  :) çok bilmediğim bir konu oldugu için buraya yazmaya karar verdim kodları veriyorum ..glcd de ölçüm sonucu alakasız değerler göstermekte
verici
Kod: [Seç]

Device = 16F628A
Declare Xtal=4 
OPTION_REG=%0000000
TRISA=%00111110
TRISB=%11100011   
CMCON=7

Declare All_Digital= TRUE       
Declare Hserial_Baud 9600
Declare Hserial_RCSTA %10010000
Declare Hserial_TXSTA %00100100
Declare Hserial_Clear = On
Declare Hserial_SPBRG 25

Dim DEGER As Word
Dim DERECE As Word
Dim derece1 As Byte
Dim derece2 As Byte 
           
Symbol DQ=PORTB.0

DelayMS 200
BASLA:
GoSub OKU
GoSub GONDER


GoTo BASLA

OKU:
OWrite DQ , 1, [$CC, $44]
OWrite DQ, 1, [$CC, $BE]           
ORead DQ, 0, [DEGER.LowByte, DEGER.HighByte]   
DERECE = DEGER */ 160:derece1=DERECE/10:derece2=DERECE //10
Return 

GONDER:   
HSerOut [derece1,derece2]
HSerOut [derece1,derece2]   
Return

 


alcı
Kod: [Seç]

Device = 18F4550
Declare Xtal=20   
Declare All_Digital= TRUE
INTCON=%00000000     
TRISA=%00000001   
TRISB=%11111111
TRISC=%10000000
TRISD=%00000000
INTCON2=%01000001
TRISE=%000

Declare LCD_DTPort = PORTD     
Declare LCD_RSPin = PORTA.1
Declare LCD_ENPin = PORTA.2
Declare LCD_RWPin = PORTA.3
Declare LCD_CS1Pin = PORTA.4
Declare LCD_CS2Pin = PORTA.5
Declare LCD_Type =  GRAPHIC
Declare GLCD_STROBE_DELAY = 1
Declare GLCD_CS_Invert = On       
Declare Internal_Font = On                 
Declare Font_Addr = 0

Declare Hserial_Baud 9600
Declare Hserial_RCSTA %10010000
Declare Hserial_TXSTA %00100100
Declare Hserial_Clear = On
Declare Hserial_SPBRG 25

Dim DERECE1 As Byte
Dim DERECE2 As Byte

Cls
DelayMS 200
BASLA:
GoSub AL
Print At 4,10,Dec DERECE1,".",Dec1 DERECE2, 

GoTo BASLA

AL:
HSerIn [DERECE1,DERECE2]
Return 

End
Include "font.inc"

ete

Her ne kadar Proton da yazılmış bir programda olsa sorunun kaynağı belli.
Sıcaklık okuması yaklaşok 750 ms süren bir prosestir. Programda bu beklemeyi sağlayacak bir komut göremedim. Dolayısıyla sensör okuma kısmında hata dan ziyade eksiklik var. Okuma işlemi için yeterli zaman sensöre tanınması gerekiyor aksi taktirde abuk subuk şeyler okursunuz.

İkinci yanlışlık alıcı kısmı basit şekilde gosub AL komutu ila halledilmeye çalışılmış. Ne bir ön işaretçi var. ne kesme kullanılmış bütün bunlar iki program arasındaki senkron kurulması zorluğu yaratmaktan başka hiç bir işe yaramaz. Kısaca sistemin çalışmaması için ne gerekiyorsa yapılmış.

Sistemin çalışması için,
Verici kısmında sensör okuma kısmı aşağıdaki şekilde yapılmalı,
OKU:
OWrite DQ , 1, [$CC, $44]
OWrite DQ, 1, [$CC, $BE]   
Delayms 750       
ORead DQ, 0, [DEGER.LowByte, DEGER.HighByte]   
DERECE = DEGER */ 160:derece1=DERECE/10:derece2=DERECE //10
Return 


Ayrıca veri yollama kısmına bir işaretçi eklenmeli ve veri paketinin başına uyandırma sinyali eklenmelidir.
GONDER:   
       HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]
       HSEROUT ["S","T","Y",derece1,derece2]
       HSEROUT ["S","T","Y",derece1,derece2]
Return

Alıcı kısımda ise alma işlemi kesmeye bağlanmalı yani USART Kesmesi kullanılmalıdır.
Burada Usart kesmesini nasıl kullanacağını anlatmayacağım. Örneklere bakman gerekecek.
Kesme kullanmaz isen yalnızca git gelen ne varsa al demekle veri alınmayacağını anlaman gerekiyor.
Veri bir trene benzer geldiği zaman sende istasyonda bekliyor olmaz isen treni kaçırırsın yada tren kalktıktan sonra yetişmeye çalışırsınki buda yine treni kaçırma anlamına geliyor zaten. Dolayısıyla ya veri başında bekler gelirse alırsın yada işi kesmeye bağlayıp başına bir bekçi dikmiş olursun. Veri gelince kesme onu otomatik olarak alır seninde başında beklemen gerekmez.
Dediklerimi yaparsan bu sistem çalışır.

Ete

styx75

hocam çok teşekkür ederim..şimdi bazı şeyler netleşiyor ... serin ve serout komutlarında buyurdugunuz gibi "s" "t" "y" benzeri yapı ve en önemlisi serın komutundaki wait komutu sayesinde buna benzer bir devre çılştırmıştım..ama benim asıl amacım seri iletişim kesmesini öğrenmekti,öncelikle hserin ve hsout komutlarını pekiştirip kesmeye geçeyim demiştim ama sizin işaret ettiginiz gibi kesme ile beraber öğrenmek daha dogru sanırım..

bahacan07

Saygılarımla..Ete hocama katılıyorum ,birde dikkat etmen gereken konu 4550 de tanımları yaparken brgh=1 yani hıgh seçmişken 20mhz de SPBRG 9600 BAUD da 25 değil  520 olacak diye düşünüyorum.Başarılar ve kolay gelsin.

styx75

bahacan çok teşekkür ederim iligne ve temennilerine ..en kısa zamanda deneyecegim

est32

aklınızda bulunsun daha önce 12f675'e proton ile yazılımsal seri alıcı yazmıştım ve günlerce çalışmama nedenini bulmak için adeta çıldırmıştım, sonra aynı programı hiç değiştirmeden pbp ye çevirdim ve program çatır çatır çalıştı.
protona çok güvenmeyin, çok yamuk yapıyor...

styx75

#6
yanıtlarınız için çok teşekkür ederim..
kodları çalıştırmayı başardım tabi bunda başda ete hocam ve sizlerin katkısı ile..
nacizane bir ek bir bilgi vereyim "18f4550" için
18f4550 ve 20 mhz ile "Hserial_SPBRG=" declaresinin degeri 129 yani "Hserial_SPBRG=129"
ayrıca protonda pbp da oldugu gibi iki farklı byte tipi  değişkendeki veriyi gönderemedim farklı sanırım
örnek
"HSerOut ["S","T","Y","X",Dec VER,Dec VER2]"

styx75

selam..
hserin işini halletikden sonra usart kesmesi ile cebelleşmekteyim yardımlşarınızı bekliyorum
Device = 18F4550 
Declare Xtal=20
On_Hardware_Interrupt GoTo VERIAL
Declare All_Digital= TRUE Symbol GIE  =INTCON.7   
Symbol PEIE =INTCON.6 
Symbol RCIE=PIE1.5
Symbol RCIF=PIR1.5
Symbol IPEN=RCON.7

Dim AL As Byte
Dim TEMP As Byte
GoTo BASLA
'------kesme----
VERIAL:
Context Save 
If RCIF=1 Then
AL=0
HSerIn [Wait("STYX"),Dec AL]
TEMP=RCREG
RCIF=0   
EndIf   
Context Restore   
'-----------------------------
BASLA:
PORTE=0
GIE=0
IPEN=1 
RCIE=1
PEIE=1
GIE=1 
DelayMS 500
Cls                   
NN: 
Print At 4,10,"STYX"
Print At 5,10,Dec3 AL
PORTE.0=1
DelayMS 1
PORTE.1=1
DelayMS 1
PORTE.2=1
DelayMS 1
PORTE.0=0
DelayMS 1
PORTE.1=0
DelayMS 1
PORTE.2=0
DelayMS 1
GoTo NN                                   
End
Include "font.inc"


buradaki durumu kısaca izah edeyim (devre bread broad üzerinde kurdum.)
seri kesme kaynagı olarak başka bir picden  500 ms aralıklarla 11 ve 12 bilgisi geliyor. bilgi alışı ve donanım kesmesine girmeyle ilgili sıkıntı yok ama sorun ,kesme gerçekleştigi zaman program tekrar geldiği yere dönmesi için bir kesmenin gelmesi daha gerekiyor..bu durumda 1ms aralıklarla yanması gereken üç led kesme kaynagından gelen kesme hızına göre çalışıyor  :) ..kesme rutinini protonun manuelinden yapmaya çalıştım..
kesmeden sonra otomatik geri kaldıgı yere gitmesi için neyi yanlış yapıyoum sizce yardımlarınızı bekliyorum..
saygılar

ete

#8
Protonda yardımcı olmam mümkün değil maalesef. Bilen birisi yardım etsin.
Programdaki delay komutları işini aksatabilir.!!!!!

Ete

styx75

ilginize çok teşşekür edrim hocam..aşama aşama ilerliyorum,bunuda sonuçlandıracagım umarım tabiki tecrübeli arkadaşların sayesinde  :)

bahacan07

Kolay gelsin styx75 ..picleri haberleştirebilmene sevindim.Ben 16 bit diye düşünüp spbrg 520 demiştim.Haklısın 8 bitte spbrg 129.Şimdi ki sorununda ise bence önce aldığın data aralığını 500ms ten örneğin 2500 ms te gönderip al ,böylece gözün isisten ve isis çalışma hızından kurtulsun.Sayın ETE hocanın bizlere öğretmeye çalıştığı bir komut uygulamasını hatırladım HSERIN  20,ATLA, [Wait("STYX"),Dec AL] Yaparsan kesme içinde veri gelmesini beklemez 20ms sonra bir alt satıra koyacağın ATLA başlığına atlayıp kesme den çıkar ve ledlerin devamlı yanmaya yada çok kısa aralıklarla yanıp sönmeye başlar diye düşünüyorum.Bir dene bakalım başarılar...

ete

PBP da kesmeden sonra programı kaldığı yere döndüren Resume komutu vardır. Protonda da benzer bir şey olması gerekir. Sende bu komutlar eksik gibi geliyor bana.
Ete

Maxim

kodu çalışır hale getirebilrmisiniz, derlenmiyor bile
sigorta tanımlarıda yok
isis dosyası yok

styx75

#13
sevgili maxim öncelikle  ilgin için çok teşekkür ederim..
ben isis kullanmadan devreyi direk breadbroad üzerinde deniyorum.kodların proton ıde ile derledigim tam halini veriyorum.
bahacan sanada çok teşekkür ederim söylediğin gibi yaptım ama malesef olmadı..
durum tam olarak her kesmede ana programda bir komut satırını çalıştırıyor. dolayısıyla grafik lcd yazdırma satırna geldiginde al değişkenindekini yazıyor
yardımlarınızı bekliyorum..yaş 40 olunca asabiyet hat safada..ortayaş bunalımı sanırım  :D

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2014 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 21.04.2014                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

Device = 18F4550
Declare Xtal=20
On_Interrupt GoTo VERIAL
Declare All_Digital= TRUE
Declare LCD_DTPort = PORTD     
Declare LCD_RSPin = PORTA.1
Declare LCD_ENPin = PORTA.2
Declare LCD_RWPin = PORTA.3
Declare LCD_CS1Pin = PORTA.4
Declare LCD_CS2Pin = PORTA.5
Declare LCD_Type =  GRAPHIC
Declare GLCD_STROBE_DELAY = 1
Declare GLCD_CS_Invert = On       
Declare Internal_Font = On                 
Declare Font_Addr = 0 
Declare FSR_CONTEXT_SAVE=On
Declare Watchdog=On
Declare Hserial_Baud=9600
Declare Hserial_RCSTA=%10010000
Declare Hserial_TXSTA=%00100100
Declare Hserial_SPBRG=129   
Symbol GIE  =INTCON.7   
Symbol PEIE =INTCON.6 
Symbol RCIE=PIE1.5
Symbol RCIF=PIR1.5
Symbol IPEN=RCON.7 
Dim AL As Byte
Dim TEMP As Byte
GoTo BASLA   
VERIAL:
Context Save 
If RCIF=1 Then
AL=0
HSerIn [Wait("STYX"),Dec AL]
TEMP=RCREG
RCIF=0   
EndIf   
Context Restore
BASLA:
TRISA=%00000001   
TRISB=%11111111
TRISC=%11000000
TRISD=%00000000
TRISE=%000000000
INTCON2=%00000000
PORTE=0
GIE=0
IPEN=1 
RCIE=1
PEIE=1
GIE=1 
DelayMS 500
Cls                   
NN:   
Print At 4,10,"STYX"
Print At 5,10,Dec3 AL 
PORTE.0=1
DelayMS 1
PORTE.1=1
DelayMS 1
PORTE.2=1
DelayMS 1
PORTE.0=0
DelayMS 1
PORTE.1=0
DelayMS 1
PORTE.2=0
DelayMS 1
GoTo NN                                   
End
Include "font.inc"


Maxim

biraz uğraşayım dedim fakat sonradan aklıma protonun buffered_hserin eklentisi geldi.
hiç kasmaya gerek yok.
diskinizde proton sample klasörünü bulun, orada new samples altında
hazır yapılmış donanımlı seri alıcı kodu var, istersen 5 saniye bekleme koy, datalar gelmeye devam eder.


Buffered_Hserin_Test.bas

'
'*************************************************************************************************************
'* This source code is provided 'as is' and any express or implied warranties, including,                    *
'* but not limited to, the implied warranties of merchantability and fitness for a particular                *
'* purpose are disclaimed.                                                                                   *
'*                                                                                                           *
'* In no event shall the author, Crownhill or contributers be liable for any direct, indirect, incidental,   *
'* special, exemplary, or consequential damages (including, but not limited to,  procurement of substitute   *
'* goods or services; loss of use, data, or profits;  or business interruption) however caused and on any    *
'* theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise)   *
'* arising in any way out of the use of this source code, even if advised of the possibility of such damage. *
'*                                                                                                           *
'* Any views and conclusions contained in the source code and any documentation are those of the author's    *
'* and should not be interpreted as representing official policies,                                          *
'* either expressed or implied, of Crownhill Associates Ltd.                                                 *
'*************************************************************************************************************
'
' Serial buffer replacement for Hserin/Hrsin commands Demonstration program
'
' For 18F devices only.
' The code can be simulated using ISIS and the PIC18_ALCD_VHB.DSN circuit.
'
    Device = 18F452
    Declare Xtal = 20
    Declare Optimiser_Level = 3         ' Full optimisation
    Declare Dead_Code_Remove = On       ' Remove redundant Asm mnemonics
'
' Setup the USART
'
    Declare Hserial_Baud = 9600         ' Set baud rate for USART 1
    Declare Hserial_RCSTA = %10010000   ' Enable serial port and continuous receive
    Declare Hserial_TXSTA = %00100000   ' Enable transmit and asynchronous mode
'
' Setup the LCD
'
    Declare LCD_DTPin = PORTD.4         ' Point LCD Data lines to PORTD.4, PORTD.5, PORTD.6, and PORTD.7
    Declare LCD_RSPin = PORTE.0         ' Point LCD RS line to PORTE.0
    Declare LCD_ENPin = PORTE.1         ' Point LCD EN line to PORTE.0
    Declare LCD_Interface = 4           ' Set the LCD interface to 4-bit
    Declare LCD_Lines = 2               ' Set the amount of lines in the LCD as 2
'
' Create some variables
'
    Dim Bytein As Byte
    Dim Xpos As Byte

'------------------------------------------------------------------------------------------------------------------------------------

    Include "Buffered_Hserin.Inc"    ' Load the USART 1 interrupt handler and buffer read subroutines into memory

'------------------------------------------------------------------------------------------------------------------------------------
' Main program loop starts here
'
Main:
    DelayMS 100                      ' Wait for things to stabilise
    Declare All_Digital = True       ' Make PORTA and PORTE digital inputs

    HRSOut "Type some characters in the terminal window\r",_
           "and they will appear on the LCD.\r",_
           "Note that no characters are missed\r",_
           "even though there is a stupidly large delay within the receiving loop.\r\r"

    Init_Usart_Interrupt             ' Initiate the USART 1 serial buffer interrupt
    Clear_Serial_Buffer              ' Clear the serial buffer and reset its pointers

    Cls                              ' Clear the LCD
    Print "Ready"
    Cursor 2,1                       ' Move to beginning of line 2 on the LCD
    Xpos = 0                         ' Reset the X position on the LCD
    While 1 = 1                      ' Create an infinite loop
        HRSIn Bytein                 ' Read data from the serial buffer
        HRSOut Bytein                ' Echo the character to the terminal
        Inc Xpos                     ' Increment the X position of the LCD
        If Xpos > 15 Then            ' Have we filled the second line of the LCD ?
            Print At 2,1,Rep " "\16  ' Yes. So Clear the second line of the LCD
            Cursor 2,1               ' Move to beginning of line 2 on the LCD
            Xpos = 0                 ' Reset the X position of the LCD
        EndIf
        DelayMS 200         ' <<< Add a stupidly large delay between serial capture >>>
        Print Bytein                 ' Display the byte received from the serial buffer
    Wend




buda inc dosyası
Buffered_Hserin.inc

'
'*************************************************************************************************************
'* This source code is provided 'as is' and any express or implied warranties, including,                    *
'* but not limited to, the implied warranties of merchantability and fitness for a particular                *
'* purpose are disclaimed.                                                                                   *
'*                                                                                                           *
'* In no event shall the author, Crownhill or contributers be liable for any direct, indirect, incidental,   *
'* special, exemplary, or consequential damages (including, but not limited to,  procurement of substitute   *
'* goods or services; loss of use, data, or profits;  or business interruption) however caused and on any    *
'* theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise)   *
'* arising in any way out of the use of this source code, even if advised of the possibility of such damage. *
'*                                                                                                           *
'* Any views and conclusions contained in the source code and any documentation are those of the author's    *
'* and should not be interpreted as representing official policies,                                          *
'* either expressed or implied, of Crownhill Associates Ltd.                                                 *
'*************************************************************************************************************
'
' Interrupt-driven serial buffer for USART1 receive using a hardware high priority interrupt.
'
' This subroutine replaces the compiler's Hserin/Hrsin commands library subroutines
'
' For use with 18F devices only using the Proton Compiler version 3.3.0.0 Onwards
'
' Version 2 Written by Les Johnson 17th August 2007.
'
    #Disable HRSIn, Hrsinto, Hrsin_Rcreg_Read           ' Disable the library subroutines for Hrsin with and without timeouts
'
' Create the SYSTEM variables and aliases for the Buffered commands
'
    Dim GEN     As Byte System                          ' \
    Dim GENH    As Byte System                          ' / Timeout value storage
    Dim PP0     As Byte System                          ' \
    Dim PP0H    As Byte System                          ' / Storage for FSR0L\H registers
    Dim PP1     As Byte System                          ' \
    Dim PP1H    As Byte System                          ' / Timeout inside loop counter
    Dim _USART_Timeout_Int As GEN
    Dim _USART_Timeout_IntH As GENH
    Dim _USART_Timeout_Value As _USART_Timeout_Int.Word ' Alias the timeout value to GEN\H
    Dim _FSR0_Save_Int As PP0
    Dim _FSR0_Save_IntH As PP0H
    Dim _USART_FSR0_Save As _FSR0_Save_Int.Word         ' Alias the FSR0L\H storage to PP0\H
    Dim _Inside_Loop_Int As PP1
    Dim _Inside_Loop_IntH As PP1H
    Dim _USART_Inside_Loop As _Inside_Loop_Int.Word     ' Alias the inside loop to PP1\H
    Dim _USART_Outside_Loop As PRODL.Word               ' Alias the outside loop to PRODL\H registers
    Dim _USART_FSR1_Save As Word System                 ' Storage for FSR1L\H registers
    Dim _USART_Index_In As Byte System                  ' Pointer to the next empty location in the buffer
    Dim _USART_Index_Out As Byte System                 ' Pointer to the location of the oldest character in the buffer
'
' Create the actual serial buffer
'
    Symbol _USART_Buffer_Size = 100                     ' The amount of RAM to use as a ring buffer (Max 255)
    Dim _USART_Ring_Buffer[_USART_Buffer_Size] As Byte Heap ' Array for holding received characters

    Dim _USART_FSR0 As FSR0L.Word
    Dim _USART_FSR1 As FSR1L.Word
'
' Point to the high priority hardware interrupt handler
'
    On_Hardware_Interrupt GoTo _USART_High_Prior_Interrupt

    GoTo _Over_Usart_Handler                             ' Jump over the subroutines
'-------------------------------------------------------------------------------
' USART1 ring buffer interrupt handler
'
' Input     : Interrupt is triggered on reception of a byte from the USART
' Output    : Array _USART_Ring_Buffer holds the characters received
'           : Byte _USART_Index_In points to the current location within the buffer
' Notes     : Does not indicate if an error occurs but does clear the error flags and carries on
'
_USART_High_Prior_Interrupt:
    If PIR1.5 = 1 Then                                   ' Was it a USART1 byte Receive that triggered the interrupt ?
        Movlw 6                                          ' Yes. So Mask out unwanted bits
        Andwf RCSTA,W                                    ' Check for errors
        Bnz _UART_Error                                  ' Was either error status bit set?
        _USART_FSR1_Save = _USART_FSR1                   ' Save FSR1L\H registers
        Inc _USART_Index_In                              ' Move up the buffer
        If _USART_Index_In >= _USART_Buffer_Size Then    ' End of buffer reached ?
           _USART_Index_In = 0                           ' Yes. So clear _USART_Index_In
        EndIf
        _USART_FSR1 = VarPtr _USART_Ring_Buffer          ' Point FSR1L\H to _USART_Ring_Buffer
        _USART_FSR1 = _USART_FSR1 + _USART_Index_In      ' Add the buffer position to FSR1L\H
        INDF1 = RCREG                                    ' Place the received character into the buffer
        _USART_FSR1 = _USART_FSR1_Save                   ' Restore FSR1L\H registers
        Retfie Fast                                      ' Exit from the interrupt, restoring the WREG, STATUS, and BSR registers
_UART_Error:
    Clear RCSTA.4                                        ' Clear receiver status
    Set RCSTA.4
    EndIf
' <<< Other Interrupt Conditions and Code here >>>
    Retfie Fast                                          ' Exit from the interrupt, restoring the WREG, STATUS, and BSR registers
'------------------------------------------------------------------------------
' Wait for a character from the interrupt driven circular buffer with timeout
'
' Input     : GEN\GENH hold the timeout value in approx ms (0 to 65535)
' Output    : PP0 and WREG hold the value received
'           : CARRY Flag (STATUS.0) Clear if timeout out
' Notes     : Uses PRODL\H as temporary variable storage
'           : Uses FSR0L\H as buffer the pointer
'
#ifdef HRSINTO#REQ
HRSIn2:
@Read#Buffer_Req = 1                                  ; Enable the _USART_Get_Char subroutine
    _USART_Outside_Loop = _USART_Timeout_Value        ' Save the timeout value so it doesn't get overwritten
    Clear _USART_Inside_Loop                          ' Reset the inside loop counter
_USART_Getbuf_Outside:
    Bra     $ + 2                                     ' Delay for 2 cycles within the outside loop
_USART_Getbuf_Inside:
    #ifdef WATCHDOG_REQ                               ' Delay for 1 cycle within the inside loop
        Clrwdt
    #else
        Nop
    #endif
    Movf      _USART_Index_In,W                       ' \
    Subwf     _USART_Index_Out,W                      ' / Is there anything in the serial buffer ?
    Bnz       _USART_Get_Char                         ' Yes. So fetch it
    WREG = 255                                        ' \
    Addwf     _USART_Inside_Loop,F                    '  \
    Addwfc    _USART_INSIDE_LOOPH,F                   '    Decrement the inside and outside loops
    Addwfc    _USART_Outside_Loop,F                   '  /
    Addwfc    _USART_OUTSIDE_LOOPH,F                  ' /
    Btfss     STATUS,C
    Ret                                               ' Return with the CARRY flag clear to indicate timed out
    Infsnz    _USART_Inside_Loop,W
    Incfsz    _USART_INSIDE_LOOPH,W
    Bra       _USART_Getbuf_Outside
    _USART_Inside_Loop = ((59 * Xtal) / 4)            ' Set the inside loop counter based upon the XTAL frequency
    Bra       _USART_Getbuf_Inside
#endif
'------------------------------------------------------------------------------
' Wait for a character from the interrupt driven circular buffer without timeout
'
' Input     : None
' Output    : WREG holds the value received
' Notes     : Uses FSR0L\H as buffer pointers
'
#ifdef Hrsinx#Req
@Hrsin
@Read#Buffer_Req = 1                                  ; Enable the _USART_Get_Char subroutine
    While _USART_Index_In = _USART_Index_Out          ' Wait for a character to apear in the serial buffer
        #ifdef WATCHDOG_REQ
        Clrwdt                                        ' Clear the watchdog timer within the loop if required
        #endif
    Wend
#endif
' Fall through to _USART_GET_CHAR
'------------------------------------------------------------------------------
' Read a character from the interrupt driven circular buffer
'
' Input     : None
' Output    : WREG holds the value received
' Notes     : Uses FSR0L\H as buffer pointers
'
#ifdef Read#Buffer_Req
_USART_Get_Char:
    Inc _USART_Index_Out                              ' Increment _USART_Index_Out pointer (0 to 255)
    If _USART_Index_Out >= _USART_Buffer_Size Then    ' End of buffer reached ?
        _USART_Index_Out = 0                          ' Yes. So clear _USART_Index_Out.
    EndIf
    _USART_FSR0_Save = _USART_FSR0                    ' Save FSR0L\H registers
    _USART_FSR0 = VarPtr _USART_Ring_Buffer           ' Point FSR0L\H to _USART_Ring_Buffer
    _USART_FSR0 = _USART_FSR0 + _USART_Index_Out      ' Add the buffer position to FSR0L\H
    WREG = INDF0                                      ' Read buffer location (_USART_Index_Out) into WREG
    PP0 = WREG                                        ' Also place it into PP0
    _USART_FSR0 = _USART_FSR0_Save                    ' Restore FSR0\H registers
    Bsf STATUS,C                                      ' Set the CARRY flag to indicate a byte received
    Return
#endif
'--------------------------------------------------------------------------------
' Initialise the USART1 interrupt
'
' Input     : None
' Output    : None
' Notes     : Enables interrupt on USART1 receive.
'           : Enables global and peripheral interrupts
'           : If Prioritised interrupts are used, the USART interrupt priority is made high
'
Init_Usart_Interrupt Macro
    GoSub _Init_Usart
    Endm

#ifdef Init_Usart_Interrupt#Req
_Init_Usart:
    _USART_Index_In = 0                               ' Clear the buffer internal pointer
    _USART_Index_Out = 0                              ' Clear the buffer external pointer
    PIE1.5 = 1                                        ' Enable interrupt on USART1 receive
    #ifdef __Low_Interrupts_Enabled                   ' Are we using low priority interrupts as well ?
        IPR1.5 = 1                                    ' Yes. So USART1 Receive Interrupt to High priority
    #endif
    INTCON = %11000000                                ' Enable global and peripheral interrupts
    Return
#endif
'--------------------------------------------------------------------------------
' Clear the Serial Buffer
'
' Input     : None
' Output    : None
' Notes     : Also resets the index pointers to the serial buffer
'
Clear_Serial_Buffer Macro
    GoSub _Clear_Usart_Buffer
    Endm

#ifdef Clear_Serial_Buffer#Req
_Clear_Usart_Buffer:
    PIE1.5 = 0                                      ' Disable interrupt on USART1 receive
    Clear _USART_Ring_Buffer                        ' Clear the serial buffer
    _USART_Index_In = 0                             ' Clear the buffer internal pointer
    _USART_Index_Out = 0                            ' Clear the buffer external pointer
    PIE1.5 = 1                                      ' Re-Enable interrupt on USART1 receive
    Return
#endif
'--------------------------------------------------------------------------------
_Over_Usart_Handler:




Powered by EzPortal