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.

Atmega 32 MAX31855 pomiar temperatury

robo1973 06 Gru 2018 11:12 291 20
  • #1 06 Gru 2018 11:12
    robo1973
    Poziom 14  

    Witam !!!
    Usiłuje napisach program na Atmega 32 do pomiaru trzech temperatur
    Poniżej zamieszczam kod. Pogubiłem się Chce wyświetlić temperaturę na LCD
    Pozdrawiam !!

    Kod: c
    Zaloguj się, aby zobaczyć kod


    [/code]

    0 20
  • #2 06 Gru 2018 11:25
    LChucki
    Poziom 18  

    W

    Code:

    sprintf(temperatura,"T=%1.3",temp);

    masz "%1.3". Co to ma niby robić?

    0
  • #3 06 Gru 2018 12:01
    robo1973
    Poziom 14  

    chce odczytać temperaturę temp_ic
    "%1.3" ustala format chyba

    0
  • #4 06 Gru 2018 13:10
    LChucki
    Poziom 18  

    robo1973 napisał:
    "%1.3" ustala format chyba

    Chyba? Strzelasz?
    Poczytaj o formatowaniu.

    0
  • #5 06 Gru 2018 22:07
    robo1973
    Poziom 14  

    możesz powiedzieć Bo jedyne to

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #6 06 Gru 2018 22:26
    LChucki
    Poziom 18  

    robo1973 napisał:
    możesz powiedzieć

    Powiedzieć nie mogę. Mogę napisać ale może link pomoże?

    0
  • #7 07 Gru 2018 10:22
    robo1973
    Poziom 14  

    Kod: c
    Zaloguj się, aby zobaczyć kod


    do temp_ic zapisywana jest wartość temperatury
    nie bardzo wiem jak sformatować aby wyświetlić na LCD
    po użyciu powyższego formatu
    snprintf_P(temperatura,63,PSTR("D%3d P%3d IC:%3d"),temp_ic);

    podaj P 215555642

    0
  • #8 07 Gru 2018 16:51
    trol.six
    Poziom 30  

    Hm...
    PSTR używane jest zwykle jako odnośnik do flash, nie wiem czy to zadziała ze zmiennymi w ram...

    robo1973 napisał:
    Pogubiłem się Chce wyświetlić temperaturę na LCD

    w programowaniu nie ma gubienia się i chęci, natomiast jest: co chce kolega uzyskać i co kolega uzyskuje.
    Przedstawiając konkrety, więcej osób jest w stanie koledze pomóc.
    .

    0
  • #9 07 Gru 2018 17:00
    LChucki
    Poziom 18  

    trol.six napisał:
    PSTR używane jest zwykle jako odnośnik do flash

    I tu jest użyty poprawnie, funkcja ma sufiks "_P".

    robo1973 napisał:
    snprintf_P(temperatura,63,PSTR("D%3d P%3d IC:%3d"),temp_ic);

    Dziwne jest jednak to, że w ciągu formatującym występują 3 zmienne (%3d) a w funkcji jest jedna (temp_ic). Jaki więc będzie efekt działania takiej funkcji?
    Taki jak upiec ciasto, do którego potrzeba mąki, jajek i wody a otrzymamy tylko make.

    Ponownie proponuję
    LChucki napisał:
    Poczytaj o formatowaniu.

    Dałem nawet link. Pierwsze co znajduje Google wystarcza, można oczywiście poczytać i inne linki no i o samej sprintf.

    0
  • #10 07 Gru 2018 17:01
    robo1973
    Poziom 14  

    generalni to szukam działającego programu do odczytu temperatury na atmega 32 ,c++ , max
    Na razie poskładałem program co podałem wyżej i chcę odczytać temperaturę i wyświetlać na LCD
    Konkrety podane wyżej

    0
  • #11 07 Gru 2018 17:07
    LChucki
    Poziom 18  

    <ciach>

    robo1973 napisał:
    Konkrety podane wyżej

    Też dałem konkrety. Trzeba zacząć od zrozumienia programu aby go modyfikować a widzę brak podstaw,bo można przeoczyć wyświetlanie jednej zmiennej jak jest ich 10 ale nie gdy są 3.

    Albo to:
    robo1973 napisał:
    sprintf(temperatura,"T=%1.3",temp);

    prawdopodobnie miało być wyświetlenie float czyli
    Code:

    "T=%1.3f"

    ale, czy dołączone są biblioteki zmiennoprzecinkowe?
    Jeśli tak, to jak wygląda definicja (struktura)
    Code:

    pomiar_temperatury;

    bo w kodzie tego nie widzę.

    Marek Skalski: Usunąłem uwagi bez wartości merytorycznej. Proszę trzymać się tematu.

    0
  • #12 07 Gru 2018 17:12
    trol.six
    Poziom 30  

    LChucki napisał:
    I tu jest użyty poprawnie, funkcja ma sufiks "_P".

    ja wiem że funkcja ma sufiks "_P", i nie o tym my pisze, pisze czy można zapodać dane z ram,
    poza tym owszem, są trzy formatowania i jedna zmienna.

    robo1973 napisał:
    generalni to szukam działającego programu do odczytu temperatury na atmega 32 ,c++ ,

    Nie znam gotowca w C++, ale w arduino znalazłem cos takiego, może będzie pomocne
    https://surtrtech.com/2018/01/26/lm35-with-lcd-i2c-v1/
    .

    0
  • #13 07 Gru 2018 17:22
    LChucki
    Poziom 18  

    trol.six napisał:
    LChucki napisał:
    I tu jest użyty poprawnie, funkcja ma sufiks "_P".

    ja wiem że funkcja ma sufiks "_P", i nie o tym my pisze, pisze czy można zapodać dane z ram,.

    Jak najbardziej. Jaki sens miałaby ta funkcja, gdyby tyczyła się tylko stałych? Można by użyć po prostu printf czy strcpy. "_P" oznacza, że ciąg formatujący będzie pobierany z FLASH a nie RAM. Zmienne będą brane z RAM. Ciekawie będzie gdy
    Code:

    const dana1 = 123 PROGMEM
    dana2 = 5;

    sprintf_P( buf, PSTR("%d-%d"), dana1, dana2);

    Można powiedzieć bez sensu, może być
    Code:

    sprintf_P( buf, PSTR("123-%d"),  dana2);

    ale jeśli dana1 to np wersja softu? W AVR trzeba wtedy np tak
    Code:

    #DEFINE DANA1  "123"
    dana2 = 5;

    sprintf_P( buf, PSTR(DANA1"%d"), dana1, dana2);

    ale to może utrudnić inne operacje. Generalnie, przez to wyróżnianie FLASH, RAM robi sie sporo kłopotów.

    0
  • #14 07 Gru 2018 18:07
    ex-or
    Poziom 16  

    LChucki napisał:
    Ciekawie będzie gdy
    Code:

    const dana1 = 123 PROGMEM
    dana2 = 5;

    sprintf_P( buf, PSTR("%d-%d"), dana1, dana2);


    Tak, natomiast poniższy kod powinien zadziałać:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #15 07 Gru 2018 18:48
    robo1973
    Poziom 14  

    ale, czy dołączone są biblioteki zmiennoprzecinkowe?
    Jeśli tak, to jak wygląda definicja (struktura)

    Code:

    pomiar_temperatury;

    bo w kodzie tego nie widzę.[/quote]

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #16 07 Gru 2018 18:51
    LChucki
    Poziom 18  

    Po co typ double?

    Tu w ogóle nie potrzeba liczb zmiennoprzecinkowych, wystarczy int ściślej int16_t.
    Wydaje mi się,ze poprawienie tak prostego kodu nie ma sensu, szybciej i lepiej napisać to od nowa. Nie wiem jaka precyzja jest potrzebna, jaki zakres temperatur, może lepiej zrobić to na DS18B20?

    0
  • #17 07 Gru 2018 19:09
    trol.six
    Poziom 30  

    LChucki napisał:
    Jaki sens miałaby ta funkcja, gdyby tyczyła się tylko stałych?

    ano taki, że możemy chcieć wyświetlić dane z flash, szczególnie jeśli to są stałe.
    LChucki napisał:
    Generalnie, przez to wyróżnianie FLASH, RAM robi sie sporo kłopotów.

    no niestety ... ale ma też zalete nie trzeba bawić sie linkerem. Fajniej jest np w sdcc dla pic, tam zmienne globalne const są w pamięci flash a lokalne w ram. Kolejne niestety to fakt że okupione jest to dodatkowym czasem. Nom, ale odbiegamy od tematu...
    .
    robo1973 napisał:
    c++ ,

    generalnie printf to są funkcje typowe dla C.
    ja c++ znam tylko orientacyjnie, ale tutaj masz wątek razem z linkiem, do konwersji liczb w C++, na postać dziesiętną, może ci się przydadzą
    https://www.elektroda.pl/rtvforum/viewtopic.php?t=3319844
    http://blog.malcom.pl/2017/konwersja-liczb-binarnych-do-kodu-bcd-avr.html

    ewentualnie:
    https://forum.arduino.cc/index.php?topic=156850.0
    .

    0
  • #18 07 Gru 2018 19:21
    LChucki
    Poziom 18  

    trol.six napisał:
    LChucki napisał:
    Jaki sens miałaby ta funkcja, gdyby tyczyła się tylko stałych?

    ano taki, że możemy chcieć wyświetlić dane z flash, szczególnie jeśli to są stałe.

    Dlatego w AVR starałem się nie używać stałych tylko definicji.

    <ciach>

    Marek Skalski: Proszę trzymać się tematu. Osobiste preferencje Kolegi dotyczące rozwiązań sprzętowych są bez znaczenia dla Autora tematu.

    0
  • #19 07 Gru 2018 19:28
    robo1973
    Poziom 14  

    Załączam program Koledzy możecie zaglądnąć bo już się pogubiłem
    sprintf_P( buf, PSTR("%d-%d"), temp_ic); wyświetla 0-16752 i ta wartość się zmienia jak rośnie temperatura
    dziękuje i pozdrawiam !

    0
  • #20 07 Gru 2018 20:01
    LChucki
    Poziom 18  

    robo1973 napisał:
    możecie zaglądnąć bo już się pogubiłem
    sprintf_P( buf, PSTR("%d-%d"), temp_ic); wyświetla 0-16752 i ta wartość się zmienia jak rośnie temperatura

    Bez zaglądania w kod, powróżę kolejny już raz:
    - próbujesz wyświetlić dwie zmienna a w funkcji przekazujesz jedną! Jak sobie wyobrażasz, że to bedzie działac poprawnie?
    - nie wiesz nic o stringu formatującym, poczytaj o tym!


    Myślę, że dalsze pisanie w kółko tego samego nie ma sensu, bo ile można? Ja straciłem cierpliwość, może znajdzie się ktoś bardziej wytrwały?

    Moderowany przez Marek_Skalski:

    Skoro Kolega stracił cierpliwość i nawet nie zajrzał do kodu, to w jakim celu udziela się w dyskusji?

    0
  • #21 09 Gru 2018 15:50
    robo1973
    Poziom 14  

    Problem rozwiązany

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Działa też:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Tutaj jest świetnie opisane formatowanie:
    Link

    kol LChucki dziękuję za dobre rady ale poczytałem i nic nie pomogło

    0