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

[C] Termostat "wielozadaniowość" DS18b20, Atmega168 C

qutrit 14 Lip 2012 22:51 1033 2
  • #1 14 Lip 2012 22:51
    qutrit
    Poziom 19  

    Witam.
    Otóż mam taki problem ;) Dwa czujniki DS18b20 podłączone są do osobnych pinów Atmegi168, PINB0, PINB1. Chciałem to zrobić w ten sposób aby w przerwaniu ustawiana była flaga (co sekundę) która realizowana była w pętli głównej while(1), w ten sposób, aby co sekundę na zmianę wykonywany został convert oraz odczyt. Wydaje mi się, że wszystko zrobiłem dobrze (na stan wiedzy jaki posiadam) a jednak układ nie działa.
    Jedno co zauważyłem i co mnie martwi, to fakt że dioda na PB2 którą mam w przerwaniu powinna co sekundę migać (zmieniać stan na przeciwny) a ona tylko przygasa - co świadczy o tym, że przerwanie wykonywane jest 2 razy ?!?!
    Jeżeli zakomentuję convert(x); lub odczyt(x); to diody PB2, PB3, PB4 migają prawidłowo

    Jeżeli w miejsce argumentów "x" wstawię na sztywno "0" to odczyt z czujnika PINB0 jest prawidłowy. Jeżeli wstawię "1" odczytu nie ma :(
    Napiszę jeszcze, że zanim napisałem tego posta to sporo kombinowałem z volatile i w ogóle z różnymi innymi rzeczami.
    Jedno co pomogło to:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    więc funkcje od DSa są poprawnie napisane. Tylko, że taki sposób nie ma nic wspólnego z "wielozadaniowością"
    Może ktoś uzupełni braki mojej wiedzy lub wskaże błąd. Poniżej kod:
    onewire.h
    Kod: c
    Zaloguj się, aby zobaczyć kod


    onewire.c
    Kod: c
    Zaloguj się, aby zobaczyć kod

    main.c
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 2
  • Pomocny post
    #2 14 Lip 2012 23:40
    gaskoin
    Poziom 38  

    Jedna mała uwaga:

    Plik nagłówkowy tylko wskazuje, że dane funkcje gdzieś tam istnieją i można z nich korzystać. Nie potrzebujesz w nim deklaracji Read i Send Byte bo nigdy na zewnątrz z nich raczej nie skorzystasz. Z punktu widzenia użytkownika takiej biblioteki, jest to potencjalnie niebezpieczne i lepiej w nagłówku mieć tylko to, z czego się korzysta "na zewnątrz", czyli funkcje typu "convert" i "read temerature".

    I jeden błąd - nie wolno definiować zmiennych w pliku nagłówkowym ! Zgadnij co się dzieje, gdy robisz w kilku miejscach "#include xxx.h".

    0
  • #3 16 Lip 2012 20:48
    qutrit
    Poziom 19  

    Kurcze próbuje na wszystkie strony i jakoś mi nie wychodzi. Jeżeli w pliku onewire.c wstawiam:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    lub
    Kod: c
    Zaloguj się, aby zobaczyć kod

    to odczyty są prawidłowe.
    Po prostu nie wiem jak zrobić aby do
    Kod: c
    Zaloguj się, aby zobaczyć kod

    przypisywać wartości 0 lub 1 podawane jako argumenty w funkcjach convert(x); i odczyt(x); w main.c
    Może jakieś naprowadzenie gdzie tego szukać ?

    0