serial data ideas please


Closed Thread
Results 1 to 22 of 22

Hybrid View

  1. #1
    Join Date
    Apr 2007
    Location
    Pennsylvania, USA
    Posts
    158


    Did you find this post helpful? Yes | No

    Default Re: serial data ideas please

    What did you end up changing?
    Shawn

  2. #2


    Did you find this post helpful? Yes | No

    Default Re: serial data ideas please

    Just the oscon and osctune to your values.

  3. #3


    Did you find this post helpful? Yes | No

    Default Re: serial data ideas please

    DT Interrupts?

    A problem has appeared and when the routine has been runing for a random amount of time the TX side of the usart starts sending garbage causing a crash in my external equipment. I have used a scope and logic probe on the input/output and the incomming data is correct.

    I'm running the 18F2620 at 32mhz and have removed all my extra code so the pic is now just running this interupt driven USART rxd & txd 9600,8,E,1

    Any stupid errors spring to mind?

    Bizzarely when the code is running correctly if I touch a piece of wire to the GND on my pcb the usart crashes and sends garbage or if i connect my unconnected to anything else logic analyser to just the gnd pin the usart crashes? The wire or equipment does not have to be connected to anything so perhaps is picking up some EMI but how can that be affecting the pic? Any ideas on extra capacitance to add. Is the pic flaky at 32mhz? The pic and code seems solidly reliable otherwise.

    Code:
    '------------------------------ General 18F2620 configuration --------------------------
    
    #CONFIG
     __CONFIG _CONFIG1H, _OSC_INTIO67_1H & _FCMEN_OFF_1H & _IESO_OFF_1H
     __CONFIG _CONFIG2L, _PWRT_OFF_2L & _BOREN_OFF_2L
     __CONFIG _CONFIG2H, _WDT_OFF_2H
     __CONFIG _CONFIG3H, _PBADEN_OFF_3H & _LPT1OSC_OFF_3H & _MCLRE_OFF_3H
     __CONFIG _CONFIG4L, _STVREN_OFF_4L & _LVP_OFF_4L & _XINST_OFF_4L & _DEBUG_OFF_4L
    #ENDCONFIG
    
    DEFINE OSC 32			'Set PicBasic Pro processor speed to 8 Mhz (Must change this if run at 32mhz mode)  
    OSCCON = %01110000 		'Internal 8 mhz Osc and stable 
    OSCTUNE= %11000000		'Pllen Frequency Multiplier Enabled for 8mhz Clock enables 32mhz Clock!!
    
    CMCON  = %00000111		'Comparators Off
    CVRCON = %00000000		'CvRef Powered Down 
    
    CCP1CON= %00001100		'CCP1 Module PWM Mode
    CCP2CON= %00000000		'CCP2 Module Disabled 
    
    HLVDCON= %00000000		'HLVCON Disabled
    
    T1CON  = %00110000		'$30 = Prescaler 1:8, TMR1 OFF
    	
    TRISA = %00001011 		'SET PORTA0, A1 & A3 AS INPUTS, REST AS OUTPUTS
    TRISB = %00000000 		'SET PORTB AS OUTPUTS
    TRISC = %11010000 		'SET PORTC AS OUTPUTS EXCEPT PORT C4 & C6,C7 
    	
    ADCON0 = %00000001		'SETUP ADC & ENABLE ADC MODULE on AN0
    ADCON1 = %00001110		'SETUP ADC SET REFV to VDD & VSS AN0 
    ADCON2 = %00100010		'SETUP ADC FOSC/32 LEFT JUSTIFY TAD 8
    
    DEFINE LCD_DREG PORTB 		'PORTB is LCD data port
    DEFINE LCD_DBIT 0 		'PORTB.0 is the data LSB
    DEFINE LCD_RSREG PORTC 		'RS is connected to PORTC.0
    DEFINE LCD_RSBIT 0
    DEFINE LCD_EREG PORTC 		'EN is connected to PORTC.1
    DEFINE LCD_EBIT 1
    DEFINE LCD_BITS 8 		'8 lines of data are used
    DEFINE LCD_LINES 4 		'It is a 4-line display
    DEFINE LCD_COMMANDUS 2000 	'Use 2000uS command delay
    DEFINE LCD_DATAUS 50 		'Use 50uS data delay
    
    DEFINE ADC_BITS 8      		'Set number of bits in result
    DEFINE ADC_CLOCK 3      	'Set Clock source (3 = rc)
    DEFINE ADC_SAMPLEUS 50     	'Set sampling time in uS
       
    DEFINE CCP1_REG PORTC 		'HPWM channel 1 pin Port C Backlight PWM Driver
    DEFINE CCP1_BIT 2 		'HPWM channel 1 pin Bit 2
    
    'Setup the hardware USART for 9600 baud
    
    DEFINE HSER_BAUD 9600		'Set Baud rate to 9600bps
    DEFINE HSER_BITS 9		'Set to 9 bit mode
    DEFINE HSER_EVEN 1		'Set Even Parity
    DEFINE HSER_CLROERR 1 		'Clear overflow error automatically
    
    
    'Button		var PORTA.0	'Joy Button Input
    HLineIn		var PORTA.1	'H Line In
    HLineOut	var PORTA.2	'H Line Out
    KLineIn		var PORTA.3	'K Line In
    KLineOut	var PORTA.4	'K Line Out
    GreenLed	var PORTA.5	'Green Led Out
    Scs		    var PORTA.6	'SCS Line Out
    Piezo		var PORTA.7	'Piezo Buzzer Out
    
    Lcd0		var PORTB.0	'Parallel Lcd0
    Lcd1		var PORTB.1	'Parallel Lcd1
    Lcd2		var PORTB.2	'Parallel Lcd2
    Lcd3		var PORTB.3	'Parallel Lcd3
    Lcd4		var PORTB.4	'Parallel Lcd4
    Lcd5		var PORTB.5	'Parallel Lcd5
    Lcd6		var PORTB.6	'Parallel Lcd6
    Lcd7		var PORTB.7 	'Parallel Lcd7
    
    LcdRS		var PORTC.0	'Parallel LcdRS Line
    LcdEN		var PORTC.1	'Parallel LcdEN Line 
    LcdLight	var PORTC.2	'Parallel Lcd Backlight Control
    I2CClock	var PORTC.3	'I2CClock Line
    I2CData		var PORTC.4	'I2CData Line
    RedLed		var PORTC.5	'Red Led Out
    'Txd		var PORTC.6	'Usart Logger Txd
    'Rxd		var PORTC.7	'Usart Logger Rxd
    
    
    '*******************************************************************************
    
    'Variables Constants and I/O definitions
    
    '------------------------ Variables 16bit --------------------------------------
    
    
    	
    '------------------- Variables 8bit --------------------------------------------
    
    IChkSum   var BYTE  	'MotA Line rolling Checksum Byte
    AssistLevel   var byte 	'Shows level of Ima Assist
    RegenLevel    var byte	'Shows level of Ima Regen
    FlagBits  var BYTE	'Flag Bits Byte (0-7)  
    DutyCycle var BYTE	'PWM DutyCycle for Lcd backlight [127 = 50% duty] 
    Key 	  var BYTE 	'Returned Button Value (0-5) 5 = No key pressed
    Gen	  var BYTE	'Gen is a General Use Byte variable (0-255)
    
    ImaCtrl	   var BYTE	'Ima Control Byte 0-8 (0-3 = Regen) 4 = Off (5-8 = Assist) 
    
    
    LCM	  VAR BYTE    	'Lcd Command Code 254
    
    LCL       VAR BYTE    	'Lcd Control Code  Clear Lcd
    
    L12       VAR BYTE    	'Lcd Control Code  Line 1 Column 0
    L22       VAR BYTE    	'Lcd Control Code  Line 2 Column 0
    L32       VAR BYTE    	'Lcd Control Code  Line 3 Column 0
    L42       VAR BYTE    	'Lcd Control Code  Line 4 Column 0
    
    L52       VAR BYTE    	'Lcd Control Code  Line 1 Column 10
    L62       VAR BYTE    	'Lcd Control Code  Line 2 Column 10
    L72       VAR BYTE    	'Lcd Control Code  Line 3 Column 10
    L82       VAR BYTE    	'Lcd Control Code  Line 4 Column 10
    
    '------------------- Variables 1bit --------------------------------------------
    
    
    AssistBit var FlagBits.Bit1 	'Assist Bit Shows when Ima Assist in operation. 
    RegenBit  var FlagBits.Bit2 	'Regen Bit Show when Ima Regen in operation. 
    
    
    
    '------------------------------ Main Program -----------------------------------
    
    EEPROM 1014, [254,1,128,192,148,212,138,202,158,222]	'20x4 Lcd Control Codes
    
    '**************************************************************************************************************	
    
    'Alias & Vars
    RCIF VAR PIR1.5             	'Receive  interrupt flag (1=full , 0=empty)
    TXIF VAR PIR1.4             	'Transmit interrupt flag (1=empty, 0=full)
    OERR VAR RCSTA.1            	'Alias OERR (USART Overrun Error Flag)
    CREN VAR RCSTA.4           	'Alias CREN (USART Continuous Receive Enable)
    
    Ptr_in VAR BYTE             	'Pointer - next empty location in buffer
    ErrFlag VAR BYTE            	'Holds error flags
    ptr_in = 0                  	'Clear buffer pointer (in)
    
    Errflag = 0                 	'Clear error flag
    Char var byte			'Define Char as the data byte being sent
    RCSTA.7 = 1             'Configue PortC 6 & 7 as Usart
    BAUDCON.4 = 1                   'Invert USART Output for use with Transistor driver  TXCKP
    
    '-----------------------------------------------------------------------------
    INCLUDE "DT_INTS-18.bas"
    INCLUDE "ReEnterPBP-18.bas"     	'Include if using PBP interrupts
    
    ASM
    INT_LIST  macro    ;IntSource,        Label,       Type,    ResetFlag?
            INT_Handler    RX_INT,      _INT_Serin,     PBP,        no
        endm
        INT_CREATE               	;Creates the interrupt processor
    ENDASM
    
    @   INT_ENABLE   RX_INT     	;Enable external (INT) interrupts
    '-----------------------------------------------------------------------------
    
    '***********************************************************************  
    
    'Skip over the interupt handler & subroutines
    
    	goto Start
    
    '***********************************************************************  
    
    '-------------------------------------
    ' INTERUPT HANDLER
    '-------------------------------------
    		
    INT_Serin:                  				'Serial Interrupt routine
    
    	IF OERR Then usart_error 			'Check for USART errors
    	HSerin [Char]     				'Read USART 
    	
    	if Char = $B3 then             			'Start of 9 byte packet
    	Ptr_In = 0                     			'Reset Ptr_In to 0
    	IChkSum = 0                    			'Clear Checksum Byte
    	else
    	Ptr_In = Ptr_In + 1            			'Increment pointer 
        	endif 
        
        	If Ptr_In = 1 then                 		'If Byte is 1 then check if assist or regen requested
           	If AssistBit = 1 then Char = %00010000        	'Modify byte 1 for Ima Assist Control = 16 Normal 
    	    if RegenBit  = 1 then Char = %00100000          'Modify byte 1 for Ima Regen  Control = 32 Normal
            endif
        	    
        	If Ptr_In = 2 then                 		'If Byte is 2 then check if assist or regen requested             
            if AssistBit = 1 then Char = AssistLevel   	'Load Char byte 2 with Ima Assist Value 0-127 = 0-100%
            if RegenBit  = 1 then Char = RegenLevel		'Load Char byte 2 with Ima Regen  Value 127-0 = 0-100%
        	endif 
            
            If Ptr_In = 5 then                 		'If Byte is 5 then check if Regen requested
            If AssistBit = 1 then Char = %00100001        	'Modify byte 5 for Ima Assist Control = 33
            if RegenBit  = 1 then Char = %00000001          'Modify byte 5 for Ima Regen Control  = 1
            endif
                
        	if Ptr_In = 8 then              		'Calculate IChkSum Byte
    	IChkSum = ~ IChkSum				'NOT CheckSum
    	IChkSum = IChkSum + 1				'Add 1 to CheckSum
    	Char = IChkSum & $7F	 			'AND $7F
        	else
       	IChkSum = IChkSum + Char       			'Add Char to accumulated data
        	endif     
        
        	hserout [Char]                              	'Sends data     
            	
    	IF RCIF = 1 Then INT_Serin 				'Check for another character while we're here
    	
    	Toggle RedLed  	                         	'Flash the Red Led
    
    
    @ INT_RETURN           					'Return to program
    
    USART_Error:                				'Error - USART has overrun (data too fast?)
    
        	errflag.0 = 1               			'Set the error flag for hardware 
    	CREN = 0 					'Disable continuous receive to clear overrun flag
    	CREN = 1            				'Enable continuous receive
    
    @ INT_RETURN           					'Return to program
    
    
    '**************************************************************************************************************	
    
    'OBDII Gauge Main Program  
    
    Start:                          			'Start of Program 
    	
    	ImaCtrl = 4					'Ima Control Byte = 4 (No Assist or Regen)
    	Gosub SetIma					'Gosub Set Ima Routine
    	
    		
    	Read 1014,LCM,LCL,L12,L22,L32,L42,L52,L62,L72,L82	'Load 20x4 Lcd Control Codes from EEprom adr 
    
    	HPWM 1, 255, 500   				'Change/Start 500hz HPWM 'Set Backlight Duty 0 = Off 255 = FullOn
    
       	Pause 2000                              	'Pause for 2.0 seconds
    
    	LCDOUT LCM,LCL 
    	
    	    	
    '**************************************************************************************************************	
    
    DispLoop:						'Main Loop goes here
    
    	Toggle GreenLed					'Flashes Green Led
      	
    '***************************** Key Functions KeyBit 0 ****************************************
    
    '*Key Check*
    
    	Gosub KeyPress					'Gosub KeyPress Routine 5 = No Key Pressed
    	
    '*Key Bit Toggle* Press
    
        if Key = 0 then					'If Key = 0 (Press) then 
    	ImaCtrl = 4					'Ima Control Byte = 4 (No Assist or Regen)
    	Gosub SetIma					'Gosub Set Ima Routine
    	endif      
    
            
    '*Assist Up / Regen Down* Button Right
    
    	if Key = 2 then			'If Key = 2 (Right) and KeyBit = 0 then (Toggle Assist Bit)
    	If ImaCtrl < 8 then ImaCtrl = ImaCtrl + 1	'Increment ImaCtrl Byte if < 8
    	Gosub SetIma					'Gosub Set Ima Routine
    	endif 
    
    '* Assist Down / Regen Up* Button Left
    	
    	if Key = 4 then			'If Key = 4 (Left) and KeyBit = 0 then (Toggle Regen Bit)
    	If ImaCtrl > 0 then ImaCtrl = ImaCtrl - 1	'Decrement ImaCtrl Byte if > 0
    	Gosub SetIma					'Gosub Set Ima Routine
        	endif  
    
          	
    '* Display Assist/Regen Status on Screen
    	
    	LCDOUT LCM,146					'Set Display to Line 1, Column 19        	
    
        	if AssistBit = 1 then LCDOUT "A",#4 - (8-ImaCtrl)	'Display Assist Data on screen if active
        	if RegenBit  = 1 then LCDOUT "R",#4 - ImaCtrl 	     	'Display Regen  Data on screen if active
    	if AssistBit = 0 and RegenBit = 0 then LCDOUT 32,32	'Blank Assist/Regen data if not active    
    
        pause 250
    
    	goto DispLoop					'Goto Main Loop 
    
    
    '****************************** Set Ima Routine *******************************
    
    SetIma:							'Set Ima Routine 4 levels of assist/regen 25,50,75,100%
    
        	If ImaCtrl = 0 then				'If ImaCtrl = 0 then set Regen 100%
    	RegenLevel = 0           			'Set Regen to 100%
    	RegenBit = 1					'Set Regen Bit (Regen On)
    	elseif ImaCtrl = 1 then				'If ImaCtrl = 1 then set Regen 75%
    	RegenLevel = 64           			'Set Regen to 75%
    	RegenBit = 1					'Set Regen Bit (Regen On)
    	elseif ImaCtrl = 2 then				'If ImaCtrl = 2 then set Regen 50%
    	RegenLevel = 96           			'Set Regen to 50%
    	RegenBit = 1					'Set Regen Bit (Regen On)
    	elseif ImaCtrl = 3 then				'If ImaCtrl = 3 then set Regen 25%
    	RegenLevel = 116           			'Set Regen to 25%
    	RegenBit = 1					'Set Regen Bit (Regen On)
    
    	elseif ImaCtrl = 4 then				'If ImaCtrl = 4 then set Assist & Regen to 0%
    	RegenLevel = 0           			'Set Regen to 0%
    	RegenBit = 0					'Clear Regen Bit (Regen Off)
    	AssistLevel = 0           			'Set Assist to 0%
    	AssistBit = 0					'Clear Assist Bit (Assist Off)
    
    	elseif ImaCtrl = 5 then				'If ImaCtrl = 5 then set Assist 25%
    	AssistLevel = 15           			'Set Assist to 25%
    	AssistBit = 1					'Set Assist Bit (Assist On)
    	elseif ImaCtrl = 6 then				'If ImaCtrl = 6 then set Assist 50%
    	AssistLevel = 35           			'Set Assist to 50%
    	AssistBit = 1					'Set Assist Bit (Assist On)
    	elseif ImaCtrl = 7 then				'If ImaCtrl = 7 then set Assist 75%
    	AssistLevel = 76           			'Set Assist to 75%
    	AssistBit = 1					'Set Assist Bit (Assist On)
    	elseif ImaCtrl = 8 then				'If ImaCtrl = 8 then set Assist 100%
    	AssistLevel = 126           			'Set Assist to 126
    	AssistBit = 1					'Set Assist Bit (Assist On)
    	endif
    
        	return						'Return to Main Program 	
    
    
    '****************************** Buttons Routine *******************************
    
    'Check Button is pressed > Push = 0 Up = 1 Right = 2 Down = 3 Left = 4 No Key = 5 (Count1 = Press Duration)
    
    KeyPress:                    				'Decodes Joybutton Input and returns 5 values (0,1,2,3,4) in Key 
        	
        	ADCIN 0, Gen					'Get value 0-255
    	key = 5                         		'Set Default value for Key
    	If Gen > 234 then return			'If No key pressed then key = 5 return
    	if Gen < 235 then key = 2			'Test if button 2 pressed Right
    	if Gen < 192 then key = 1			'Test if button 1 pressed Up
    	if Gen < 150 then key = 4			'Test if button 4 pressed Left
    	if Gen < 107 then key = 3			'Test if button 3 pressed Down
    	if Gen < 64  then key = 0			'Test if button 0 pressed Press	
    	
    	High Piezo                             		'Sound Piezo
      	pause 75                              		'Pause for 0.075 seconds
    	low Piezo                              		'Stop Piezo
    	return						'Return to main program

  4. #4
    Join Date
    Jul 2003
    Location
    USA - Arizona
    Posts
    156


    Did you find this post helpful? Yes | No

    Default Re: serial data ideas please

    Sounds like there may be a HW issue. What does the simplified code looks like? Have you checked the errata on the device? There are USART flags for every silicon - but more so for the rev A's.

  5. #5


    Did you find this post helpful? Yes | No

    Default Re: serial data ideas please

    How do you know which version of silicon you have?

    Does PBP 3.04 code take into account these below errata issues?

    This looks suspect as I am using 9 bit HSEROUT mode with parity etc.


    17. Module: EUSART
    When performing back-to-back transmission in
    9-bit mode (TX9D bit in the TXSTA register is
    set), an ongoing transmission’s timing can be
    corrupted if the TX9D bit (for the next
    transmission) is not written immediately following
    the setting of TXIF. This is because any
    write to the TXSTA register results in a reset of
    the baud rate timer which will effect any ongoing
    transmission.
    Work around
    Load TX9D just after TXIF is set, either by polling
    TXIF or by writing TX9D at the beginning of the
    Interrupt Service Routine, or only write to TX9D
    when a transmission is not in progress
    (TRMT = 1).
    Date Codes that pertain to this issue:
    All engineering and production devices.

    18. Module: EUSART
    When performing back-to-back transmission in 9-bit
    mode (TX9D bit in the TXSTA register is set), the
    second byte may be corrupted if it is written into
    TXREG immediately after the TMRT bit is set.
    Work around
    Execute a software delay, at least one half the
    transmission’s bit time, after TMRT is set and prior
    to writing subsequent bytes into TXREG.
    Date Codes that pertain to this issue:
    All engineering and production devices.
    4. Module: Enhanced Universal
    Synchronous Receiver
    Transmitter (EUSART)
    One bit has been added to the BAUDCON register
    and one bit has been renamed. The added bit is
    RXDTP and is in the location, BAUDCON<5>. The
    renamed bit is the TXCKP bit (BAUDCON<4>),
    which had been named SCKP.
    The TXCKP (BAUDCON<4>) and RXDTP
    (BAUDCON<5>) bits enable the Asynchronous
    mode TX and RX signals to be inverted (polarity
    reversed). RXDTP has no effect on the
    Synchronous mode DT signal.
    Register 18-3, on page 204, will be changed as
    shown on page 3.
    Work around
    None required.
    Date Codes that pertain to this issue:
    All engineering and production devices
    :?

  6. #6
    Join Date
    Nov 2003
    Location
    Wellton, U.S.A.
    Posts
    5,924


    Did you find this post helpful? Yes | No

    Default Re: serial data ideas please

    I doubt it is the PIC.

    With all the stuff you have going on in the ISR and the possible jumping out of the ISR is one problem. ISRs should be short and it is not a good idea to jump out of one.

    Then you describe the touching of a wire to the board causes problems... That is a hardware problem you have, not the PIC. Post a schematic and someone may be able to spot the problem there.
    Dave
    Always wear safety glasses while programming.

  7. #7
    Join Date
    Jul 2003
    Location
    USA - Arizona
    Posts
    156


    Did you find this post helpful? Yes | No

    Default Re: serial data ideas please

    The MCU is HW; so yes it could have an issue. That being said, there can also be an issue with the supporting HW (i.e. around the MCU itself).

    As for reading the silicon revision; look for DEVID1 on datasheet.
    PicKit can read it. From Readme File of PicKit2: NOTE: silicon revision display is enabled by adding the INI file value "REVS: Y".
    This link should also give you ideas on how to read it from the PIC itself:http://www.microchip.com/forums/m34318.aspx.

    You say you have code which only does the UART stuff and still has the issue. What does that code looks like? I presume it shouldn't have any of the fancy interrupt, LCD, or other stuff.
    Last edited by languer; - 2nd July 2012 at 07:56.

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts