Hello guys,
I am a newbie to this forum and PIC/PBP.
I am very glad to have Darrel Taylor's DT_INTS-14 compiled and work great for me.
I tried to add small routine for receiving data from usart but something start to stop working.
I posted my code below with all details remaked. Please someone find what have i done wrong.
I am still in my learning process and am scrolling. Many thanks
Cheers,
ozion
Code:'**************************************************************** '* Name : BringTogether_with_RX-USart.BAS * '* Notice : Using DT_INTS-14 * '* MCU : PIC16F877A * '* Goal : A string of data from PC via usart will interrupt * '' : the PIC from what it was doing to receive the data,* '* : filter and store received data for processing. * '* : After received the filtered data, an acknowledge * '* : will be send back to PC then return to what it was* '* : left off (and processing the received data) * '* : * '* Notes : This program was working without adding Usart RX * '* : Now '* : Clock works OK * '* : LED1 won't work * '* : LED2 won't work * '* : Usart won't work as expected. * '**************************************************************** clear define LOADER_USED 1 define OSC 8 ' Define LCD registers and bits Define LCD_DREG PORTB ' LCD Data register on PORTB Define LCD_DBIT 4 ' LCD data bits (4 bits) Define LCD_RSREG PORTB ' LCD Reset register on PORTB Define LCD_RSBIT 2 ' LCD Reset bit 2 (PORTB.2) Define LCD_EREG PORTB ' LCD Enable register on PORTB Define LCD_EBIT 3 ' LCD Enable bit 3 (PORTB.3) ADCON1 = 7 ' Set portA outputs to Digital / No ADC 'CMCON = 7 LCDOUT $FE,1 ' Initialize LCD PAUSE 200 dat_in var byte[10] ' Added for Usart receive data ack var byte ' Added for Usart receive acknowledge cntr var byte ' Added for Usart receive data storage LED1 VAR PORTD.0 LED2 VAR PORTD.3 INCLUDE "DT_INTS-14.bas" ' Required INCLUDE "ReEnterPBP.bas" ' Include if using PBP interrupts INCLUDE "Elapsed_INT.bas" ' Elapsed Timer Routines ' Initialize USART ' Added for Usart receive process TRISC = %10111111 ' Set PortC.6 to output, rest to input DEFINE HSER_BAUD 9600 ' Hser baud rate RCSTA = %10010000 ' Enable serial port and continuous receive TXSTA = %00100000 ' Enable transmit and asynchronous mode ASM INT_LIST macro ; IntSource, Label, Type, ResetFlag? INT_Handler INT_INT, _ToggleLED2, PBP, yes INT_Handler TMR0_INT, _ToggleLED1, PBP, yes INT_Handler TMR1_INT, _ClockCount, PBP, yes INT_Handler RX_INT, _Read_USART, PBP, yes ; Added endm INT_CREATE ; Creates the interrupt processor INT_ENABLE INT_INT ; enable external (INT) interrupts INT_ENABLE TMR0_INT ; enable Timer 0 interrupts INT_ENABLE TMR1_INT ; Enable Timer 1 Interrupts INT_ENABLE RX_INT ; enable RX_Usart interrupts ; Added ENDASM OPTION_REG = OPTION_REG & $80 | 1 ; Set TMR0 Prescaler to 256, leave RBPU alone Gosub ResetTime ' Reset Time to 0d-00:00:00.00 Gosub StartTimer ' Start the Elapsed Timer Main: if SecondsChanged = 1 then SecondsChanged = 0 LCDout $FE,$C0, dec Days,"d-",dec2 Hours,":",dec2 Minutes,":",dec2 Seconds endif if Ack=1 then ' Added gosub Receive_Ack ' Added endif ' Added GOTO Main '---[INT - interrupt handler]--------------------------------------------------- ToggleLED1: Toggle LED1 @ INT_RETURN '---[TMR0 - interrupt handler]-------------------------------(Blinky Light)------ T0Count Var WORD ToggleLED2: T0Count = T0Count + 1 if T0Count = 512 then T0Count = 0 : Toggle LED2 @ INT_RETURN '//////////////////////////////////////////////////////////////////////////////////// 'Added to read Usart Read_USART: hserin[dat_in] '=========================================================================== 'The following 2 lines won't work 'hserin[wait("X"),str dat_in\5] ' Wait for X ;receive a string of characters 'hserin[wait("X"),dat_in] ' Wait for X '=========================================================================== 'Following lines send back string includes first dectect char "$" 'Example: PC sent: "12345$6789" ' PIC send back to PC "12345$" ack=0 ' clear ack cntr=0 ' reset counter while cntr<10 ' looping if (dat_in[cntr]= "$") then ' filter character "$" HSEROUT[str dat_in,cntr] ' ack=1 ' Yes found "$" cntr=10 ' get out of loop endif ' cntr=cntr+1 ' increment counter wend ' HSEROUT[str dat_in] ' send to PC 'gosub Receive_Ack ' This doesn't works it does not call Receive_Ack @ INT_RETURN Receive_Ack: if ack=1 then HSEROUT ["got it:"] HSEROUT[str dat_in] ' Send dat_in received string endif ack=0 return '//////////////////////////////////////////////////////////////////////////////




Bookmarks