Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 13 kwi 2026, o 19:49


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 
Autor Wiadomość
PostNapisane: 24 lip 2013, o 18:06 
Offline
Użytkownik

Dołączył(a): 24 lip 2013
Posty: 60
Lokalizacja: Okolice Gliwic
Pomógł: 3

Witajcie serdecznie.
2 tygodnie temu zacząłem bawić się w mikrokontrolery, gdyż mój dalszy rozwój związany z elektroniką jest bez tego niemożliwy.
Programuję w C, uczę się z kursów online.

Po prostych programach, typu miganie diody LED, obsługa ekranu LCD 16x2, postanowiłem do tego ekranu coś dołożyć, mianowicie termometr, bardzo popularny DS1820.
Wszystko śmiga, temperatura wyświetla się poprawnie, ogólnie jestem zadowolony.
Jednakże nadszedł czas, by dorzucić do magistrali 1-wire kolejnego DSa, i tu zaczyna się problem.
O ile algorytm sobie jakiś wymyśliłem, choć też nie wiem, czy do końca dobry i czy nie przekombinowany, o tyle jego implementacja mnie nieco przerasta.

Mianowicie:
Najpierw należało by odczytać rom jednego i drugiego czujnika (osobno), podpinając odpowiednio pierwszy i drugi. READ ROM (0x33) i wyświetlić na LCDku, potem wstawić dwie stałe, jedna to pierwszy DS, druga to drugi.
Potem podpiąć już do megi oba DSy i MATCH ROM (0x55) najpierw jedną stałą "ROMOWĄ", odczytać temperaturę, przetworzyć, wyświetlić na LCD, potem drugi raz MATCH ROM (0x55) odczytać temperaturę, przetworzyć i wyświetlić na LCD i koniec pętli.

Dobrze myślę?

Implementacja byłaby taka:
send_byte(0x33);
id_pierwszego_dsa=read_byte();
Następnie to samo z drugim.

I jak potem zaimplementować fragment z MATCH ROMem?

Proszę o pomoc.
Wsad umieszczam tylko z DSa i maina, bo wyświetlacz jest całkowicie sprawny, działa poprawnie, wyświetla to, co chcę.
MAIN: http://pastebin.com/gkz0kvg0
ds1820.c: http://pastebin.com/vC7etftL
ds1820.h: http://pastebin.com/LqrSzp4b



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lip 2013, o 18:52 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Dobrze kombinujesz (jak jeden układ jest wpięty to odczytanie numeru jest proste), ale pamiętaj, że adres to 8 bajtów. Co do MATCH ROM to po resecie magistrali wysyłasz adres układu i odczytujesz temperaturę jak poprzednio (drugi układ czeka w tym czasie na reset magistrali i milczy). Oczywiście najpierw należy wysłać rozkaz rozpoczęcia konwersji, ale można to zrobić dla wszystkich czujników używając najpierw SKIP ROM.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lip 2013, o 19:03 
Offline
Użytkownik

Dołączył(a): 24 lip 2013
Posty: 60
Lokalizacja: Okolice Gliwic
Pomógł: 3

Czyli trzeba stworzyć tablice[8], i:
send_byte(0x33);
for(i=0;i<8;i++){
tab[i]=read_byte();
}
?

Szukałem w między czasie na guglu dodatkowych informacji, że odczytanie ROMu należy wykonać każdorazowo po uruchomieniu megi - wtedy nie dość, że korzystamy z mniejszej ilości pamięci, to można dowolnie zmieniać DS. Ale jak to zrobić?

Okej, znalazłem pewną funkcję, dorzuciłem ją do DS1820.c
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Która to rzekomo spisuje adresy do tablicy.

Kody wklejamy przy pomocy syntax=c - Zielony J.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lip 2013, o 19:38 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 sie 2012
Posty: 245
Lokalizacja: Kielce
Pomógł: 6

Kanc1erz napisał(a):
Najpierw należało by odczytać rom jednego i drugiego czujnika (osobno)

Ze swojej strony dodam że niekoniecznie osobno, istnieje ciekawy sposób na odczytanie naraz adresów na jednej szynie (nie wiem czy biblioteka której używasz to przewiduje). Rozumiem że jest to twoim problemem? Mogę opisać.

_________________
1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lip 2013, o 19:44 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Wykorzystanie SEARCH ROM jest wygodniejsze i nie trzeba martwić się po wymianie czujnika o nowy adres. Funkcja wygląda spoko. Wyniki będą w tablicy rom[x][8], gdzie x to liczba czujników jaka będzie dołączona do magistrali. Tablicę tą należy wcześniej utworzyć jako zmienną globalną.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lip 2013, o 20:02 
Offline
Użytkownik

Dołączył(a): 24 lip 2013
Posty: 60
Lokalizacja: Okolice Gliwic
Pomógł: 3

Dokładnie tak zrobiłem, jak napisałeś, Krauser.
Teraz wystarczy porównać tablice i odczytać wartości czujników.

@Zielony J. - tak, wiem i przepraszam. Zapomniałem o tym, użyłem [code][/code], ale nie zadziałało ;)



EDIT:
Ostatnia, chyba, rzecz - jak zorganizować to porównanie?

Wpisałem coś takiego (tylko nie bijcie, C też nie mam jeszcze jakoś świetnie opanowanego)

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Oczywiście po powitaniu nic się nie wyświetla. Przed pętlą jest funkcja search_rom();, choć nie mam pewności co do tego, że do tablicy rom[][] zostało cokolwiek zapisane, a nie mam koncepcji jak wyświetlić na ekranie LCD zawartość tej tablicy. Ponadto, co zauważyłem: tablica [0][x] jest zaśmiecona - nie zawiera nic. Dopier [1][x] oraz [2][x] zawierają adresy dsów.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lip 2013, o 12:14 
Offline
Użytkownik

Dołączył(a): 24 lip 2013
Posty: 60
Lokalizacja: Okolice Gliwic
Pomógł: 3

Wiem już co jest nie tak.
Na pewno coś z funkcją search_rom, tylko nie wiem gdzie, nie umiem sobie z tym poradzić, w każdym razie albo się zawiesza, albo się zapętla gdzieś.
kody:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Nie rozumiem po co wpisujesz z "palca" syntax=c skoro masz listę wyboru SYNTAX wybierz... Zielony J.
- Szybka odpowiedź nie ma takich featurów :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lip 2013, o 13:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 sie 2012
Posty: 245
Lokalizacja: Kielce
Pomógł: 6

Kanc1erz napisał(a):
Na pewno coś z funkcją search_rom, tylko nie wiem gdzie


No nie sprawdzę kodu w C ,ale może przyda Ci się to co teraz napisze...

Jeśli chodzi o search rom to składa się on z 3 stopniowego procesu identyfikacji.

1) Pierwszą czynnością funkcji search rom powinno być wysłanie impulsu o długości 1us. Dzięki temu układy slave wiedzą że mają teraz zachowywać się w "specjalny" sposób.
2) Po otrzymaniu sygnału układy slave podają na szynę swój najmłodszy bit adresu. Budowa szyny 1-wire sprawia że pojawia się na niej logiczne AND najmłodszego bitu wszystkich układów, wynika więc z tego że jeśli we wszystkich układach najmłodszy bit to 1 to master odczyta 1 (w przeciwnym razie 0)
3) Następnie MASTER wysyła kolejny impuls uS a układy na szyni 1-wire odpowiadają znów wartością najmłodszego bitu jednak tym razem zanegowaną. Znów mamy do czynienia z AND i odbiorem bitu przez MASTERA (jak wyżej).
4) Teraz następuje analiza danych przez mastera. Jeśli za pierwszym i za drugim razem otrzymał 0 to sprawa jest niejasna. Jeśli natomiast otrzymał wartość najpierw 0 a potem 1 to wszystkie układy mają bit adresu równy 0,
jeśli otrzymał najpierw 1 a potem 0 to wszystkie układy mają pierwszy bit 1.
5) w przypadku sytuacji niejasnej master uruchamia proces eliminacji, podaje na szynę np.1 i wtedy scalaki które mają inny bit adresu niż wartość wysłana przed chwilą wyłączają się. W ten sposób następuje eliminacja aż do zbadania tego bitu we wszystkich układach.

Teraz wystarczy powyższe punkty powtórzyć 64 razy i mamy adresy, dobrym sposobem jest jee np. wpisywać do dwuwymiarowej tablicy jak ktoś pokazywał wyżej

_________________
1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lip 2013, o 13:48 
Offline
Użytkownik

Dołączył(a): 24 lip 2013
Posty: 60
Lokalizacja: Okolice Gliwic
Pomógł: 3

Wojtek001 napisał(a):
Kanc1erz napisał(a):
Na pewno coś z funkcją search_rom, tylko nie wiem gdzie


No nie sprawdzę kodu w C ,ale może przyda Ci się to co teraz napisze...

Jeśli chodzi o search rom to składa się on z 3 stopniowego procesu identyfikacji.

1) Pierwszą czynnością funkcji search rom powinno być wysłanie impulsu o długości 1us. Dzięki temu układy slave wiedzą że mają teraz zachowywać się w "specjalny" sposób.
2) Po otrzymaniu sygnału układy slave podają na szynę swój najmłodszy bit adresu. Budowa szyny 1-wire sprawia że pojawia się na niej logiczne AND najmłodszego bitu wszystkich układów, wynika więc z tego że jeśli we wszystkich układach najmłodszy bit to 1 to master odczyta 1 (w przeciwnym razie 0)
3) Następnie MASTER wysyła kolejny impuls uS a układy na szyni 1-wire odpowiadają znów wartością najmłodszego bitu jednak tym razem zanegowaną. Znów mamy do czynienia z AND i odbiorem bitu przez MASTERA (jak wyżej).
4) Teraz następuje analiza danych przez mastera. Jeśli za pierwszym i za drugim razem otrzymał 0 to sprawa jest niejasna. Jeśli natomiast otrzymał wartość najpierw 0 a potem 1 to wszystkie układy mają bit adresu równy 0,
jeśli otrzymał najpierw 1 a potem 0 to wszystkie układy mają pierwszy bit 1.
5) w przypadku sytuacji niejasnej master uruchamia proces eliminacji, podaje na szynę np.1 i wtedy scalaki które mają inny bit adresu niż wartość wysłana przed chwilą wyłączają się. W ten sposób następuje eliminacja aż do zbadania tego bitu we wszystkich układach.

Teraz wystarczy powyższe punkty powtórzyć 64 razy i mamy adresy, dobrym sposobem jest jee np. wpisywać do dwuwymiarowej tablicy jak ktoś pokazywał wyżej



@1 Za to odpowiada funkcja send_byte(0xF0), zgodnie z tym: https://docs.google.com/file/d/0BypxwY1AXgQ9YmY1MzEzYzItYTIyYi00YmMwLThhZDAtNTY1ZGVhM2IxMWI0/edit?hl=pl
Resztę mam w funkcji search_rom, i zgadza się to z tym, co napisałeś. Natomiast funkcja search_rom na samym początku posiada:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


I ustawiłem sobie tekst kontrolny po tym while'u i on się nie wyświetlił, zatem ewidentnie nie umie wyjść z tej pętli. Ale nie wiem dlaczego. Znaczy wiem - stan, czyli wartość, która zwraca funkcja jest cały czas jedynką - i to jest kłopot.
Po tej pętelce reszta jest tak jak napisałeś w swojej instrukcji.



Ostatnio edytowano 25 lip 2013, o 19:03 przez Kanc1erz, łącznie edytowano 2 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lip 2013, o 15:39 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27454
Lokalizacja: Szczecin
Pomógł: 1045

Kanc1erz napisał(a):
- Szybka odpowiedź nie ma takich featurów


To można wyedytować post i poprawić tak jak trzeba - wtedy będzie dostępna opcja.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lip 2013, o 15:45 
Offline
Użytkownik

Dołączył(a): 24 lip 2013
Posty: 60
Lokalizacja: Okolice Gliwic
Pomógł: 3

mirekk36 napisał(a):
Kanc1erz napisał(a):
- Szybka odpowiedź nie ma takich featurów


To można wyedytować post i poprawić tak jak trzeba - wtedy będzie dostępna opcja.



A jest jakaś istotna różnica między tym, że sobie ręcznie wpiszę syntaxy (które działają!), wybiorę sobie górnej list listing kodu?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lip 2013, o 16:14 
Offline
Moderator zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 18 lip 2012
Posty: 3230
Lokalizacja: Kraków - obok FAB5 ATMEL'a
Pomógł: 91

No akurat w tym przypadku nie zadziałał bo wpisałeś duże C a nie małe.

Wybierając z listy nie trzeba się o to martwić, klikasz i wstawiasz kod między znaczniki.

_________________
http://www.jaglarz.info



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lip 2013, o 19:02 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27454
Lokalizacja: Szczecin
Pomógł: 1045

No po wypowiedzi kolegi Jaglarza - nic dodać nic ująć ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lip 2013, o 20:34 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Tylko, że 1 to obecność układu i należy zrobić tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

W funkcji main pamiętaj, że po resecie znowu musisz wysłać adres układu, czyli Reset, MATCH ROM, CONVERT T, RESET, MATCH ROM, READ STRACHPAD, odczyt bajtów.

Inne uwagi do programu:
- dodaj w pliku ds1820 coś takiego: #define SKIP_ROM 0xCC wtedy łatwiej się analizuje program
- nie używaj F_CPU, bo teraz masz inne w pliku main i inne lub nie w ds1820.c

Tablicę możesz wyświetlić umieszczając taką linię w pętli for:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lip 2013, o 21:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 08 mar 2013
Posty: 236
Lokalizacja: Warszawa
Pomógł: 5

Jak to już drążymy ten temat, to w sumie jedna sprawa mnie nurtuje, po co wysylamy na koncu ten bit, który odebraliśmy?

Po odebraniu tego bitu jesli pasuje z wyslanym to tylko ten ds wysyla reszte bitów?
Jesli tak, to all jest jasne, bo w sumie już jeden ziomek opisał w tym temacie odnośnie tej operacji AND i mozliwych konfiguracjach.


A co do tej twojej funckji to ona mi nie działa. Ja przerobiłem w sumie te biblioteki dallas, tak, żeby uwzględniały all kombinacje, tak dla mojej przejrzystości na przyszłość. Bo wiadomo jest, że potem jest łatwiej analizowac i optymalizować.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 11 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO