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.

[Bascom][ATmega8]DS18b20 przypisywanie do określonej fukncji

endurasek 21 Lis 2012 21:27 11652 60
  • #31 21 Lis 2012 21:27
    endurasek
    Poziom 14  

    Drodzy koledzy tylko proszę bez przepychanek!!!! Każda uwaga z was jest dla mnie bardzo cenna w tej fazie mojej nauki.
    Nikt mnie w błąd nie wprowadza tylko luźno wymieniamy poglądy a jeśli coś nie jasne to staramy się to naprawić i wyjaśnić. O i to w roli wyjaśnienia ;)
    Jak co tydzień wyjechałem i dopiero w piątek będę mógł coś powalczyć ze sterownikiem ale zacznę od wprowadzenia rezystora podciągającego do nóżki reseta i dławik, co do kwarca zostawię na oscylatorze wew.
    A oczywiście przetestuje zapisywanie do pamieci jak podał kolega wyżej i dam znać

  • #32 22 Lis 2012 06:53
    WOBI
    Poziom 19  

    Tu masz przykład byś się mógł coś nauczyć.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

  • #33 24 Lis 2012 19:31
    endurasek
    Poziom 14  

    Kolego WOBI chyba coś zmieniałeś w swoim kodzie bo ten pierwszy działał a ten już wywala bład

    Dodano po 27 [minuty]:

    A tym czasie przerobiłem trochę twój pierwotny program ale coś nie działa jak ma
    i trochę dużo miejsca zaczyna zajmować

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Dodano po 1 [godziny] 57 [minuty]:

    wracajac jeszcze do twojego przykładu (ale tego co za drugim razem podałeś) to

    wywaliłem jedno
    end sub
    i zamiast I2 wstawiłem Temp_integer <--- czy tak?

    skompilowałem program i wgrałem ale czyta tylko jeden czujnik

  • #34 24 Lis 2012 22:31
    WOBI
    Poziom 19  

    Poprawiłem program powyżej. Mam kompilator 2.7.5 i przyjmuję on nazwę Temp_integer, ale inne wersje kompilatorów protestują jak używa się nazw zatrzeżonych tu "integer i temp", wiec zmieniłem nazwę zmiennej na Temperatura. Faktycznie jedno End sub było za dużo, coś sie powieliło przy wklejaniu do postu.

    Co do wielkości to za dużo używasz podprogramów do zmiany numery DSa, trzeba to zrobić inaczej.

    Jeśli chodzi o podprogram Znajdz_czujniki to lepiej jest używać takiej ze sprawdzaniem ilości czujników komendą 1wirecount tak jak poniżej

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

  • #35 25 Lis 2012 08:28
    endurasek
    Poziom 14  

    Dalej coś jest nie tak bo czyta tylko jeden czujnik

    więc wyciąłem z programu fragment co czyta czujniki no i pokazuje dobrze w moim przypadku mam dwa podpięte i dwa znalazł

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod



    ale w programie już widzi tylko jeden

  • #36 25 Lis 2012 11:23
    WOBI
    Poziom 19  

    Teraz zobacz, skasowałem jedna procedure i powinno być dobrze.

  • #38 26 Lis 2012 16:15
    WOBI
    Poziom 19  

    A wgraj ten plik do procesora i napisz co wyświetla LCD, oczywiście 4 czujniki podpięte do Portd.1 taktowanie 8MHz i trzeba by ustawic bit EESAVE w fuse bitach by nie kasował eepromu jak kasujesz ATmege8. Jak masz ustawione fuse bity? powinno być HIGH = 0xC7 LOW 0x24 dla internal 8MHz oscyl i EESAVE by nie kasowało eepromu gdy kasujesz flash przy programowaniu nowym wsadem.

  • #40 26 Lis 2012 22:23
    WOBI
    Poziom 19  

    Masz coś z czujnikami, pliki hex i bin działa mi poprawnie, na początku wyświetla ID czterech czujników, potem wyświetla cztery temperatury, jak wypnę któryś z czujników to w miejsce temperatury wskakują kreski -.-. Po podłączeniu czujnika ponownie pojawiają sie cyfry temperatury.

    Nie napisałeś czy wyświetla ID na początku wszystkich czujników i czy są one (cztery) różne czy takie same? Każde ID musi być inne.

    Mi wyświetlały się kreski jak jeden czujnik nie miał masy (gnd) podpiętej, sprawdź czujniki czy mają masę, +5V, out do portu podpięte i rezystor 4,7k między +5V a OUT.

    Program na 100% jest prawidłowy i dlatego prosiłem byś go wgrał i napisał jak i co sie wyświetla na LCD.
    Czy wszystkie czujniki to DS18B20? Może masz DS1820 albo DS1821?

  • #41 27 Lis 2012 06:52
    endurasek
    Poziom 14  

    Rozpoznaje tylko jeden ds (a ma dwa podpięte)potem przechodzi do wyswietlania temperatury i pierwszej temperaturze jest przypisana wartosc a dla pozostałych -.-

    Jak wgram inny wsad do pomiaru ds-ow to widzi dwa
    jak z twojego programu sobie wytne kawalek z czytaniem samego id ds-a to też widzi dwa ale jaki juz wgrywam cały program to widzi tylko jeden

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

  • #42 27 Lis 2012 09:33
    WOBI
    Poziom 19  

    Wsad ten co jest w rar wyżej jest na 100% dobry, nie kombinuj tylko sprawdź jakie masz typy Dsów podpięte, jak je zasilasz, nic nie napisałeś tylko powtarzasz jak mantrę "nie działa" To samo". Albo masz złe czujniki, albo coś źle zasilasz albo Twój programator źle wgrywa pliki hex do ATMegi.
    Wgraj plik hex ten co wyżej, a potem odczytaj go na dysk pod inna nazwą i porównaj oba pliki ze sobą, jeśli sa takie same to programator jest dobry i trzeba szukać przyczyny w czujnikach i ich podłączeniu, a może źle ATmege8 zasilasz. Jeśli się różnią to znaczy że programator coś źle programuje.

    Jak sam widzisz jest wiele przyczyn i wgrywanie nowych programów nie załatwi sprawy. Procedura co odczytuje ID DSów powinna wyświetlić u Ciebie dwa różne poprawne numery ID (jeśli masz tak jak piszesz podpięte 2 czujniki), nie napisałeś czy wyświetla je, czy są identyczne czy takie same, jak mam Ci pomóc jak nie odpowiadasz na moje pytania? Jeszcze raz napiszę że program jest poprawny na 100%, podłączam na mojej płytce prototypowej od 1 do czterech czujników i wszystko działa, czarów nie ma tylko popełniasz gdzieś błąd.

    dla pewności masz nowy plik i zobacz ten temat Link tu też forumowicz miał problemy z Dsami a brakowało masy czujników.

  • #43 27 Lis 2012 16:22
    endurasek
    Poziom 14  

    Kolego Wobi już tłumacze bo chyba się do końca nie zrozumieliśmy.
    ds-y jakie stosuje to 18b20
    oba są sprawne bo w innych programach wświetlają temp nawet w twoim pierwszym programie co mi wysłałeś do nauki znajdywało dwa różne ds-y i oba temp pokazywały. Dalej

    Po wgraniu twojego wsadu sterownik:
    -rozpoznaje tylko jeden ds
    - i tez wyświetla temp jednego ds-a

    Do twojego programu wklepałem linijke ze by pokazywał ilość ds-ow podpiętych do lini no i pokazuje 2 ( bo dwa sa wpięte) dalej przechodzi do odczytu id z czujników no i tu pokazuje tylko jeden...

    Więc przerobiłem twój program minimalnie dodając tylko menu w którym wykrywa ds-y ( wszystko to samo kod programu nic nie zmieniony odpowiedzialny za odczyt id) tylko ze id nie rozpoznaje na samym początku tylko trzeba przycisnąć guziczek wejść w menu i wywołać TO SAMO polecenie sprawdzenia czujników i pokazuje ze dwa czujniki znajduje i po chwili pokazuje te dwa różne nr id czujników.

    Może tu chodzi o czas taktowania lub czas sprawdzania nr id czujników???

    I tu jest ten program jak sam zobaczysz po za menu niczym się nie różni

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Dodano po 15 [minuty]:

    Nadal nie umiem sobie poradzić z zapisem id do pamięci... i jego odczytem
    Po wył zasilania na wyświetlaczu znowu są przy temp -.-

  • #44 27 Lis 2012 16:22
    WOBI
    Poziom 19  

    A gdzie czas ma konwersję? zobacz że nie ma w Twoim kodzie czasu na konwersję:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    i po tych rozkazach powinno być Waitms 750 a tego nie ma.

    tu też źle

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Call Znajdz czujniki ma być używane!!! to cała zasada by odczytać iz apisać je do eeprom, jeśli już to zapis też trzeba wyremować.

    Wgrałeś mój hex 4ds18b20_v2.hex? Co wyświetla na LCD po wgraniu tego programu? To jest ważne bo program 4ds18b20_v2.hex działa na 100% i jeśli go wgrasz i napiszesz co jest na LCD to wtedy będę mógł sie wypowiedzieć.
    Jak zasilasz DSy? Czy masz rezystor 4,7k? napisz szczegóły. Narazie nasz dużo błedów w programie a nie wiemy jak masz podłączone DSy. Jakie masz zasilanie +5V, czy ATMEGA ma wszystkie vcc podpiete do zasilania?

  • #45 27 Lis 2012 18:07
    endurasek
    Poziom 14  

    Co do Waitms 750 to przepraszam faktycznie moja winna po prostu jak wklejałem kod zapomniałem dopisac tego bo wcześniej probowałem zmieniać czasy ale jest na bank w programie.

    jesli chodzi o to

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    To moim pomysłem było to (chyba jednak zle) że by za kazdym uruchomieniem nie szukał czujników tylko z eproma sobie bral id
    NO i jak wywołuje czytanie id czujników z poziomu menu to znajduje dwa a tak tylko jeden

    Ale właśnie probowałem wgrać twojego hex-a nie przez bascoma tylko przez eXtreme Burner no i zaladował pomyslnie ale przy probie wgrania wywalił bład
    "Mismatch at location 0x0000000009"

    posiadam rezystor 4,7k ( w tym przypadku bo w domu posiadam 4xDS na przewodzie 30m i tam musiałem dac cos ok 1Kohma bo dzialy się różne rzeczy , raz widzial 5 czujników a za drugim razem 20 czujników)
    vcc jest zasilane +5v
    avcc - kondensator szeregowo jest wpięty i do masy
    avref - to samo

    Dodano po 21 [minuty]:

    Co jeszcze ciekawego przyuważyłem to to że jeżeli funkcje Call Znajdz_czujniki
    zastąpię po prostu ta funkcją to oba czujniki widzi

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Ale widzę że przerobiłeś za 6 razem ten program bo już nie ma na koncu wyboru ds-ow czy tak???

    Dodano po 34 [minuty]:

    No i klapa chyba sobie uwaliłem atmege8 bawiłem sie fuse bitami no i procek przestał odpowiadać :(
    Jeszcze coś popróbuje ale nie widze tego (zaraz chyba założę temat jak reanimowac atmege8 ;) )
    Dobrze że w domu jeszcze mam trzy procki ;) jak by cos nie wyszło

  • #46 27 Lis 2012 18:38
    WOBI
    Poziom 19  

    Każda wersja programu działa poprawnie, tak jak myślałem masz czujniki podpięte na długich przewodach i to jeszcze połączone każdy innym przewodem, czyli topologia gwiazdy. Nie dziw się że to źle działa, ale to nie tak sie robi. Jeśli chcesz by każdy czujnik był na osobnym długim przewodzie to lepiej by każdy był podpięty do innego portu, wtedy będzie działać poprawnie, bo to co masz teraz przy takich długościach przewodów wpływa na błędy w przysyłaniu danych na magistrali 1Wire.

    Co do programu nie zrozumiałeś zasady działania. Zobacz co Ty zrobiłeś

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    wyremowałeś call znajdź czujniki, czyli nie odczytujesz ID, po resecie wszystkie ID są 00000000, a teraz zapisujesz same zera call zapis eeprom do eepromu, następny krok odczytujesz te zera z eepromu do ID, więc pytanie co adresujesz?
    Tak 00000000 czyli masz niepoprawne ID w programie. Nie możesz wyremowac znajdź czujniki.

    tak powinno być

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod



    a potem jak już są w eepromie zapisane ID to możesz wyremować tak


    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod



    Najpierw trzeba odczytać ID czujników i wpisać je do eepromu. Potem jak już są poprawne w eepromie to możesz je tylko odczytywać na początku programu z eepromu i program będzie działał. pod warunkiem że nie skasuje się eeprom podczas wgrywania wsadu do atmegi, dlatego pytałem i pisałem o fuse EESAVE który ma być ustawiony by nie kasować eepromu by ID zawsze tam były.

  • #47 27 Lis 2012 20:36
    endurasek
    Poziom 14  

    Niepotrzebnie wspomnialem o tych 30m bo tak mam w domu zrobione.
    Jak robie próby to na krótkich przewodach!!! moze 10cm tak jak teraz.
    Chwilowo jestem bez procka bo nie odpowiada ale moze jutro cos znowu podzialam z wyborem ds-ow. Jak wspomnialem wczesniej miales juz w jednym wsadzie zrobiony wybor ds-a ale zlikwidowales czemu? nie działało?


    Do słownie byś nie uwierzył wsadziłem nowy procek zmieniłem tylko EESAVE=0
    LOW=C4 I HIGH=D1 to bylo juz takie nie zmieniałem .

    Wgrałem twój wsad i działają oba czujniki ;)

    No to teraz dalej jedziemy ;)

    Widziałeś juz wczesniej jak probowałem przypisywac ds-y stałym ale kurcze to troche duzo zajmuje masz jakiś inny pomysł na to. Zależy mi na możliwości zmiany za pośrednictwem menu.

  • #50 03 Gru 2012 21:41
    WOBI
    Poziom 19  

    Za dużo tych podprogramów, ale uczysz się i to jest ważne.

    Podam może inny przykład który pomoże Ci się coś nowego nauczyć. Operujemy numerami DSów od 1 do 4 a podprogramy same przeliczaja właściwe numery adresów w eepromie i umieszczają ID (8 bajtów) pod adresem w kolejności jakiej chcesz.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

  • #52 11 Gru 2012 14:07
    WOBI
    Poziom 19  

    A co to za kolejny kwiatek ;)

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    wpisujesz do zmiennej Numer_Ds =1 i ANDujesz tą zmienną i to tekstem "temp 1" ???!!!
    Co autor miał na myśli ;) tego nie wie nikt :crazyeyes:

    ma być
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    wgraj ten plik hex i napisz czy teraz działa.

  • #53 11 Gru 2012 16:53
    endurasek
    Poziom 14  

    Niestety "czarny wyświetlacz" coś nie tak podeślij kod to może coś przerobie
    No odnośnie tego poprzedniego kodu to tego nie kumam

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    ten pod program tylko czyta id nic więcej ... nie informuje ile czujników i o jakim id są podłączone? Bo teraz jak mam wybrać i przypisać ten co chce

  • #54 11 Gru 2012 17:44
    WOBI
    Poziom 19  

    Ten podprogram automatycznie znajduje ID czujników i na podstawie ilości znalezionych czujników po podaniu Numeru_id wpisuje jego ID pod odpowiedni adres w eepromie.

    np. jeśli pierwsze ID1 znalezione zapiszesz pod numerem np. 2, drugie ID2 znalezione pod numerem np. 1 to później w programie głównym pierwsze ID1 będzie drugim czujnikiem (temperatura2) a ID2 będzie pierwszym czujnikiem (temperatura2). Jeśli będą 4 czujniki to możesz dowolnie ich ID przypisywać do jakiej chcesz kolejności dla programu głównego.
    Namieszałeś w tym programie powyżej ale idziesz w dobrą stronę i już prawie by działało gdyby nie ten kwiatek tym AND ;)

    Sprawdź ten drugi wsad, powinien działać. Poprawiłem Twój program i działa, poprzedni miał inną definicję LCD dlatego miałeś pustkę na LCD.

  • #55 11 Gru 2012 21:00
    endurasek
    Poziom 14  

    O nawet działa ale jest jeden zongg przypisujesz id do FUNKCJI
    i teraz zakładam że mam dwa czujniki
    daje
    ID1>temp1
    ID2>temp2
    na wyswietlaczu np
    temp1 22stopnie
    temp2 33stopnie
    temp3 -.-
    temp4 -.-
    dajemy raz jeszcze wybor
    id1>temp1
    id2>temp3
    na wyswietlaczu
    temp1 22stopnie
    temp2 33stopnie <--- a nie wpisywałem
    temp3 33stopnie

    nic nie zmieniłem a on zapamiętał

    ten program jest dużo fajniejszy chodzi mi o z czytywanie i przetwarzanie id czujnika ale wydaje mi się że ten wcześniejszy pod wzgledem wyboru był wygodniejszy
    Jeśli ten co teraz napisałeś program wyglądał by tak jak ten wczesniejszy co podesłałem znaczy się mogę wybrać i zmienić daną funkcję i podejrzeć jak była i jeszcze bym oddał wskazania temp z danego czujnika że by widać było jak czujnik przypisuje ID i temp jaka on pokazuje

    Dodano po 1 [godziny] 6 [minuty]:

    Program przyciski2 działa ale przyciski3 co trochę się restartuje ...
    Program przycisk4 nadal się zapętla
    A czy jest szansa na kod źródłowy ?
    Posty scalono. Proszę szanować przestrzeń serwera i używać przycisku "Zmień".
    LordBlick

  • #56 14 Gru 2012 21:55
    WOBI
    Poziom 19  

    Co to znaczy "zapętla się" ? Masz coś nie tak z procesorem, na moim działa wszystko dobrze. Poniżej poprawiony i zmieniony Twój program, już bez nielubianej Debounce. Przeanalizuj i naucz się co miałeś źle.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

  • #57 16 Gru 2012 09:15
    endurasek
    Poziom 14  

    Już wiem czemu zapętlało mi się menu no dobra chyba wiem ;p

    podmieniłem to

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    i zaskoczyło ;)


    A jaką komendą jestem w stanie wyswietlić temp na danym id dokładnie chodzi mi o to miejsce

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    w miejscu 3 , 1 chciał bym wyswietlić temp danego ID czujnika bo samo wyświetlenie nr id nic nie daje jeśli masz więcej czujników (trudno zapamiętać)

    Twój kod już jest tak rozbudowany że gubię się w przedbiegach

    Chciałem to wyświetlić przez zastosowanie Temperatura_1 = Odczyt_temper()
    ale on wyświetla temp już przypisaną do np. TEMP zew

    a ja szukam temp danego ID by móc go wyświetlić pod ID

  • Pomocny post
    #58 16 Gru 2012 14:49
    WOBI
    Poziom 19  

    Można wyświetlać temperaturę w podmenu "wybór_Ds" ale trzeba zmienić cały program. Chyba nie jest tak trudno zapisać sobie cztery ID czujników i wiedzieć później który gdzie przypisać. Najlepiej osobno podłączać każdy czujnik i na naklejce na kablu przy czujniki zapisać jego ID. Wiedząc gdzie jakie jest ID czujnika można już mu w podmenu przypisać odpowiednią funkcje (w moim przykładzie są to TEMP1/TEMP2/temp3/temp4). Oczywiście nazwy są dowolne. Nie wiem czy po temperaturach jesteś wstanie dowiedzieć się który czujnik jest który, i tak będziesz musiał znać i opisać ID każdego czujnika na nim, ja tak robię, raz napisany pisakiem na kabelku obok DS18B20 przydaje się nie raz, (przekonałem sie sam o tym).

    No ale dobrze, mały przykład, dokonana optymalizaćja, trochę zmienione funkcje podprogramy. Wyświetla temperaturę w podmenu wyboru DSa (choc nie wiem po co ;) )

    Nie uzywaj DEBOUNCE w swoich programach!

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

  • #59 16 Gru 2012 15:28
    endurasek
    Poziom 14  

    Sorrki z tym debounce oczywiście już tego nie stosuje po prostu przekopiowałem ze stareko pliku.
    Powiem tak "zaspokoiłeś" już aż nad to moją potrzebę i ciekawość. Ja jeszcze przez długi okres czasu będę analizować twój kod i dochodzić do tego.
    Na chwilę obecną wydaje mi się ze temat został rozwiązany a z tym

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    to nie wiem czemu ale nie działa (program się zapętla) ale jak wpisuje po mojemu to działa jak należy. Nawet twój sposób budowy menu jest ciekawy i warty stosowania. A tak rozbudowanego sposobu czytania ds-ow to jeszcze nie widziałem i sam na to bym nie wpadł. Jesteś wielki !!! dzięki wielkie za cierpliwość i za wytrwałość do końca.
    I jak na razie sterownik przestał się zawieszać a co zrobiłem:
    - podpiołem dławik
    - rezystor na resecie
    - z wyświetlacza led pozbyłem się pinów D0 - D3 które wcześniej były podpięte razem do masy (tu za radą użytkownika Mirekk36)

  • #60 16 Gru 2012 18:13
    WOBI
    Poziom 19  

    No tak masz rację z tą definicją portów wejścia, to było źle, już poprawiłem w programach wyżej. Powinno być SET PORTB.x a nie PINB.x

    Tak powinno się deklarować wejścia i wyjścia, o to przykład.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

  Szukaj w 5mln produktów