| 
	
	|  |  |  
	
		| View previous topic :: View next topic |  
		| Author | Message |  
		| Joan 
 
 
 Joined: 29 May 2004
 Posts: 41
 Location: Barcelona, Spain
 
 
			          
 
 | 
			
				| 18F4580 + 82C251 Simple CANBus Program not working |  
				|  Posted: Thu Sep 17, 2009 4:26 am |   |  
				| 
 |  
				| Hia all; 
 I've wrote this program (XTAL = 4MHz, CAN Baudrate= 125k). It seems to be a CAN config register  mistake but I can't find it. I used "Microchip Bit Time Calculator" to find register values.
 
 Any idea?
 
  	  | Code: |  	  | /************************************************************/ /*               P R E P R O C E S S O R                    */
 /************************************************************/
 
 #include <18F4580.h>
 
 /************************************************************/
 /*                         A D C                            */
 /************************************************************/
 
 #device ADC=10
 
 /************************************************************/
 /*                      F U S E S                           */
 /************************************************************/
 
 #fuses XT, NOPROTECT, PUT, BROWNOUT, NOWDT, NOLVP
 
 /************************************************************/
 /*           O S C I L A T O R   &   D E L A Y              */
 /************************************************************/
 
 #use delay(clock=4000000)
 
 /************************************************************/
 /*                S E T U P   R S - 2 3 2                   */
 /************************************************************/
 
 #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
 
 /************************************************************/
 /*                  S E T U P   I 2 C                       */
 /************************************************************/
 
 // NONE
 
 /************************************************************/
 /*                   D E F I N I T I O N S                  */
 /************************************************************/
 
 // -----------------------------------------------------------------------------
 // CAN-Interface
 // -----------------------------------------------------------------------------
 
 #define CAN_TX_ID                  0x301
 
 #define CAN_BRG_PRESCALAR          0 // with Fosc=4MHz, #TQ per bit interval=500ns
 // -> Nominal Bit Rate=125kHz
 #define CAN_BRG_SYNCH_JUMP_WIDTH   1
 #define CAN_BRG_PROPAGATION_TIME   1
 #define CAN_BRG_PHASE_SEGMENT_1    8
 #define CAN_BRG_PHASE_SEGMENT_2    6
 //-----
 //  16 = number of TQ per bit interval
 #define CAN_BRG_SEG_2_PHASE_TS TRUE    // phase segment 2 time select bit
 // (def: freely programmable)
 
 /************************************************************/
 /*                     I N C L U D E S                      */
 /************************************************************/
 
 #include <can-18xxx8.c>
 
 /************************************************************/
 /*           G L O B A L   V A R I A B L E S                */
 /************************************************************/
 
 int8 rx_len;
 int8 buffer[8];
 
 char data;
 char MODE;
 
 enum state {RX=0,TX=1};
 
 /************************************************************/
 /*                 F U N C T I O N S                        */
 /************************************************************/
 
 void setup_PWM(void)
 {
 setup_timer_3(T3_INTERNAL|T3_DIV_BY_4);
 setup_ccp1 (CCP_PWM);
 setup_timer_2(T2_DIV_BY_4, 250, 1);
 }
 
 void setup_INT(void)
 {
 ext_int_edge(0,L_TO_H);
 clear_interrupt(INT_EXT);
 enable_interrupts (int_ext);
 enable_interrupts (global);
 }
 
 void init_vars (void)
 {
 rx_len = 8;
 data=48;
 }
 
 void write_CAN (void)
 {
 buffer[0] =data;
 buffer[1] =data;
 buffer[2] =data;
 buffer[3] =data;
 buffer[4] =data;
 buffer[5] =data;
 buffer[6] =data;
 buffer[7] =data;
 
 can_putd(CAN_TX_ID, buffer, rx_len, 1, 1, 0);
 putc(buffer[0]);
 
 set_pwm1_duty(200);
 delay_ms (50);
 set_pwm1_duty(0);
 delay_ms (450);
 
 buffer[0] = 0;   // Clear the buffer byte
 
 if (data==57)
 {
 data=48;
 }
 else
 {
 data++;
 }
 }
 
 /******************************************************************/
 /*             I N T E R R U P T   V E C T O R S                  */
 /******************************************************************/
 
 #int_ext
 void ext_isr()
 {
 clear_interrupt(INT_EXT);
 }
 
 /******************************************************************/
 /*                      M A I N   P R O G R A M                   */
 /******************************************************************/
 
 void main()
 {
 
 setup_PWM();
 setup_INT();
 
 output_high (PIN_B0);
 output_high (PIN_B1);
 port_b_pullups (TRUE);
 
 MODE=TX;
 
 can_init();
 init_vars();
 
 while (TRUE)
 {
 write_CAN();
 output_toggle (PIN_B1);
 }
 }
 | 
 
 Thanks in advance,
 
 Joan
 |  |  
		|  |  
		| PCM programmer 
 
 
 Joined: 06 Sep 2003
 Posts: 21708
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu Sep 17, 2009 12:28 pm |   |  
				| 
 |  
				| Your program is not a simple test program.  It has tons of stuff in it that is not needed to test the CAN bus function.     You should re-write it
 and cut out about 90% of your existing code.
 
 Test the new program, verify that it still fails, and post it.
 Post your compiler version.
 Also, tell you are testing for the failure.  How do you know it's failing ?
 
 
  	  | Quote: |  	  | #include <18F4580.h> #include <can-18xxx8.c>
 | 
 CCS has a CAN bus driver for the 18F4580:
 
  	  | Quote: |  	  | c:\program files\picc\drivers\can-18f4580.c | 
 
 
 One more thing.  The block diagram of the PCA82C251 CAN bus
 transceiver chip does not show an internal pull-up resistor on the
 TXD input.  If not, you may have the problem discussed in this thread:
 http://www.ccsinfo.com/forum/viewtopic.php?t=23825
 The solution is to add this #define statement above the #include for
 the CAN bus driver:
 
  	  | Code: |  	  | #define CAN_ENABLE_DRIVE_HIGH  1 #include <can-18F4580.c>
 | 
 |  |  
		|  |  
		|  |  
  
	| 
 
 | You cannot post new topics in this forum You cannot reply to topics in this forum
 You cannot edit your posts in this forum
 You cannot delete your posts in this forum
 You cannot vote in polls in this forum
 
 |  
 Powered by phpBB © 2001, 2005 phpBB Group
 
 |