He estado trabajando en un proyecto de bus CAN. Es un proyecto del libro Proyectos de microcontrolador avanzado de Dogan. Es un sensor de temperatura CAN bus de proyecto. Como saben, el proyecto no se puede simular porque MCP2551 no está disponible en Proteus, así que Lo implementé en el hardware '' según el esquema del libro.
ImplementéelcircuitoendosplacasdepruebasusandounbusCANdeparestrenzados.UtilicéPIC18F458consumóduloCANincorporado.Lalongituddelautobúsesinferiora500cm.Cuandoloprobé,solomostrabaelmensajedebienvenidaenlapantallaLCD.Probéelcódigoparalatransmisióndecaracteres.Funcionóperoparalatemperaturanomuestradatos.
Aquíestáelcódigodelnodocolector.
//unsignedcharCan_Init_Flags,Can_Send_Flags,dt,len,Can_Rcv_Flags;unsignedshortinit_flag,send_flag,len,read_flag;volatileintdt;charSJW,BRP,Phase_Seg1,Phase_Seg2,Prop_Seg,txt[4];longid,mask;intbitvalue;floatvout,temperature;intflag;#definedportb.b0voidadc_setting(){adcon0=0x00;adcon1=0x80;intcon=0xc0;pie1.adie=1;pir1.adif=0;}voidinterrupt(){if(pir1.adif){pir1.adif=0;adcon0.adon=0;flag=1;adcon0.adon=1;adcon0.go_done=1;}}voidmain(){//Portc=0x08;TRISA=0xFF;//PORTAareinputs//TRISB=0x08;//RB2isoutput,RB3isinput////ConfigureA/Dconverter////ADC_Init();adc_setting();adcon0.adon=1;adcon0.go_done=1;//ADCON1=0x80;////CANBUSTimingParameters//SJW=1;BRP=1;Phase_Seg1=6;Phase_Seg2=7;BRP=1;Prop_Seg=6;init_flag=_CAN_CONFIG_SAMPLE_THRICE&_CAN_CONFIG_PHSEG2_PRG_ON&_CAN_CONFIG_STD_MSG&_CAN_CONFIG_DBL_BUFFER_ON&_CAN_CONFIG_VALID_XTD_MSG&_CAN_CONFIG_LINE_FILTER_OFF;send_flag=_CAN_TX_PRIORITY_0&_CAN_TX_XTD_FRAME&_CAN_TX_NO_RTR_FRAME;read_flag=0;////InitialiseCANmodule//CANInitialize(SJW,BRP,Phase_Seg1,Phase_Seg2,Prop_Seg,init_flag);////SetCANCONFIGmode//CANSetOperationMode(_CAN_MODE_CONFIG,0xFF);mask=-1;////SetallMASK1bitsto1's//CANSetMask(_CAN_MASK_B1,mask,_CAN_CONFIG_XTD_MSG);////SetallMASK2bitsto1's//CANSetMask(_CAN_MASK_B2,mask,_CAN_CONFIG_XTD_MSG);////SetidoffilterB1_F1to500//CANSetFilter(_CAN_FILTER_B1_F1,500,_CAN_CONFIG_XTD_MSG);////SetCANmoduletoNORMALmode//CANSetOperationMode(_CAN_MODE_NORMAL,0xFF);//Programloop.Readthetemperaturefromanalogtemperaturesensorwhile(1)//Endlessloop{////Waituntilarequestisreceived//dt=0;while(!dt)dt=CANRead(&id,i,&len,read_flag);if(id==500&&i[0]=='T'){if(flag==1){bitvalue=(adresh<<8)+adresl;vout=bitvalue*0.00488;temperature=vout/0.0100;i[0]=temperature;id=3;//IdentifierCANWrite(id,i,1,send_flag);//sendtemperature}}}}
Yaquíestáelcódigodelnododevisualización
floattemperature;unsignedchari[8];unsignedshortinit_flag,send_flag,dt,len,read_flag;charSJW,BRP,Phase_Seg1,Phase_Seg2,Prop_Seg,txt[4];longid,mask;sbitLCD_RSatRC4_bit;sbitLCD_ENatRC5_bit;sbitLCD_D4atRC0_bit;sbitLCD_D5atRC1_bit;sbitLCD_D6atRC2_bit;sbitLCD_D7atRC3_bit;sbitLCD_RS_DirectionatTRISC4_bit;sbitLCD_EN_DirectionatTRISC5_bit;sbitLCD_D4_DirectionatTRISC0_bit;sbitLCD_D5_DirectionatTRISC1_bit;sbitLCD_D6_DirectionatTRISC2_bit;sbitLCD_D7_DirectionatTRISC3_bit;//EndLCDmoduleconnectionsvoidmain(){TRISC=0;//PORTCareoutputs(LCD)//TRISB=0x08;//RB2isoutput,RB3isinput////CANBUSParametersSJW=1;BRP=1;Phase_Seg1=6;Phase_Seg2=7;Prop_Seg=6;Init_Flags=_CAN_CONFIG_SAMPLE_THRICE&_CAN_CONFIG_PHSEG2_PRG_ON&_CAN_CONFIG_STD_MSG&_CAN_CONFIG_DBL_BUFFER_ON&_CAN_CONFIG_VALID_XTD_MSG&_CAN_CONFIG_LINE_FILTER_OFF;Send_Flags=_CAN_TX_PRIORITY_0&_CAN_TX_XTD_FRAME&_CAN_TX_NO_RTR_FRAME;Can_Rcv_Flags=0;//////InitializeCANmodule////CANInitialize(SJW,BRP,Phase_Seg1,Phase_Seg2,Prop_Seg,init_flag);//SetCANCONFIGmode//CANSetOperationMode(_CAN_MODE_CONFIG,0xFF);mask=-1;//SetallMASK1bitsto1'sCANSetMask(_CAN_MASK_B1,mask,_CAN_CONFIG_XTD_MSG);//SetallMASK2bitsto1's//CANSetMask(_CAN_MASK_B2,mask,_CAN_CONFIG_XTD_MSG);////SetidoffilterB2_F3to3//CANSetFilter(_CAN_FILTER_B2_F3,3,_CAN_CONFIG_XTD_MSG);////SetCANmoduletoNORMALmode//CANSetOperationMode(_CAN_MODE_NORMAL,0xFF);//ConfigureLCDLcd_init();//LCDisconnectedtoPORTCLcd_Out(1,1,"CAN BUS"); // Display heading on LCD
Delay_ms(1000); // Wait for 2 seconds
//
// Program loop. Read the temperature from Node:COLLECTOR and display
// on the LCD continuously
//
while(1) // Endless loop
{
Lcd_Out(1,1,"Temp = "); // Display "Temp = "
//
// Send a message to Node:COLLECTOR and ask for data
//
i[0] = 'T'; // Data to be sent
id = 500; // Identifier
CANWrite(id, i, 1, send_flag); // Send 'T'
//
// Get temperature from node:COLLECT
//
dt = 0;
while(!dt)
dt = CANRead(&id, i, &len, &read_flag);
if(id == 3)
{
temperature = i[0];
ByteToStr(temperature,txt); // Convert to string
Lcd_Out(1, 8, txt); // Output to LCD
Delay_ms(1000); // Wait 1 second
}
}
}
La temperatura no se muestra en absoluto. Intenté cambiar el código varias veces, pero el problema sigue siendo el mismo. Revisé el pin tx del nodo del colector en un osciloscopio digital. No mostró nada. No está transmitiendo ningún dato. ¿Por qué no está transmitiendo ningún dato?
¿Hay algún problema con mi código? ¿Debo eliminar la condición de solicitud en el nodo de transmisión y simplemente escribir datos en el segundo nodo y deshabilitar el filtro?