eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaWinAVR - Pytanie do znawcow C › Re: WinAVR - Pytanie do znawcow C
  • Path: news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!not
    -for-mail
    From: MrWebsky <m...@p...onet.pl>
    Newsgroups: pl.misc.elektronika
    Subject: Re: WinAVR - Pytanie do znawcow C
    Date: Wed, 19 May 2010 01:53:22 +0200
    Organization: http://onet.pl
    Lines: 126
    Message-ID: <4...@p...onet.pl>
    References: <hsk7u8$a77$1@news.onet.pl>
    NNTP-Posting-Host: aajz193.neoplus.adsl.tpnet.pl
    Mime-Version: 1.0
    Content-Type: text/plain; charset=iso-8859-2
    Content-Transfer-Encoding: 8bit
    X-Trace: news.onet.pl 1274226790 24531 83.5.3.193 (18 May 2010 23:53:10 GMT)
    X-Complaints-To: n...@o...pl
    NNTP-Posting-Date: Tue, 18 May 2010 23:53:10 +0000 (UTC)
    X-Mailer: Mozilla 4.8 [en] (Windows NT 5.0; U)
    X-Accept-Language: en
    Xref: news-archive.icm.edu.pl pl.misc.elektronika:588762
    [ ukryj nagłówki ]

    Szczerze mówiąc to napisanie czegoś takiego "main(1)" powinno
    zostać oprotestowane prez kompilator bo składnia main w C jest taka
    int main(int arg,char* argv[])
    niemniej kompilatory są na ogół wyrozumiałe.

    Natomiast

    while(1);
    {
    }

    to już ewidentny błąd. Dla kompilatora taki zapis oznacza, że
    program ma stać w pustej pętli i nie robić nic a instrukcje z bloku
    otoczonego klamrami w ogóle nie zostaną wykonane. Kompilator
    może wtedy potraktować strukturę s_pid jak nieużywaną i usunać ją.

    Zapis powinien wyglądać tak:

    while(1) // Bez średnika!!!
    {
    }

    Wtedy procesor ma wykonywac w kółko instrukcje zawarte w bloku.

    Jeśli miałbym się tutaj jeszcze czego przyczepić, to nie wiem jak kompilator
    reaguje na wyznaczanie adresu struktury w locie operatorem &
    Załóż dodatkową zmienną wskaźnikową typu struct s_pid*
    zainicjalizują ją adresem struktury pid i podaj do funkcji zamiast &pid.
    Możliwe, że coś źle działa operator & i podstawia do funkcji zły adres
    structury powodując przekłamania.

    A tak w ogóle jaki to proc i kompilator?

    roxy wrote:

    > Mam pytanie dlaczego zmienna Ki oraz Kp (s->Ki oraz s->Kp) wchodzaca w
    > sklad struktury s_pid przyjmuje losowe warosci wewnatrz funkcji
    > RegulatorNextStep;
    > Przedstawiam ponizej zawartosc plikow zrodlowych
    >
    > Dodam tylko ze problem rozwiazalem ale nie moge sobie wytlumaczyc tak
    > dziwnego zachowania kompilatora. Rozwiazanie problemu polegalo na
    > przeniesieniu tworzenia struktury (struct s_pid pid;) z wnetrza funkcji
    > main() na zewnatrz jej (globalna).
    >
    > ********
    > plik main.c
    > ********
    >
    > #include "pid.h"
    > ...
    > main(1);
    > {
    > ...
    > struct s_pid pid; // jezeli przeniose to strukture na
    > zewnatrz funkcji main
    > // to program wykonuje sie
    > prawidlowo
    > ...
    > InitReg(&pid,40,1,0);
    > ...
    > while(1);
    > {
    > ...
    > err=RegulatorNextStep(&pid,i_set,current);
    > ...
    > }// end while
    > }// end main
    >
    > ***************************
    > plik pid.h
    > ***************************
    > #ifndef _PID_H_
    > #define _PID_H_
    >
    > struct s_pid
    > {
    > signed int Kp;
    > signed int Ki;
    > signed int Kd;
    > signed long sigma;
    > signed int delta;
    > };
    >
    > void InitReg(struct s_pid *s, signed int Kp, signed int Ki, signed int Kd);
    > signed int RegulatorNextStep(struct s_pid *s,signed int set,signed int mes);
    > void RegulatorReset(struct s_pid *s);
    >
    > #endif
    >
    > *****************************
    > plik pid.c
    > **************************
    > #include "pid_flt.h"
    > ...
    > signed int RegulatorNextStep(struct s_pid *s,signed int set_value,signed int
    > measure_value)
    > {
    > ...
    >
    > p_term=(s->Kp) * error;
    > i_term= (s->Ki * s->sigma)/8;
    > ...
    > lcd(s->Kp); // !!!!!! dla czego mam losowe wartosci???
    > lcd(s->Ki);
    > ...
    > return (signed int)out;
    > }
    >
    > void InitReg(struct s_pid *s, signed int Kp, signed int Ki, signed int Kd)
    > {
    > s->Kp=Kp;
    > s->Ki=Ki;
    > s->Kd=Kd;
    > s->sigma=0;
    > s->delta=0;
    > }
    >
    > ****************************************************
    **************************
    >
    > __________ Informacja programu ESET NOD32 Antivirus, wersja bazy sygnatur wirusow
    5103 (20100510) __________
    >
    > Wiadomosc zostala sprawdzona przez program ESET NOD32 Antivirus.
    >
    > http://www.eset.pl lub http://www.eset.com

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: