NO puede transmitir datos de temperatura

1

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?

    
pregunta Ammar

3 respuestas

1

Este código no tiene ningún sentido:

    dt = 0;

    while(!dt);

        dt = CANRead(&id, b, &len, &Can_Rcv_Flags);

        if(id == 3)
        {
            temperature = b[0];

            ByteToStr(temperature,txt); // Convert to string

            Lcd_Out(1, 8, txt); // Output to LCD

            Delay_ms(1000); // Wait 1 second
        }
    }

Creo que eres engañado por tu propia indentación. El corchete final anterior pertenece al for(;;) , ya que el bucle while no tiene tirantes, solo tiene una instrucción vacía ; nula y no tiene cuerpo de bucle.

Así que las líneas dt = 0; while(!dt); son inútiles, porque dt siempre es cero en este punto.

Probablemente quisiste escribir

while(!dt)
{
  dt = CANRead(&id, b, &len, &Can_Rcv_Flags);
}

Esta sería la razón por la que siempre debe usar llaves después de cada declaración de control o bucle en su código, y nunca coloque los puntos y coma en la misma línea que uno. Los buenos compiladores advierten contra tales puntos y comas.

De lo contrario, si esto fue intencional a pesar de la extraña sangría y dt es una variable compartida con un ISR, su código sigue siendo incorrecto porque dt no se declaró como volatile y el compilador puede optimizarlo incorrectamente. Vea esto:

enlace

    
respondido por el Lundin
0
Implementé el circuito en dos placas de pruebas usando un bus CAN de pares trenzados.

Todavía tiene que unir los motivos de ambos microcontroladores. CAN tolera algunas variaciones de modo común de las líneas de bus, pero no pueden ser flotantes arbitrariamente. Dicho de otra manera, necesita conectar los dos nodos con tres cables, el par trenzado para las líneas CANH y CANL, y un cable a tierra.

    
respondido por el Olin Lathrop
0

Mi conjetura es que uno de estos mensajes no se recibe correctamente. El filtrado de mensajes aquí es importante: ha configurado el filtro de recepción para que los dos mensajes que está enviando sean de tipo extendido (ID de 29 bits). ¿Puede verificar que envía los mensajes como marcos extendidos y que los módulos CAN se inicializan con marcos extendidos habilitados? Su código no es completamente auto explicativo sobre esto.

Los mensajes estándar y extendidos en el bus CAN son completamente diferentes. Si envía un mensaje estándar con una identificación de 5 y ha configurado el filtro de recepción para recibir mensajes extendidos con una identificación de 5, no recibirá nada.

    
respondido por el olltsu

Lea otras preguntas en las etiquetas