logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Program do Wagi Elektronicznej

KoLi86 27 Wrz 2009 12:35 2351 2
  • #1 7062800
    KoLi86
    Poziom 10  
    Mam problemik z napisaniem programu do wagi, na początku myślałem ze to będzie proste jednak.. Mam programik z EP i chciałem go przerobić ale niezbyt mi to idzie.. Może ktoś mógłby mi nieco pomóc.. Waga zbudowana została na czujniku KM200 50N, Wzmacniaczu pomiarowym firmy "Spice" AT5210N oraz mikroprocesorze w układzie ZL2 avr.. oto programik który mam z EP :
    Cytat:

    //----------------------------------------------------------------------------
    // C main line
    //----------------------------------------------------------------------------

    #include <m8c.h> // part specific constants and macros
    #include "PSoCAPI.h" // PSoC API definitions for all User Modules

    int pom_tens(void);
    void pom_wag(void);

    int adc_tens,offset,offset_wag,waga; //zmienna odczyta wartosci z tensometru
    char wyn[7]; //zmienna wyniku
    int adc_temp[5];
    float tmp_wag;
    char i,j,lbuf;
    long buf;
    int temp_buf[20];

    void main()
    {
    lbuf=0;
    M8C_EnableGInt;
    AMUX_Start() ;
    LCD_Start();
    LCD_Position(0,0);
    LCD_PrCString(" ");
    LCD_Position(0,0);
    LCD_PrCString("Waga");
    LCD_Position(1,0);
    LCD_PrCString(" ");
    LCD_Position(1,0);
    LCD_PrCString("Kalibracja");

    INSAMP_Start(INSAMP_HIGHPOWER);
    delay();
    delay();
    delay();
    delay();
    delay();

    ADC_DelSig_Start( ADC_DelSig_HIGHPOWER );
    delay();
    delay();
    delay();
    delay();
    delay();
    delay();

    ADC_DelSig_StartAD();
    delay();
    for (j=0;j<20;j++) adc_tens=pom_tens();

    offset=adc_tens;
    AMUX_InputSelect(AMUX_PORT0_2);
    delay();
    delay();
    delay();
    delay();
    delay();
    delay();

    for (j=0;j<20;j++)
    {
    pom_wag();
    delay();
    }

    offset_wag=adc_tens;
    LCD_Position(0,0);
    LCD_PrCString(" ");
    LCD_Position(1,0);
    LCD_PrCString(" ");
    LCD_InitBG(LCD_SOLID_BG );

    while (1)
    {
    pom_wag();
    waga=adc_tens-offset_wag;
    if ((waga<10) || (waga<-10)) waga=0;
    LCD_DrawBG(1, 0, 16, (waga/50));
    LCD_Position(0,0);
    LCD_PrCString("Waga: ");
    LCD_Position(0,6);
    LCD_PrCString(" ");
    if (waga>=1000)
    {
    LCD_Position(0,6);
    itoa(wyn,(waga/1000),10);
    LCD_PrString(wyn);
    waga=waga%1000;
    }
    itoa(wyn,waga,10);
    if (waga<100)
    {
    LCD_Position(0,7);
    LCD_PrCString("0.");
    LCD_PrString(wyn);
    if (waga<10) LCD_PrCString("0");
    LCD_PrCString(" kg");
    }
    else
    {
    LCD_Position(0,7);
    LCD_PrString(wyn);
    LCD_Position(0,8 );
    LCD_PrString(wyn);
    LCD_PrCString(" kg");
    LCD_Position(0,8 );
    LCD_PrCString(".");
    }
    delay();
    }
    }

    void pom_wag(void)
    {
    adc_tens=pom_tens();
    adc_tens=adc_tens-offset;
    //tmp_wag=adc_tens*0.0001587;
    tmp_wag=adc_tens*0.0003052;
    tmp_wag=tmp_wag/72;
    tmp_wag=(tmp_wag/(0.002*4.98 ))*30;
    tmp_wag=tmp_wag*100;
    adc_tens=(int)tmp_wag;
    }

    int pom_tens(void)
    {
    int pom_tens;

    while (1)
    {
    if ( ADC_DelSig_fIsDataAvailable() )
    {
    temp_buf[lbuf]=ADC_DelSig_iGetDataClearFlag();
    lbuf++;
    if (lbuf==20) lbuf=0;
    buf=0;
    for (i=0;i<20;i++) buf=buf+temp_buf[i];
    pom_tens=(int)(buf/20);
    return pom_tens;
    }
    }
    }

    void delay() //procedura opoznienia
    {
    unsigned int l, i;
    for (i=0; i<15000;i++)
    {
    for(l=0;l++;l=65000)
    {
    asm("nop");
    asm("nop"); //pusty asemblerowy rozkaz
    asm("nop");
    asm("nop");
    asm("nop");
    asm("nop");
    asm("nop");
    asm("nop");
    asm("nop");
    asm("nop");
    asm("nop");
    asm("nop");
    }
    }
    };


    Chcailem napisać zwykły i prosty program do wagi. Jeśli ktoś mógłby mi pomóc to byłbym bardzo wdzięczny
  • #2 7063797
    tmf
    VIP Zasłużony dla elektroda
    A dokladnie co ci nie dziala?
    W tym programie masz sporo rzeczy do poprawienia, nie includuj headera specyficznego dla M8 tylko ogolny, ktory sobie sam zainkluduje wlasciwy - stdio.h. Zamiast wlasnych opoznien skorzystaj z delay.h - pisanie asm("nop") nie zadziala, jesli juz to musialbys dodac volatile, inaczej kompilator to wywali. Linkujesz z libm - bo jak widze uzywasz typow float ?
    Reszta jak napiszesz w czym konkretnie jest problem.
  • #3 7063982
    KoLi86
    Poziom 10  
    Programik jest napisany pod mikroprocesor PSoC, i nie wiem czy to odpali na AtMega8. A chce tylko z tego "wyciąć" cześć samego ważenia. Bo chce aby programik był prosty
REKLAMA