Autor Tema: Mis experiencias con el BUS CAN  (Leído 890788 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado handpic

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 72
Re: Mis experiencias con el BUS CAN
« Respuesta #990 en: 28 de Julio de 2011, 21:51:47 »
ya estoy aquí de nuevo...

He intentado conectarme al bus Can del coche, directamente, sin OBD, ya que creo que hay una interface a otra ISO (según veo en el conector y la información que he encontrado)...

Me he ido a la centralita y he localizado el par trenzado que parece llevar el bus. Lo he medido con el polímetro y tenía 2,45V, lo que me ha hecho tener esperanzas de que fuera el bus realmente.

Me he conectado con la placa y el software, pero nada de nada.... se supone que tenía que ver las tramas del tráfico, pero no he visto nada.

Es posible que tenga la máscara o los ID bloqueados, pero eso ya lo repasaré en otro momento.....

Saludos a todos..... tanto a los que demuestran ser una estrella..... como a los que nos estrellamos....

Desconectado herr_emanuelb

  • PIC10
  • *
  • Mensajes: 10
Re: Mis experiencias con el BUS CAN
« Respuesta #991 en: 18 de Agosto de 2011, 11:01:47 »
Estoy desarollando un aparello para leer Datos para Camiones que tengan el bus CAN J1939.
El dispositivo está compuesto por un PIC18F2580, un Transceiver MCP2551 y un display LCD.

Alguién sabe me decir si es necesário definir un ID en mi aparello apenas para leer los datos?
Y cual es la resistencia más adecuada entre CANH e CANL del MCP2551 para esta aplicación?

En un primero momento, pienso en 120Ohms, pero he visto en algunos otros proyectos personas que utilizaban 60 Ohms.

Gracias,
Emanuel

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: Mis experiencias con el BUS CAN
« Respuesta #992 en: 18 de Agosto de 2011, 11:34:22 »
El aparato en este caso sera un Master, entiendo que no es necesario un ID.
La resistencia terminadora es de 120 Ohm.
Hay aplicaciones donde ponen una de 60 Ohm entre CANH y masa y otra de 60 Ohm entre CANL y masa, finalmente quedan 120 OHM entre CANH y CANL, esto hace que tengan bien definidos los niveles respecto a masa.

Comentanos mas respecto a tu desarrollo....
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado herr_emanuelb

  • PIC10
  • *
  • Mensajes: 10
Re: Mis experiencias con el BUS CAN
« Respuesta #993 en: 19 de Agosto de 2011, 10:15:20 »
MGLSOFT, gracias por su pronta respuesta.

Ayer yo puse el aparato para testar en un camión Volvo Fh440. En los primeros momentos nada apareció nel display.
Yo estaba intentando leer los datos del Cuentakilómetros y del tacómetro.

Entonces, yo hice algunas modificaciones en mi software, solo para leer que tipo de ID estaban llegando. Aun no llegaba nada.
El aparato solo empezó a recibir algo a partir del momento en que he cambiado el modo de operación del PIC para "LISTEN".

De todos modos aun no logré recibir los datos que deseaba. Los IDs del cuentakilómetros y del tacómetro deberian ser 0x00FEC1 y
0x00EEC1, pero otra vez cambiando a mi software me fué posible leer los IDs 0xE3C000, 0xE38000, 0xE38787, 0xE3C787, 0xE38000, 0xE3C7C0, 0xE387C0, 0xE38780, 0xE3C780, 0x00, 0x78.

Llego a la conclusión de que para operar nel modo normal en un camión, quizás yo tenga que definir un ID valido.
En segundo, si los IDs que yo tenia para cuentakilómetros y tacómetro son correctos  tal vez yo tenga que hacer uso de filtros para que el PIC no fique solo en  la recepción de datos inválidos.

Correcto?


Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: Mis experiencias con el BUS CAN
« Respuesta #994 en: 19 de Agosto de 2011, 10:35:28 »
El filtrado aun no lo habilitaria, hasta no obtener datos en cada ID que sean correctos y estes seguro que lo que recibes corresponde al dato que necesitas.
Una vez obtengas esto si puedes filtrar y hacer sets de filtrado, que iras cambiando acorde a los valores que necesites medi.

Interesante lo del modo Listen, siempre me pregunte que utilidad tendria, je..je.. :mrgreen: :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado herr_emanuelb

  • PIC10
  • *
  • Mensajes: 10
Re: Mis experiencias con el BUS CAN
« Respuesta #995 en: 19 de Agosto de 2011, 11:00:26 »
Entendi, pero también es posible que yo no los tenga recibido porque el PIC estaba demasiado ocupado recibiendo y tratando de IDs invalidos mientras los IDs validos pasaban sin tener la oportunidad de seren leídos.

De todos modos voy intentar procurar por algún representante de la Volvo y lo preguntaré si los datos de los camiones actuales realmente están de acuerdo con el FMS Standard.


Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: Mis experiencias con el BUS CAN
« Respuesta #996 en: 19 de Agosto de 2011, 11:12:04 »
Gracias por el aporte!!
Lo extraño es que en varios mensajes no se usan los primeros bytes del mensaje!!
Deben tener alguna razón...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado herr_emanuelb

  • PIC10
  • *
  • Mensajes: 10
Re: Mis experiencias con el BUS CAN
« Respuesta #997 en: 23 de Agosto de 2011, 11:59:09 »
He llegado a conclusión de que mi software no estaba preparado para recibir datos nel formato j1939. Ahora estoy intentando hacer un nuevo software basado en las librerías "j1939.c" y "j1939.h", descritas por el Application Note 930 de Microchip.
Pero yo no sé por que razón aun no logré hacer nada, ni siquiera el exemplo 1 del Application Note.

Alguién ya ha trabajado con estas librerías?
(Estoy usando el Compiler PCW)

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: Mis experiencias con el BUS CAN
« Respuesta #998 en: 23 de Agosto de 2011, 14:30:58 »
Puedes poner el código de tu programa ??
Según leí el código de Mchp de esa librería en apariencia no funciona bien.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado herr_emanuelb

  • PIC10
  • *
  • Mensajes: 10
Re: Mis experiencias con el BUS CAN
« Respuesta #999 en: 23 de Agosto de 2011, 15:04:39 »
A mí tambien no me pareció funcionar bien.


Voy a poner el código del primero Chip. Su objetivo es enviar una mensaje para otro pic apagar o encender un LED y tambíen encender o apagar su led de acuerdo con las mensajes recibidas.


Código: [Seleccionar]
/*
Example 1

This example shows a very simple J1939 implementation.  It uses polling
to check for a message to light an LED and to send a message if a
button is pressed.

Both Node 0 and Node 1 should be programmed with the same code, except
that OTHER_NODE should be defined as the other node’s J1939 Address.

Application Maestro should be run with the following options changed
from their default values (in addition to NAME, Address, and bit rate
values):

Interrupts or Polling - Polling
*/

#include <18f2580.h>
#include "j1939.h"

J1939_MESSAGE Msg;

// Define some arbitrary values.  They must agree with the other node's
// values.

#define OTHER_NODE      129
#define TURN_ON_LED      92   
#define TURN_OFF_LED   94   

void main( void )
{
   unsigned char   LastSwitch = 1;
   unsigned char   CurrentSwitch;

   TRISBbits.TRISB4 = 1;         // Switch pin
   TRISD = 0;                     // LED pins
   LATD = 0;                     // Turn off LED

   J1939_Initialization( TRUE );

   // Wait for address contention to time out
   while (J1939_Flags.WaitingForAddressClaimContention)
      J1939_Poll(5);

   // Now we know our address should be good, so start checking for
   // messages and switches.

   while (1)
   {
      CurrentSwitch = PORTBbits.RB4;
      if (LastSwitch != CurrentSwitch)
      {
         Msg.DataPage            = 0;
         Msg.Priority            = J1939_CONTROL_PRIORITY;
         Msg.DestinationAddress   = OTHER_NODE;
         Msg.DataLength            = 0;
         if (CurrentSwitch == 0)
            Msg.PDUFormat = TURN_ON_LED;
         else
            Msg.PDUFormat = TURN_OFF_LED;
          while (J1939_EnqueueMessage( &Msg ) != RC_SUCCESS)
            J1939_Poll(5);
         LastSwitch = CurrentSwitch;
      }

      while (RXQueueCount > 0)
      {
         J1939_DequeueMessage( &Msg );
         if (Msg.PDUFormat == TURN_ON_LED)
            LATDbits.LATD0 = 1;
         else if (Msg.PDUFormat == TURN_OFF_LED)
            LATDbits.LATD0 = 0;
      }

      // Since we don’t accept the Commanded Address message,
      // the value passed here doesn’t matter.
      J1939_Poll(20);
   }
}



Para el segundo chip el software si mantiene el mismo, cambiando solo el valor de "OTHER_NODE" o cual es definido para 128.
Las librerias estoy ponendo en attachment.

El arquivo j1939.def del segundo chip tiene el valor J1939_STARTING_ADDRESS cambiado para 129 .

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: Mis experiencias con el BUS CAN
« Respuesta #1000 en: 23 de Agosto de 2011, 16:29:41 »
Este código lo has probado usando otra placa en el bus??
Si lo has probado, Funciona ??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado herr_emanuelb

  • PIC10
  • *
  • Mensajes: 10
Re: Mis experiencias con el BUS CAN
« Respuesta #1001 en: 23 de Agosto de 2011, 17:37:56 »
Este código lo has probado usando otra placa en el bus??
Si lo has probado, Funciona ??

Sí, pero este es el codigo original de Microchip. Para poder compilar y grabar en mis PICs yo tuve que cambiar algunas cosas, como por ejemplo las puertas de los LEDS, y la creación de una librería para los registros del CAN Bus.

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: Mis experiencias con el BUS CAN
« Respuesta #1002 en: 23 de Agosto de 2011, 18:31:01 »
Puedes compartirla??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado herr_emanuelb

  • PIC10
  • *
  • Mensajes: 10
Re: Mis experiencias con el BUS CAN
« Respuesta #1003 en: 24 de Agosto de 2011, 09:56:06 »
Claro!

Aqui está:

Código: [Seleccionar]
/*********************************************************************/
/*********************************************************************/
/*
Example 1
This example shows a very simple J1939 implementation. It uses polling
to check for a message to light an LED and to send a message if a
button is pressed.
Both Node 0 and Node 1   should be programmed with the same code, except
that OTHER_NODE should be defined as the other node’s J1939 Address.
Application Maestro should be run with the following options changed
from their default values (in addition to NAME, Address, and bit rate
values):
Interrupts or Polling – Polling
*/

#include <18F2580.h>
#fuses HS,NOPROTECT,NOLVP,NOWDT,NOMCLR
#include "regs_2580.h"
#use delay(clock=20000000)
#include <display.h>
#include "j1939_128.def"  //esta el archivo donde el valor J1939_STARTING_ADDRESS está definido como 128
#include "j1939.c"
#include "j1939.h"


J1939_MESSAGE Msg;
// Define some arbitrary values. They must agree with the other node's
// values.
#define OTHER_NODE 129
#define TURN_ON_LED  92
#define TURN_OFF_LED 94
void main( void )
{
int1 LastSwitch = 1;
int1 CurrentSwitch;
 // Switch pin
TRISA = 0; // LED pins
PORTA = 0; // Turn off LED


J1939_Initialization( TRUE );
TRISB = TRISB | 0b00010000;

// Wait for address contention to time out
while (J1939_Flags.WaitingForAddressClaimContention)
J1939_Poll(5);

// Now we know our address should be good, so start checking for
// messages and switches.
while (TRUE)
{
    CurrentSwitch = RB4;
   if (LastSwitch != CurrentSwitch)
   {
   Msg.DataPage = 0;
   Msg.Priority = J1939_CONTROL_PRIORITY;
   Msg.DestinationAddress = OTHER_NODE;
   Msg.DataLength = 0;
   
      if (CurrentSwitch == 0){
      Msg.PDUFormat = TURN_ON_LED;
      RA0=0;
      }
      else{
      Msg.PDUFormat = TURN_OFF_LED;
      RA0=1;
      }
   while (J1939_EnqueueMessage( &Msg ) != RC_SUCCESS){
                                                      delay_ms(200); RA0=~RA0; delay_ms(200);    //esto he adicionado para verificar donde el software estaba parando.
                                                      }
   J1939_Poll(5);
   LastSwitch = CurrentSwitch;
 
   }
   while (RXQueueCount > 0)
   {
   J1939_DequeueMessage( &Msg );
      if (Msg.PDUFormat == TURN_ON_LED)
      RA0 = 1;
      else if (Msg.PDUFormat == TURN_OFF_LED)
      RA0 = 0;
   }
// Since we don’t accept the Commanded Address message,
// the value passed here doesn’t matter.
}
}

La librería "regs_2580" fué hecha por mí, este es su código:
Código: [Seleccionar]
#BYTE TRISA    = 0xF92
#BYTE TRISB    = 0xF93
#BYTE TRISC    = 0xF94

#BYTE PORTA    = 0xF80
   #BIT RA0    = PORTA.0
   #BIT RA1    = PORTA.1
   #BIT RA2    = PORTA.2
   #BIT RA3    = PORTA.3
   #BIT RA4    = PORTA.4
   #BIT RA5    = PORTA.5
   #BIT RA6    = PORTA.6
   #BIT RA7    = PORTA.7

#BYTE PORTB    = 0xF81
   #BIT RB0    = PORTB.0
   #BIT RB1    = PORTB.1
   #BIT RB2    = PORTB.2
   #BIT RB3    = PORTB.3
   #BIT RB4    = PORTB.4
   #BIT RB5    = PORTB.5
   #BIT RB6    = PORTB.6
   #BIT RB7    = PORTB.7

#BYTE PORTC    = 0xF82
   #BIT RC0    = PORTC.0
   #BIT RC1    = PORTC.1
   #BIT RC2    = PORTC.2
   #BIT RC3    = PORTC.3
   #BIT RC4    = PORTC.4
   #BIT RC5    = PORTC.5
   #BIT RC6    = PORTC.6
   #BIT RC7    = PORTC.7


#BYTE LATA    = 0xF89
   #BIT LA0    = LATA.0
   #BIT LA1    = LATA.1
   #BIT LA2    = LATA.2
   #BIT LA3    = LATA.3
   #BIT LA4    = LATA.4
   #BIT LA5    = LATA.5
   #BIT LA6    = LATA.6
   #BIT LA7    = LATA.7

#BYTE LATB    = 0xF8A
   #BIT LB0    = LATB.0
   #BIT LB1    = LATB.1
   #BIT LB2    = LATB.2
   #BIT LB3    = LATB.3
   #BIT LB4    = LATB.4
   #BIT LB5    = LATB.5
   #BIT LB6    = LATB.6
   #BIT LB7    = LATB.7

#BYTE LATC    = 0xF8B
   #BIT LC0     = LATC.0
   #BIT LC1     = LATC.1
   #BIT LC2     = LATC.2
   #BIT LC3     = LATC.3
   #BIT LC4     = LATC.4
   #BIT LC5     = LATC.5
   #BIT LC6     = LATC.6
   #BIT LC7     = LATC.7


struct{
   int1 RBPU;
   int1 INTEDG0;
   int1 ITEDG2;
   int1 VOIDINTC2;
   int1 TMR0IP;
   int1 VOIDINTC2B;
   int1 RBIP;
} INTCON2;
#BYTE INTCON2 = 0xFF1

#BYTE INTCON = 0xFF2
   #BIT RBIF      = INTCON.0
   #BIT INT0IF    = INTCON.1
   #BIT TMR0IF    = INTCON.2
   #BIT RBIE      = INTCON.3
   #BIT INT0IE    = INTCON.4
   #BIT TMR0IE    = INTCON.5
   #BIT PEIE      = INTCON.6
   #BIT GIE       = INTCON.7


#ifdef ECAN_IS_CAN_MODULE
struct {
   int1 FILHIT0;
   int1 JTOFF;
   int1 RXBODBEN;
   int1 RXRTRRO;
   int1 voidrxb0con;
   int1 RXM0;
   int1 RXM1;
   int1 RXFUL;   
} RXB0CONbits;
#else
struct {
   int1 FILHIT0;
   int1 FILHIT1;
   int1 FILHIT2;
   int1 FILHIT3;
   int1 FILHIT4;
   int1 RTRRO;
   int1 RXM1;
   int1 RXFUL;   
} RXB0CONbits;
#endif

#byte RXB0CONbits = 0xF60
#byte RXB0CON = 0xF60


struct{
      int1 IRXIE;
      int1 WAKIE;
      int1 ERRIE;
      int1 TXBnIE;
      int1 TXB1IE;
      int1 TXB0IE;
      int1 RXB1IE;
      int1 RXB0IE;
      } PIE3bits;

#byte CANSTAT = 0xF6E
#byte CANCON = 0xF6F
#byte RXF3EIDH = 0xF0E
#byte RXB0SIDH = 0xF61
#byte ECANCON = 0xF77
#byte PIE3bits = 0xFA3
#byte PIE3 = 0xFA3
#byte BSEL0 = 0xDF8
#byte RXM0SIDH = 0xF18
#byte RXM0SIDL = 0xF19
#byte RXM0EIDH = 0xF1A
#byte RXM0EIDL = 0xF1B
#byte RXM1SIDH = 0xF1C
#byte RXM1SIDL = 0xF1D
#byte RXM1EIDH = 0xF1E
#byte RXM1EIDL = 0xF1F
#byte RXF0SIDH = 0xF00
#byte RXF0SIDL = 0xF01
#byte RXF0EIDH = 0xF02
#byte RXF0EIDL = 0xF03
#byte RXF1SIDH = 0xF04
#byte RXF1SIDL = 0xF05
#byte RXF1EIDH = 0xF06
#byte RXF1EIDL = 0xF07
#byte RXF2SIDH = 0xF08
#byte RXF2SIDL = 0xF09
#byte RXF2EIDH = 0xF0A
#byte RXF2EIDL = 0xF0B
#byte RXF3SIDH = 0xF0C
#byte RXF3SIDL = 0xF0D
#byte RXF3EIDH = 0xF0E
#byte RXF3EIDL = 0xF0F
#byte MSEL0 = 0xDF0

#byte RXFBCON0 = 0xDE0
#byte RXFBCON1 = 0xDE1
#byte RXFBCON2 = 0xDE2
#byte RXFCON0 = 0xDD4
#byte RXFCON1 = 0xDD5

#byte BRGCON1 = 0xF70
#byte BRGCON2 = 0xF71
#byte BRGCON3 = 0xF72

#byte COMSTAT = 0xF74

Aun yo hice una modificación en la función void J1939_Poll
Código: [Seleccionar]
void J1939_Poll( unsigned long ElapsedTime )
{
   unsigned int   Temp;

   // Update the Contention Wait Time.  We have to do that before
   // we call J1939_ReceiveMessages in case the time gets reset back
   // to zero in that routine.

   ContentionWaitTime += ElapsedTime;

   #if J1939_POLL_ECAN == J1939_TRUE
      J1939_ReceiveMessages();
      J1939_TransmitMessages();
   #endif

   if (J1939_Flags.WaitingForAddressClaimContention &&
      (ContentionWaitTime >= 25000l)) //el valor original era de 250000l, lo cambié porque el compiler dijo que la variável ContentionWaitTime jamás tenería este valor
   {
      J1939_Flags.CannotClaimAddress = 0;
      J1939_Flags.WaitingForAddressClaimContention = 0;
      J1939_Address = CommandedAddress;

      // Set up filter to receive messages sent to this address.
      // If we're using interrupts, make sure that interrupts are disabled
      // around this section, since it will mess up what we're doing.
      #if J1939_POLL_ECAN == J1939_FALSE
         #if (J1939_PRIORITIZED_INT == J1939_FALSE) || (ECAN_RX_INTERRUPT_PRIORITY == 0x00) || (ECAN_TX_INTERRUPT_PRIORITY == 0x00)
            INTCONbits.GIEL = 0;
         #endif
         #if (ECAN_RX_INTERRUPT_PRIORITY != 0x00) || (ECAN_TX_INTERRUPT_PRIORITY != 0x00)
            INTCONbits.GIEH = 0;
         #endif
      #endif
      SetAddressFilter( J1939_Address );
      #if J1939_POLL_ECAN == J1939_FALSE
         #if (J1939_PRIORITIZED_INT == J1939_FALSE) || (ECAN_RX_INTERRUPT_PRIORITY == 0x00) || (ECAN_TX_INTERRUPT_PRIORITY == 0x00)
            INTCONbits.GIEL = 1;
         #endif
         #if (ECAN_RX_INTERRUPT_PRIORITY != 0x00) || (ECAN_TX_INTERRUPT_PRIORITY != 0x00)
            INTCONbits.GIEH = 1;
         #endif
      #endif
   }
}
En esta última función, cual es el significado del carácter "l" (ContentionWaitTime >= 25000l), en la línea que yo he cambiado?

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: Mis experiencias con el BUS CAN
« Respuesta #1004 en: 24 de Agosto de 2011, 11:04:19 »
Bueno, por donde empezar.... :( :(

Deberás saber que CCS no es ANSI C, por lo tanto es muy diferente a C18 y hay que tener en cuenta muchas cosas al intentar una "traducción" de código a CCS desde un ejemplo de C18.

Intentare ir por lo que creo es el primer error:

Si miras el código de la librería del PIC, veras esto:

Código: C
  1. //////// Standard Header file for the PIC18F2580 device ////////////////
  2. #device PIC18F2580
  3. #nolist
  4. //////// Program memory: 16384x16  Data RAM: 1536  Stack: 31
  5. //////// I/O: 24   Analog Pins: 11
  6. //////// Data EEPROM: 256
  7. //////// C Scratch area: 00   ID Location: 200000
  8. //////// Fuses: LP,XT,HS,RC,EC,EC_IO,H4,RC_IO,INTRC_IO,INTRC,NOFCMEN,FCMEN
  9. //////// Fuses: NOIESO,IESO,PUT,NOPUT,NOBROWNOUT,BROWNOUT_SW,BROWNOUT_NOSL
  10. //////// Fuses: BROWNOUT,BORV46,BORV43,BORV28,BORV21,NOWDT,WDT,WDT1,WDT2
  11. //////// Fuses: WDT4,WDT8,WDT16,WDT32,WDT64,WDT128,WDT256,WDT512,WDT1024
  12. //////// Fuses: WDT2048,WDT4096,WDT8192,WDT16384,WDT32768,NOPBADEN,PBADEN
  13. //////// Fuses: NOLPT1OSC,LPT1OSC,NOMCLR,MCLR,NOSTVREN,STVREN,NOLVP,LVP
  14. //////// Fuses: BBSIZ1K,BBSIZ2K,NOXINST,XINST,DEBUG,NODEBUG,PROTECT
  15. //////// Fuses: NOPROTECT,CPB,NOCPB,CPD,NOCPD,WRT,NOWRT,WRTC,NOWRTC,WRTB
  16. //////// Fuses: NOWRTB,WRTD,NOWRTD,EBTR,NOEBTR,EBTRB,NOEBTRB
  17. ////////
  18. ////////////////////////////////////////////////////////////////// I/O
  19. // Discrete I/O Functions: SET_TRIS_x(), OUTPUT_x(), INPUT_x(),
  20. //                         PORT_x_PULLUPS(), INPUT(),
  21. //                         OUTPUT_LOW(), OUTPUT_HIGH(),
  22. //                         OUTPUT_FLOAT(), OUTPUT_BIT()
  23. // Constants used to identify pins in the above are:
  24.  
  25. #define PIN_A0  31744
  26. #define PIN_A1  31745
  27. #define PIN_A2  31746
  28. #define PIN_A3  31747
  29. #define PIN_A4  31748
  30. #define PIN_A5  31749
  31. #define PIN_A6  31750
  32. #define PIN_A7  31751
  33.  
  34. #define PIN_B0  31752
  35. #define PIN_B1  31753
  36. #define PIN_B2  31754
  37. #define PIN_B3  31755
  38. #define PIN_B4  31756
  39. #define PIN_B5  31757
  40. #define PIN_B6  31758
  41. #define PIN_B7  31759
  42.  
  43. #define PIN_C0  31760
  44. #define PIN_C1  31761
  45. #define PIN_C2  31762
  46. #define PIN_C3  31763
  47. #define PIN_C4  31764
  48. #define PIN_C5  31765
  49. #define PIN_C6  31766
  50. #define PIN_C7  31767

Donde ya se definen los pines de los puertos, por lo tanto si vuelves a definirlos cometes un error.
El compilador tomara solo una de estas definiciones, yo usaría la nativa de CCS y luego "traduciría " cada una de las partes donde esos pines sean utilizados.


Si has usado las librerías de C18 tal como vienen, veras que carga las definiciones del PIC utilizado en cada una de ellas, por lo tanto volverás a equivocar al compilador.

Ejemplo:

Código: C
  1. * Company:         Microchip Technology, Inc.
  2.  *
  3.  *
  4.  * Constants that are used by the J1939 C Library.
  5.  *
  6.  * Version     Date        Description
  7.  * ----------------------------------------------------------------------
  8.  * v01.00.00   2004/06/04  Initial Release
  9.  *
  10.  * Copyright 2004 Kimberly Otten Software Consulting
  11.  *
  12.  * Author               Date        Comment
  13.  *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  14.  * Kim Otten            6/04/04     Original
  15.  * Caio Gubel           6/11/04     Formatted
  16.  ********************************************************************/
  17.  
  18. #include        <p18cxxx.h>          //   >>>>>>>>>>>>>>  nueva definicion !!!!
  19. #include        "j1939.def"
  20.  
  21. #ifndef __J1939_H
  22. #define __J1939_H
  23.  
  24.  
  25. typedef enum _BOOL { FALSE = 0, TRUE } BOOL;
  26.  
  27.  
  28. // Function Return Codes
  29.  
  30. #define RC_SUCCESS                      0
  31. #define RC_QUEUEEMPTY                   1
  32. #define RC_QUEUEFULL                    1
  33. #define RC_CANNOTRECEIVE                2
  34. #define RC_CANNOTTRANSMIT               2



El otro error es que definas los registros tris
Citar
TRISB = TRISB | 0b00010000;

Cuando no declaras en que modo vas a utilizar los puertos, CCS ofrece tres modos, solo uno de ellos (modo fast) obliga a modificar los registros tris y latc de los puertos, pero deberás hacerlo en cada llamada a un pin que utilices...


Hay mas errores pero en su mayoría son por estas cuestiones de interpretación de como usar ese código en CCS.

Consejo:
Compila los ejemplos en C18 y MPLAB y asegurate que funcionan primero.
Luego comienza la traduccion, lentamente y observando a cada paso que esta bien o mal y que aplica CCS en cada caso.

Respecto al valor 250000l   (es una L minúscula y no un 1) creo que indica un valor Long de 250000, y se refiere a ticks, que es la unidad de temporizacion del compilador C18.
Ya habrá algún especialista de C18 del Foro que nos aclare mejor este tema, si alguno lee este hilo...


Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.