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

Bascom - ds18b20 , przerwanie := reset i dziwny pomiar

B_R_U_T_U_S 23 Cze 2013 10:31 1869 10
  • #1 23 Cze 2013 10:31
    B_R_U_T_U_S
    Poziom 8  

    Mam problem jestem początkujący napisałem program który ma za zadanie regulować włączanie wiatraka i czas z jakim ma pracować, jednocześnie mierzy temperaturę i nie działa tak jak powinno :

    Temperatura pokazuję co jakiś czas błędny pomiar np 124 , 32 , 98
    procek się resetuje
    chińskie znaki raz na jakiś czas

    w programie można było ręcznie zmieniać czas pracy wiatraka, czas miedzy załączeniem wiatraka ale omijam te fragmenty bo nic nie wnoszą a jedynie zaśmieciły by kod i odczyt . nawet teraz po zastąpieniu zmiennych stałymi program nie działa prawidłowo ...




    PS od niedawna się bawię w bascom wiec proszę o wyrozumiałość

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Proszę poprawić treść wiadomości - 3.1.13 [zumek]

    0 10
  • CControls
  • Pomocny post
    #2 23 Cze 2013 17:01
    emarcus
    Poziom 35  

    B_R_U_T_U_S napisał:
    Mam problem jestem początkujący napisałem program który ma za zadanie regulować włączanie wiatraka i czas z jakim ma dmuchać , jednocześnie mierzy temperaturę i nie działa tak jak powinno :

    Temperatura pokazuję co jakiś czas błędny pomiar np 124 , 32 , 98
    procek się resetuje
    chińskie znaki raz na jakiś czas

    w programie można było ręcznie zmieniać czas dmuchania czas miedzy załączeniem wiatraka ale omijam te fragmenty bo nic nie wnoszą a jedynie zaśmieciły by kod i odczyt . nawet jak są stałe to jest to samo a mianowicie


    chyba że ktoś wie jak łatwiej odliczać sekundę to czekam na podpowiedzi ..



    Nie masz uzasadnionej potrzeby niemal wszystkie zmienne wymiarowac jako 'integer' (sekunda, czas dmuchania, licznik, A, W, etc)- te zmienne nigdy nie przybiorą wartości ujemnych.

    Przedział czasowy określony jako 1 sec. jest obliczany nie poprawnie.
    Przy częstotliwości taktowania 8MHz i prescaler = 64 otrzymujesz rozdzielczośc timera = 8 µsec;
    Timer0 zlicza 250 tych odcinków więc masz ovf (przepełnienie) co 2 msec.
    'Licznik' zlicza 250 tych przepełnień więc twoja sekunda w rzeczywistości trwa 0.5 sec. (!)

    Skoro do jakichkolwiek celów angażujesz timer i zliczasz odcinki 1-sekundowe, więc możesz pozbyc się waitms 750 (czas na odczekanie processu konversji temperatury) i wykorzystac te 1-sekundowe interwały posługując się flagą stawianą przy inkrementacji zmiennej 'sekunda', a kasowaną po odczytaniu zawartości scratchpad z DS18B20. Początek komunikacji z DS byłby warunkowany postawioną flagą, wtedy pierwsza kommenda po skip ROM, byłaby; odczyt scratchpad (temperatury); tu wystarczy tylko dwa pierwsze bajty (wszak nie sprawdzasz CRC i nie interesuje cię reszta zawarta w całości 9 bajtów scratchpad), a na koniec dajesz kommendę konversji temperatury i zostawiasz DS w spokoju do następnej flagi; wtedy DS już będzie gotowy do odczytu temperatury po konversji.

    e marcus

    0
  • CControls
  • #3 23 Cze 2013 20:07
    zumek
    Poziom 39  

    B_R_U_T_U_S napisał:
    ...Temperatura pokazuję co jakiś czas błędny pomiar np 124 , 32 , 98
    procek się resetuje
    chińskie znaki raz na jakiś czas ...

    A czy zdajesz sobie sprawę z tego, że przerwania "rozwalają" Ci transmisję 1wire :?:
    Poza tym, co z niżej wymienionymi dyrektywami Bascom-a :?:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Wiedz, że kod(listing) programu, to dopiero połowa sukcesu :-P

    0
  • #4 23 Cze 2013 20:53
    B_R_U_T_U_S
    Poziom 8  

    zumek napisał:

    A czy zdajesz sobie sprawę z tego, że przerwania "rozwalają" Ci transmisję 1wire :?:
    Poza tym, co z niżej wymienionymi dyrektywami Bascom-a :?:


    A jak powinno być poprawnie ??

    0
  • #5 23 Cze 2013 21:19
    zumek
    Poziom 39  

    B_R_U_T_U_S napisał:
    ...A jak powinno być poprawnie ??

    Przecież napisałem. Zadbaj o to, by w czasie obsługi magistrali 1wire, nie występowały przerwania. Najprościej jest wyłączać je na czas obsługi DS-a, ale wtedy, czasy załączenia ... dmuchania :-P trochę Ci się rozjadą.
    Można też użyć np. maszyny stanów, ale to raczej nie dla początkujących.

    0
  • #6 23 Cze 2013 22:29
    B_R_U_T_U_S
    Poziom 8  

    czyli rozumiem że

    w pętli głównej wystarczy dodać ???

    Stop timer0
    gosub ds18b20
    start timer0

    0
  • #7 24 Cze 2013 20:10
    SylwekK
    Poziom 29  

    Teoretycznie wystarczy, ale jak już było powiedziane rozjadą sie czasy. Ja np. zawsze robię obsługę DS w przerwaniach i nigdy nie mam błędów... dla początkującego może to byc trudne, bo trzeba zdążyć z obsługą przed kolejnym wywołaniem przerwania. Odpowiednie ustawienie stosu i ramki to kolejny ważny element aby zmienne przyjmowały właściwe wartości i program się nie wywalał po skoku do podprogramu, a u Ciebie własnie tak się dzieje.

    0
  • #8 25 Cze 2013 18:13
    B_R_U_T_U_S
    Poziom 8  

    Czy naprawdę nikt nie jest w stanie mi udzielić pomocy siedzę nad tym już którąś godzinę przeglądam forum i nic ! Proszę o pomoc

    0
  • #11 28 Cze 2013 23:50
    piotrva
    Moderator na urlopie...

    Znaczy i to i to.
    Po pierwsze na czas samego wysyłania komendy interfejsem 1wire należy zablokować przerwania (bo po co prosić się samemu o błędne pomiary), a kontrola sumy CRC jest obowiązkowa tak czy inaczej, bo ona pozwoli nam wyeliminować błędy związane m. in. z zakłóceniami.

    0