Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Potrzebna pomoc przy programie do wagi elektrycznej

KoLi86 30 Wrz 2009 16:57 1275 0
  • #1
    KoLi86
    Poziom 9  
    Mam problem z programem do wagi. Nie jestem dobry w programowaniu a chce z podanego poniżej programu na PSoC przerobić (o ile to możliwe na AtMege8 zestaw ZL2avr). Chodzi mi o prosty program ważenia z wykorzystaniem adc AtMegi bo sygnal wejdzie z wzmacniacza pomiarowego.:

    Cytat:

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

    #include <m8c.h> // part specific constants and macros
    #include <stdio.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)
    {
    }
    };

    Porty na mikroprocesorze to P0 i P1
    Napięcie od 0 do 5V

    Bardzo prosze o pomoc i z góry dziękuje