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

[Atmega8][Bascom] Sterownik pieca z podajnikiem szufladowym

30 Paź 2010 22:39 5561 11
  • Poziom 9  
    Witam Was,

    Pół roku temu zacząłem swoją przygodę z mikrokontrolerami, i teraz przede mną stanął tytułowy projekt.

    Wszystko ładnie pięknie działa w teorii... W praktyce jednak jest pewien problem.

    Po ok 2 godz. pracy, procesor wariuje, a właściwie, nie wiadomo skąd, do temp. zadanej dopisują się wartości typu 45.0234, a po niedługim czasie w temp. zadaną wskakuje 0.0 i piec wygasa... lub 32 stopnie co też nie jest rewelacją...

    W załączniku zostawiam kod źródłowy programu, wydaje mi się że ta sytuacja raczej nie jest wywołana jakimiś zewnętrznymi zakłóceniami.

    Proszę o pomoc i pozdrawiam.
  • Relpol przekaźniki
  • Poziom 34  
    Sytuacja wywołana jest wadliwie napisanym programem. Zlikwiduj wszelkie GOTO bo uC skacze pomiędzy podprogramami jak szalony więc MUSI pójść w maliny. Zasada jest jedna - jeśli program wyskakuje z pętli głównej to musi do niej wrócić (może z podprogramu wyskoczyć do innego podprogramu ale ważne jest by wrócił tą samą drogą). Podprogramy muszą się kończyć sakramentalnym RETURN. Inaczej procesor odkłada adresy powrotu na stos, odkłada, odkłada, stos rośnie i rośnie, aż zaczyna nadpisywać dane i klęska gotowa.
  • Relpol przekaźniki
  • Poziom 29  
    Schemat i projekt płytki również możesz pokazać, zdziwiłbyś się co może narobić przekaźnik załączający jakieś obciążenie indukcyjne. Przy bezmyślnie zaprojektowanej płytce nawet sam załączany przekaźnik może narobić problemów. Najlepiej żebyś zaobserwował czy te niepożądane zmiany tych wartości następują przy przełączaniu urządzeń wykonawczych... ale kto by siedział dwie godziny i się wpatrywał w wyświetlacz :( Korzystasz z eepromu, wahania napięcia podczas zapisu mogą spowodować wpisywanie się tam głupot.
  • Poziom 9  
    Więc tak, w chwili obecnej postaram się poprawić sam program bo faktycznie on może być przyczyną tego wszystkiego. Zastanawia mnie jeszcze czy nie przejść na zewnętrzny kwarc, z racji że teraz jest używany wewnętrzny.

    Układ wykonawczy (sterujący) jest na osobnej płytce i póki co wykonany na uniwersalnej. Nie używam przekaźników, sterowanie jest przez znany schemat
    uC -> MOC3041 -> TRIAK BT138 -> Odbiornik po drodze oporniki, warystory i bezpiecznik.

    Postaram się w najbliższym czasie zamieścić schemat i jakieś zdjęcia płytki, może faktycznie tam też coś jest nie tak jak miało by być:)
  • Poziom 34  
    Cytat:
    Zastanawia mnie jeszcze czy nie przejść na zewnętrzny kwarc


    Raczej nie ma potrzeby. Złożyłem sterownik pieca CO z układami wykonawczymi jak u Ciebie. Na pokładzie są 2 uC, które komunikują się przez UART i wszystko chodzi niezawodnie na wewnętrznych generatorach. Żeby było śmieszniej jeden na 4MHz, a drugi na 8MHz. Fakt, że w jednym musiałem podstroić generator.

    Najpierw popraw program.
  • Poziom 9  
    Za radą kolegi wyżej przepisałem na nowo program, dziś jeszcze zacznę testowanie.
    Miejmy nadzieję że wszystko będzie dobrze. W załączniku przesyłam poprawiony kod programu.

    Pozdrawiam
  • Poziom 34  
    No to weźmy pierwszy przykład:
    Code:
    Sub Podaj
    
          Portb.6 = 1
          Portd.6 = 0
          Wait 2
       Do
          If Portb.2 = 1 Then
          Portd.6 = 1
          Portb.6 = 0
          Dmt2 = 0
          Dmt1 = Pt2
          Return '<-------------
          End If
       Loop
    End Sub


    Return nie jest wymienne z Goto. Return stanowi zakończenie (moich ulubionych) podprogramów typu
    Code:
    Etykieta:
    
    ....
    Return

    wywoływanych poprzez Gosub Etykieta

    Z tego suba powinieneś wyjść poprzez Exit Do zamiast Return bo twój Return znalazł się w pętli Do:Loop. Program poprzez Exit Do opuści tą pętlę Do:Loop, dojdzie do End Sub i wróci skąd przyszedł.

    Poczytaj o instrukcjach:
    EXIT FOR
    EXIT DO
    EXIT WHILE
    EXIT SUB
    EXIT FUNCTION
    bo twój styl programowania będzie ich wymagał. (Osobiście w ciągu kilku lat zastosowałem je może kilka razy bo mam inny styl).
    Pilnuj aby podprogramy i Suby dobiegały do swojego końca
    w sposób "naturalny", a będziesz żył ze swoimi uC długo i szczęśliwie.
  • Poziom 9  
    Za Twoją radą zapoznałem się z powyższymi instrukcjami i postarałem się je właściwie zaimplementować w kod mojego sterownika.

    W chwili obecnej jestem w trakcie testów. Póki co za krótko jest włączony żebym mógł cokolwiek powiedzieć.

    Jedyne co zauważyłem to czasami wywali na Lcd przy temperaturze pobieranej z czujnika jakieś znaki po przecinku, które po chwili i tak się tracą.

    W załączniku ponownie kod programu.

    Pozdrawiam
  • Poziom 34  
    Nie podoba mi się podprogram:

    Tryb: i V3: - zakończony przez End zamiast Return (End kończy działanie programu i przy uC nigdy nie powinno być wykonane. UC "kończąc" program powinien zacząć go od "początku")

    Jeszcze raz apeluję. Pozwól podprogramom, funkcjom itp. przejść do KOŃCA i powrócić do następnej instrukcji po instrukcji wywołującej podprogram znajdującej się w pętli głównej. Prawidłowe jest także wyskakiwanie z podprogramu do innego podprogramu pod warunkiem, że powrót nastąpi tą samą drogą, a stos będzie na tyle duży, że zapamięta dane dla poszczególnych skoków. Jeśli musisz skorzystać z Goto to tylko w granicach tego samego podprogramu, pętli głównej itp. Możesz zatem skoczyć do etykiety umieszczonej np przed Return, End Sub itp.

    Poza tym nie zauważyłem błędów w strukturze programu.

    Co do LCD to ta instrukcja nadpisuje treść wyświetlaną. Jeśli treść poprzednia miała więcej znaków niż treść następna to ostatnie znaki treści poprzedniej nie zostaną nadpisane i pozostaną na wyświetlaczu. To jest najczęściej powód "dziwnych" danych wyświetlanych przez LCD.
  • Poziom 9  
    Co do podprogramu "Tryb:" poprawiłem go, ale w przypadku V3 sterownik cały czas w nim jest przy wybraniu "trybu ręcznego" a przy "auto" w ogóle go nie rusza.

    Co do tego wyświetlania to tak nie do końca, bo temperatura z termometra zawsze wyświetlana jest przez:
    Code:
     T = Fusing(s , "##.#")


    Wiec powinna być w formie dwucyfrowej + 1 znak po przecinku/kropce.

    A tu nie wiadomo skąd pojawia się ciąg znaków po kropce w tej temperaturze.

    Na dodatek jak poprzednio i na początku tematu, znów w temp. zdanej "z powietrza" wzięło się nagle 0.0 :D
  • Poziom 10  
    Witam

    Miałem podobny problem z wyświetlaniem. Trzeba prawidłowo przypisać typy zmiennych a formatowane umieścić w poleceniu LCD "123";Fusing(X, #.##);"123".
    Tylko takie umieszczenie formatowania rozwiązało mi problem z wyświetlaniem całkowicie.
    Odpowiednie akcje na zmiennych należy wykonywać po zaokrągleniu do całości instrukcją np Round(Vol) lub Int(Vol) lub inaczej w zależności jaką dokładność akcji chcemy uzyskać.

    Zamieszczam program testowy na, którym rozwiązałem problem:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Pozdrawiam
  • Poziom 13  
    Trochę czasu mineło czy uporałeś się z tym programem i czy działa prawidłowo?, czy mógłbyś ew. umieścić poprawiony i działający program i najlepiej schemat też .Napewno wielu by skorzystało.