I made my last post at 1:23am, it's now 5:11am and I've been up for 20 minutes getting ready for work. My math tells me that's about 3.5 hours or so.....
Yes, I see I forgot to attach my code. I knew I forgot something! I also attached the Microchip C code as well.
Code:
==============================================================================
' DEFINES & INCLUDES
'===============================================================================
INCLUDE "modedefs.bas"
'
DEFINE OSC 20
' ==============================================================================
' CONFIGS
'===============================================================================
@ __CONFIG _CONFIG1L, _PLLDIV_5_1L & _CPUDIV_OSC1_PLL2_1L & _USBDIV_2_1L
@ __CONFIG _CONFIG1H, _FOSC_HSPLL_HS_1H & _FCMEN_OFF_1H & _IESO_OFF_1H
@ __CONFIG _CONFIG2L, _PWRT_OFF_2L & _BOR_OFF_2L & _BORV_3_2L & _VREGEN_ON_2L
@ __CONFIG _CONFIG2H, _WDT_OFF_2H & _WDTPS_32768_2H
@ __CONFIG _CONFIG3H, _CCP2MX_ON_3H & _PBADEN_OFF_3H & _LPT1OSC_OFF_3H & _MCLRE_ON_3H
@ __CONFIG _CONFIG4L, _STVREN_ON_4L & _LVP_OFF_4L & _ICPRT_ON_4L & _XINST_OFF_4L
'==============================================================================
' SETTINGS
' ==============================================================================
'76543210 '76543210
TRISA = %00010110: PORTA = %00000000
TRISB = %00010001: PORTB = %00010000
TRISC = %00000000: PORTC = %00000001
TRISD = %00011100: PORTD = %00000000
TRISE = %00010000: PORTE = %00010111
ADCON0 = %00111100
ADCON1 = 15
ADRESH = %00000000
ADRESL = %00000000
CMCON = 7
SSPSTAT = %01100100
SSPCON1 = %00100001
BAUDCON = %00001111
'===============================================================================
' Register Mapping
'================================================================================
CANSTAT CON $0E
CANCTRL CON $0F
BFPCTRL CON $0C
TEC CON $1C
REC CON $1D
CNF3 CON $28
CNF2 CON $29
CNF1 CON $2A
CANINTE CON $2B
CANINTF CON $2C
EFLG CON $2D
TXRTSCTRL CON $0D
'' Recieve Filters ''
RXF0SIDH CON $00
RXF0SIDL CON $01
RXF0EID8 CON $02
RXF0EID0 CON $03
RXF1SIDH CON $04
RXF1SIDL CON $05
RXF1EID8 CON $06
RXF1EID0 CON $07
RXF2SIDH CON $08
RXF2SIDL CON $09
RXF2EID8 CON $0A
RXF2EID0 CON $0B
RXF3SIDH CON $10
RXF3SIDL CON $11
RXF3EID8 CON $12
RXF3EID0 CON $13
RXF4SIDH CON $14
RXF4SIDL CON $15
RXF4EID8 CON $16
RXF4EID0 CON $17
RXF5SIDH CON $18
RXF5SIDL CON $19
RXF5EID8 CON $1A
RXF5EID0 CON $1B
'' Receive Masks ''
RXM0SIDH CON $20
RXM0SIDL CON $21
RXM0EID8 CON $22
RXM0EID0 CON $23
RXM1SIDH CON $24
RXM1SIDL CON $25
RXM1EID8 CON $26
RXM1EID0 CON $27
'' Tx Buffer 0 ''
TXB0CTRL CON $30
TXB0SIDH CON $31
TXB0SIDL CON $32
TXB0EID8 CON $33
TXB0EID0 CON $34
TXB0DLC CON $35
TXB0D0 CON $36
TXB0D1 CON $37
TXB0D2 CON $38
TXB0D3 CON $39
TXB0D4 CON $3A
TXB0D5 CON $3B
TXB0D6 CON $3C
TXB0D7 CON $3D
'' Tx Buffer 1 ''
TXB1CTRL CON $40
TXB1SIDH CON $41
TXB1SIDL CON $42
TXB1EID8 CON $43
TXB1EID0 CON $44
TXB1DLC CON $45
TXB1D0 CON $46
TXB1D1 CON $47
TXB1D2 CON $48
TXB1D3 CON $49
TXB1D4 CON $4A
TXB1D5 CON $4B
TXB1D6 CON $4C
TXB1D7 CON $4D
'' Tx Buffer 2 ''
TXB2CTRL CON $50
TXB2SIDH CON $51
TXB2SIDL CON $52
TXB2EID8 CON $53
TXB2EID0 CON $54
TXB2DLC CON $55
TXB2D0 CON $56
TXB2D1 CON $57
TXB2D2 CON $58
TXB2D3 CON $59
TXB2D4 CON $5A
TXB2D5 CON $5B
TXB2D6 CON $5C
TXB2D7 CON $5D
'' Rx Buffer 0 ''
RXB0CTRL CON $60
RXB0SIDH CON $61
RXB0SIDL CON $62
RXB0EID8 CON $63
RXB0EID0 CON $64
RXB0DLC CON $65
RXB0D0 CON $66
RXB0D1 CON $67
RXB0D2 CON $68
RXB0D3 CON $69
RXB0D4 CON $6A
RXB0D5 CON $6B
RXB0D6 CON $6C
RXB0D7 CON $6D
'' Rx Buffer 1 ''
RXB1CTRL CON $70
RXB1SIDH CON $71
RXB1SIDL CON $72
RXB1EID8 CON $73
RXB1EID0 CON $74
RXB1DLC CON $75
RXB1D0 CON $76
RXB1D1 CON $77
RXB1D2 CON $78
RXB1D3 CON $79
RXB1D4 CON $7A
RXB1D5 CON $7B
RXB1D6 CON $7C
RXB1D7 CON $7D
'===============================================================================
' Register Bit Masks
'===============================================================================
DLC_0 CON $00
DLC_1 CON $01
DLC_2 CON $02
DLC_3 CON $03
DLC_4 CON $04
DLC_5 CON $05
DLC_6 CON $06
DLC_7 CON $07
DLC_8 CON $08
'===============================================================================
' ' CAN SPI commands
'===============================================================================
'
CAN_RST CON $C0
' CAN_READ $03
MCPWRT CON $02
' CAN_RTS $80
' CAN_RTS_TXB0 $81
' CAN_RTS_TXB1 $82
' CAN_RTS_TXB2 $84
' CAN_RD_STATUS $A0
' CAN_BIT_MODIFY $05
' CAN_RX_STATUS $B0
' CAN_RD_RX_BUFF $90
' CAN_LOAD_TX $40
'===============================================================================
' ALIAS & MODIFIERS
'==============================================================================
CS VAR PORTB.4 ' CS LINE
SCLK VAR PORTB.1 ' CLOCK LINE
SDI VAR PORTB.0 ' DATA INPUT LINE
SDO VAR PORTC.7 ' DATA OUTPUT LINE
SENDLED VAR PORTA.5 ' LED TO INDICATE THE PROGRAM IS IN THE SENDING ROUTINE
MAINLED VAR PORTE.2 ' LED TO INDICATE THE PROGRAM IS IN THE MAIN ROUTINE
INT VAR PORTB.5 ' INTERRUPT OUTPUT FROM 18F4550
MCPRST VAR PORTC.0 ' RESET LINE FOR MCP2515
SW_LOAD VAR PORTA.4 ' BUTTON CONNECTED TO 18F4550 TO START SENDING DATA (WHEN IMPLEMENTED)
RX_LED VAR PORTD.1 ' USB RECEIVE LED
TX_LED VAR PORTD.0 ' USB TRANSMIT LED
'===============================================================================
' SOFTWARE VARIABLES
'===============================================================================
DATAOUT VAR BYTE 'FIRST BYTE OF DATA TO BE SENT
MCPREG VAR BYTE 'ADDRESS OF FIRST BYTE OF DATA TO BE SENT
TX_LED=1
RX_LED=1
'==============================================================================
' RESET CAN
'==============================================================================
'==============================================================================
' RESET CAN
'==============================================================================
'==============================================================================
' INITIALIZE MCP2515
'==============================================================================
LOW CS
SSPBUF = MCPRST ' COMMAND TO RESET THE MCP2515
PIR1.3 = 0
WHILE PIR1.3=0 :WEND
HIGH CS
PAUSE 1000
LOW CS
SSPBUF = mcpwrt ' COMMAND TO WRITE TO THE MCP2515
PIR1.3 = 0
WHILE PIR1.3=0 :WEND
MCPREG = CANCTRL 'PUT THE MCP2515 INTO CONFIGURATON MODE
DATAOUT = $08
GOSUB SEND_CAN_DATA
SSPBUF = cnf3 ' CNF3 REGISTER
PIR1.3 = 0
WHILE PIR1.3=0 :WEND
SSPBUF = $07 ' PART OF BAUD RATE
PIR1.3 = 0
WHILE PIR1.3=0 :WEND
SSPBUF = $BA ' PART OF BAUD RATE
PIR1.3 = 0
WHILE PIR1.3=0 :WEND
SSPBUF = $03 ' PART OF BAUDRATE
PIR1.3 = 0
WHILE PIR1.3=0 :WEND
MCPREG = CANCTRL 'PUT THE MCP2515 BACK INTO NORMAL MODE
DATAOUT = $0
GOSUB SEND_CAN_DATA
high cs
'==============================================================================
' MAIN PROGRAM FOR MCP2515
'==============================================================================
START:
HIGH SENDLED
PAUSE 4000
LOW CS
SSPBUF = mcpwrt ' COMMAND TO WRITE TO THE MCP2515
PIR1.3 = 0
WHILE PIR1.3=0 :WEND
MCPREG = CANINTE ' DISABLE ALL INTERRUPTS
DATAOUT = %00000000
GOSUB SEND_CAN_DATA
high cs ' ON THE MICROCHIP EXAMPLE, THEY PULLED THE CS LINE LOW, SENT
' SOME DATA, THEN HIGH AND LOW AGAIN TO RESEND MORE DATA. I
' I STILL CAN'T FIGURE OUT WHY. IT'S PROBABLY SOMETHING
' SIMPLE I AM MISSING BUT I TRIED TO DUPLICATE IT.
LOW CS
SSPBUF = mcpwrt ' COMMAND TO WRITE TO THE MCP2515
PIR1.3 = 0
WHILE PIR1.3=0 :WEND
MCPREG = TXB0CTRL ' FLAG THE TRANSMIT BUFFER - - 11=HIGH, 10=MEDIUM, 01=LOW, 00=LOWEST
DATAOUT = %00001011
GOSUB SEND_CAN_DATA
MCPREG = TXB0SIDL ' TRANSMIT BUFFER 0 FOR SIDH
DATAOUT = %0000000
GOSUB SEND_CAN_DATA
MCPREG = TXB0SIDH ' TRANSMIT BUFFER 0 FOR SIDH
DATAOUT = %00001000
GOSUB SEND_CAN_DATA
MCPREG = TXB0DLC ' NUMBER OF BYTES TO BE TRANSMITTED IN CAN FRAME
DATAOUT = %00000001
GOSUB SEND_CAN_DATA
MCPREG = TXB0D0 ' DATA PACKET FOR BYTE 1
DATAOUT = %00000111
GOSUB SEND_CAN_DATA
'MCPREG = TXB0D1 'DATA PACKET FOR BYTE 2
'DATAOUT = %00001111
'GOSUB SEND_CAN_DATA
HIGH CS
LOW sendled
pause 4000
goto START
'===============================================================================
' SEND CAN DATA SECTION
'===============================================================================
SEND_CAN_DATA:
SSPBUF = MCPREG ' ADDRESS TO LOAD THE DATA TO THE MCP2515
PIR1.3 = 0
WHILE PIR1.3=0 : WEND
SSPBUF = DATAOUT 'DATA BEING LOADED TO THE MCP2515 ON MCPREG
PIR1.3 = 0
WHILE PIR1.3=0 : WEND
RETURN
Code:
/*********************************************************************
*
* Microchip USB C18 Firmware Version 1.0
*
*********************************************************************
* FileName: main.c
* Dependencies: See INCLUDES section below
* Processor: PIC18
* Compiler: C18 2.30.01+
* Company: Microchip Technology, Inc.
*
* Software License Agreement
*
* The software supplied herewith by Microchip Technology Incorporated
* (the “Company”) for its PICmicro® Microcontroller is intended and
* supplied to you, the Company’s customer, for use solely and
* exclusively on Microchip PICmicro Microcontroller products. The
* software is owned by the Company and/or its supplier, and is
* protected under applicable copyright laws. All rights are reserved.
* Any use in violation of the foregoing restrictions may subject the
* user to criminal sanctions under applicable laws, as well as to
* civil liability for the breach of the terms and conditions of this
* license.
*
* THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES,
* WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED
* TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
* PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT,
* IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR
* CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
*
* Author Date Comment
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Rawin Rojvanit 11/19/04 Original.
********************************************************************/
#pragma config PLLDIV = 5 // (20 MHz crystal on PICDEM FS USB board)
#pragma config CPUDIV = OSC1_PLL2
#pragma config USBDIV = 2 // Clock source from 96MHz PLL/2
#pragma config FOSC = HSPLL_HS
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config PWRT = OFF
#pragma config BOR = OFF
#pragma config BORV = 3
#pragma config VREGEN = ON //USB Voltage Regulator
#pragma config WDT = OFF
#pragma config WDTPS = 32768
#pragma config MCLRE = ON
#pragma config LPT1OSC = OFF
#pragma config PBADEN = OFF
#pragma config CCP2MX = ON
#pragma config STVREN = ON
#pragma config LVP = OFF
#pragma config ICPRT = ON // Dedicated In-Circuit Debug/Programming
#pragma config XINST = OFF // Extended Instruction Set
#pragma config CP0 = OFF
#pragma config CP1 = OFF
#pragma config CP2 = OFF
#pragma config CP3 = OFF
#pragma config CPB = OFF
#pragma config CPD = OFF
#pragma config WRT0 = OFF
#pragma config WRT1 = OFF
#pragma config WRT2 = OFF
#pragma config WRT3 = OFF
#pragma config WRTB = OFF // Boot Block Write Protection
#pragma config WRTC = OFF
#pragma config WRTD = OFF
#pragma config EBTR0 = OFF
#pragma config EBTR1 = OFF
#pragma config EBTR2 = OFF
#pragma config EBTR3 = OFF
#pragma config EBTRB = OFF
/** I N C L U D E S **********************************************************/
#include <p18cxxx.h>
#include "system\typedefs.h" // Required
#include "system\usb\usb.h" // Required
#include "io_cfg.h" // Required
#include "system\usb\usb_compile_time_validation.h" // Optional
#include "user\BusMon.h" // Modifiable
/** V A R I A B L E S ********************************************************/
#pragma udata
/** P R I V A T E P R O T O T Y P E S ***************************************/
static void InitializeSystem(void);
void USBTasks(void);
/** V E C T O R R E M A P P I N G *******************************************/
/*
extern void _startup (void); // See c018i.c in your C18 compiler dir
#pragma code _RESET_INTERRUPT_VECTOR = 0x002000
void _reset (void)
{
_asm goto _startup _endasm
}
*/
//#pragma code _HIGH_INTERRUPT_VECTOR = 0x002008
//void _high_ISR (void)
//{
// ;
//}
//
//#pragma code LOW_INTERRUPT_VECTOR = 0x002018
//void _low_ISR (void)
//{
// _asm
// goto InterruptHandler
// _endasm
//}
#pragma code
/******************************************************************************
* Function: void main(void)
*
* PreCondition: None
*
* Input: None
*
* Output: None
*
* Side Effects: None
*
* Overview: Main program entry point.
*
* Note: None
*****************************************************************************/
void main(void)
{
InitializeSystem();
UserInit(); // See BusMon.c & .h
while(1)
{
if(usb_power_check) //Only do USB USB if not powered by CAN connector
USBTasks(); // USB Tasks
// INTCONbits.GIE = 1;
ProcessIO(); // See user\BusMon.c & .h
}
}//end main
/******************************************************************************
* Function: static void InitializeSystem(void)
*
* PreCondition: None
*
* Input: None
*
* Output: None
*
* Side Effects: None
*
* Overview: InitializeSystem is a centralize initialization routine.
* All required USB initialization routines are called from
* here.
*
* User application initialization routine should also be
* called from here.
*
* Note: None
*****************************************************************************/
static void InitializeSystem(void)
{
ADCON1 |= 0x0F; // Default all pins to digital
#if defined(USE_USB_BUS_SENSE_IO)
tris_usb_bus_sense = INPUT_PIN; // See io_cfg.h
#endif
#if defined(USE_SELF_POWER_SENSE_IO)
tris_self_power = INPUT_PIN;
#endif
if(usb_power_check) //Only initialize USB if not powered by CAN connector
mInitializeUSBDriver(); // See usbdrv.h
}//end InitializeSystem
/******************************************************************************
* Function: void USBTasks(void)
*
* PreCondition: InitializeSystem has been called.
*
* Input: None
*
* Output: None
*
* Side Effects: None
*
* Overview: Service loop for USB tasks.
*
* Note: None
*****************************************************************************/
void USBTasks(void)
{
/*
* Servicing Hardware
*/
USBCheckBusStatus(); // Must use polling method
if(UCFGbits.UTEYE!=1)
USBDriverService(); // Interrupt or polling method
}// end USBTasks
////*****************************************************************************
//// High priority interrupt vector
//#pragma code InterruptVectorHigh = 0x08
//void InterruptVectorHigh(void)
//{
//_asm
//bra InterruptHandler // jump to interrupt routine
//_endasm
//}
//#pragma code InterruptVectorHigh = 0x08
//void InterruptVectorLow(void)
//{
//_asm
//bra InterruptHandler // jump to interrupt routine
//_endasm
//}
//
//
//#pragma code
//#pragma interrupt InterruptHandler
//void InterruptHandler(void)
//{
//}
/** EOF main.c ***************************************************************/
Bookmarks