logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[C][Atmega8] Warunek if jako wlacznik alarmu

Bartek.k.k 05 Sie 2011 14:20 1528 10
  • #1 9793988
    Bartek.k.k
    Poziom 21  
    Witam, męczę się z pozoru łatwym problemem. Na zestawie uruchomieniowym działa termometr z lcd 2x16, wszystko działa lecz zapragnąłem stworzyć warunek, który włączyłby buzzer po przekroczeniu danej temperatury. Poniżej kod:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Próbowałem różnie rozpisywać tą funkcję lecz żadna nie chcę zadziałać. Gdy przeniosę DDRC |= 0xff; na początek funkcji main to buzzer piszczy więc znaczy, że działa, lecz jeżeli umieszczę to w dyrektywie #define, a następnie w funkcji

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    wywołam po przekroczeniu 29*C buzzer milczy. Z akcie desperacji popełniłem jakiś absurdalny błąd, którego nie mogę znaleźć. Pozdrawiam Bartekk!
  • Pomocny post
    #2 9794011
    mirekk36
    Poziom 42  
    Po pierwsze, jak chcesz sprawdzać tylko wartość przed przecinkiem to po co mnożysz to przez 10? ;) tzn możesz ale po co ?

    Po drugie - gdzieś ty umieścił to przypisanie temperatura = coś tam ????

    Toż to trzeba zrobić w warunku, który dokonuje pomiaru bo po drodze masz badane dwa razy różne temperatury i zmienna cel raz przybiera w pętli głównej wartość jednego a raz drugiego.

    czyli temperatura=cel; powinna być albo tuż przed albo za Diplay(0); albo Display(9); zależy który czujnik bierzesz pod uwagę.

    A jak nie będziesz mnożył x10 to porównujesz po prostu if( temperatura > 29) boom;

    Dodano po 2 [minuty]:

    aha teraz dopiero spojrzałem na twoje boom; - rzeczywiście to jest boom a nie coś co ci zapali lub zgasi diody ;)

    Toż DDRx tylko ustawia kierunek portu na wyjście lub wejście. A jeszcze przydałoby się chyba celowo ustawiać jakiś świadomy stan na tym wyjściu czyli np: PORTx = 255, albo PORTx=0; jeśli już chcesz koniecznie cały port zmieniać

    Dodano po 1 [minuty]:

    Poza tym DDRC = 0xff; to powinieneś zrobić w sekcji inicjalizacji na początku main, i jeszcze sobie zgasić lub zapalić diody jak tam chcesz.

    A potem twoje boom musiałoby tylko zmienić ten stan na jakiś przeciwny i już.
  • #3 9794027
    Bartek.k.k
    Poziom 21  
    mirekk36 napisał:
    Po pierwsze, jak chcesz sprawdzać tylko wartość przed przecinkiem to po co mnożysz to przez 10? tzn możesz ale po co ?


    Zapomniałem zaktualizować kodu, jest bez x10.

    mirekk36 napisał:
    Po drugie - gdzieś ty umieścił to przypisanie temperatura = coś tam ????


    Przyznam się bez bicia, że nie wiedziałem gdzie to dać.

    mirekk36 napisał:
    Toż to trzeba zrobić w warunku, który dokonuje pomiaru bo po drodze masz badane dwa razy różne temperatury i zmienna cel raz przybiera w pętli głównej wartość jednego a raz drugiego.

    czyli temperatura=cel; powinna być albo tuż przed albo za Diplay(0); albo Display(9); zależy który czujnik bierzesz pod uwagę.


    Zrobione.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Coś takiego?
  • #4 9794257
    mirekk36
    Poziom 42  
    No dokładnie ale teraz jak sam widzisz nawet niepotrzebnie tworzysz dodatkową zmienną temperatura bo równie dobrze mógłbyś napisać:


    Kod: text
    Zaloguj się, aby zobaczyć kod


    Dodano po 1 [minuty]:

    _read_meas() - sprawdza ci temperaturę, wtedy w cel masz świeżą wartość no i w tym momencie ją sprawdzasz i ew wykonujesz od razu jakąś czynność czyli swoje "boom"
  • #5 9794527
    Bartek.k.k
    Poziom 21  
    mirekk36 napisał:
    No dokładnie ale teraz jak sam widzisz nawet niepotrzebnie tworzysz dodatkową zmienną temperatura bo równie dobrze mógłbyś napisać:


    Kod: text
    Zaloguj się, aby zobaczyć kod


    Dodano po 1 [minuty]:

    _read_meas() - sprawdza ci temperaturę, wtedy w cel masz świeżą wartość no i w tym momencie ją sprawdzasz i ew wykonujesz od razu jakąś czynność czyli swoje "boom"


    Zrobiłem wg. Pana wskazówek, wywaliłem zmienne i odrazu wpisałem if'a i działa, lecz to rozwiązuje nie przyda mi się na dłuższą metę, ponieważ muszę mieć zmienną, aby za pomocą przycisków zwiększać bądź zmniejszać jej wartość. Dodatkowo 1 rzecz mnie ciekawi. Jeżeli dam:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    to stan niski pojawia się wtedy, gdy na wyświetlaczu jest 29, a nie 28*C. Identycznie jest, gdy zmniejszymy temperaturę, 27* przy 28* włącza się buzzer. Prawidłowo za to działa 2 warunek wyłączający buzzer, przy ustawionych 28*C w kodzie oraz na wyświetlaczu. Skorzystając i nie tworząc 2 tematu, jak ustawić histeryze termometru względem termometru pieca. Pomiar DS18B20 na miedzianej rurce od grzejnika będzie się różnił od pomiaru termometru w piecu. Myślałem nad dodaniem do wyniku różnic, które wynikną 2 pomiarów. Załóżmy, że na piecu mamy temperaturę 65* a na atmedze 55*. Możliwe jest dodanie różnicy, w tym przypadku 10* do wyniku, który wyświetla się na lcd? Pozdrawiam Bartosz!
  • Pomocny post
    #6 9794570
    gaskoin
    Poziom 38  
    Nie czytałem całego wątku.

    Masz tam warunek > 28, więc warunek zadziała dopiero gdy cel będzie większy niż 28 czyli = 29, jeżeli chcesz żeby było od 28 musisz tam dać większe bądź równe 28.

    Jak chcesz mieć większe o dziesięć to

    temperatura = cel + 10;
  • #7 9794575
    Bartek.k.k
    Poziom 21  
    gaskoin napisał:
    Nie czytałem całego wątku.

    Masz tam warunek > 28, więc warunek zadziała dopiero gdy cel będzie większy niż 28 czyli = 29, jeżeli chcesz żeby było od 28 musisz tam dać większe bądź równe 28.

    Jak chcesz mieć większe o dziesięć to

    temperatura = cel + 10;


    Faktycznie, całkowicie zapomniałem o tym. Co do histeryzy, to jednak da się tak zrobić jak myślałem?
  • #8 9794599
    gaskoin
    Poziom 38  
    Jeżeli chodzi Ci o różnicę między piecem a rurą to podejrzewam, że nie zawsze będzie to funkcja liniowa. Musiał byś zdjąć zależność - temperatura rury od temperatura pieca, aproksymować to jakąś funkcją i wg niej odpowiednio skalować swoją temperaturę. Albo wgrać tablicę z takimi pomiarami do programu i wybierać temperatury pieca na zasadzie klucza, jakim w tym przypadku będzie temperatura termometru (odpowiednio też wyskalowana, bo indeksy tablicy muszą być całkowite).
  • #9 9794690
    Bartek.k.k
    Poziom 21  
    gaskoin napisał:
    Jeżeli chodzi Ci o różnicę między piecem a rurą to podejrzewam, że nie zawsze będzie to funkcja liniowa. Musiał byś zdjąć zależność - temperatura rury od temperatura pieca, aproksymować to jakąś funkcją i wg niej odpowiednio skalować swoją temperaturę. Albo wgrać tablicę z takimi pomiarami do programu i wybierać temperatury pieca na zasadzie klucza, jakim w tym przypadku będzie temperatura termometru (odpowiednio też wyskalowana, bo indeksy tablicy muszą być całkowite).


    Układ nie będzie zamontowany w elektrowni, aby to było tak dokładne. Do zimy nie tak daleko, więc mam czas na przetestowanie kilku wariantów. Dołożyłem ekran powitalny + 2 powiadomienie na lcd, lecz wiem, że da się to lepiej napisać.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #10 9794754
    mirekk36
    Poziom 42  
    Ja ci jeszcze raz powtarzam, bo nie czytasz chyba tego co piszę i powielasz z postu na post ten sam błąd.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    nie służy do tego żeby wystawić stan niski na pin PC2 - doczytasz to tym razem ???

    DDRC to tylko zmiana kierunku pinu/portu (0-wejście, 1-wyjście)

    PORTC to wystawienie jakiegoś stanu na wyjście 0 lub 1

    PINC to odczytanie tego co jest na wejściu
  • #11 9794871
    Bartek.k.k
    Poziom 21  
    Edit://

    Wszystko działa, zdefiniowałem na początku main'a

    DDRC |= (1<<PC2);

    a w kodzie zmieniłem na:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    oraz

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Temat uważam za rozwiązany. Dziękuje oraz pozdrawiam, Bartekk!
REKLAMA