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

[Atmega168][Atmega32][1wire][Bascom] problem z komunikacją

Madergames9 24 Wrz 2009 21:28 4307 28
  • #1 7054367
    Madergames9
    Poziom 15  
    Witam
    Temat jest taki. Posiadam magistralę 1wire na której są zamontowane termometry DS18B20 oraz przełączniki DS2407. Pracuje na tym sterowanie ogrzewaniem w mieszkaniu. Do tej pory sterowałem nią układem na bazie Atmega168 i działało to prawidłowo. Zbudowałem następny sterownik z Atmega32 na pokładzie i zaczeły się schody. Odczyt adresów układów prawidłowa. Komunikacja z DS18B20 prawidłowa wraz z odczytem temperarury. Problem mam z DS2407. Myslałem że mam problem z magistralą wogóle, ale jeden z DS2407 działał prawidłowo tzn wysyłając adres przełączał się on/off. Magistrala była wyłączona od wiosny więc myślałem , że coś się stało, jednak działający przełącznik przepinałem w różne miejsca i działał w dalszym ciągu prawidłowo. Podłączyłem w końcu stary sterownik i wszystko działa. Pytanie jest takie co może powodować taką sytuację. Czy jest to sprawa użycia niewłaściwego portu który może byś mało wydajny prądowo..?. Druga sprawa jest taka w działającym sterowniku mam podpiętą magistralę do jednego pinu z portu C a wdrugim do portu A. Już przepinałem w Atmedze32 magistralę pod port C jednak to nic nie zmieniło. są w sumie dwie różnice w ustawieniu fusebits w działającym mam włączony JTAG a w drugim nie. Atmega168 taktowana kwarcem 8Mhz a AT32 16Mhz. Czy zmieniłoby coś jakbym w Atmedze 32 podłączył 1wire pod port C i włączył JTAG..?. To tyle na początek. Acha czy aż taki wpływ może mić odległość podłączenia magistrali od uP ?
  • #2 7055113
    kwesoly
    Poziom 15  
    Tak, odległośc ma znaczenia, zwlaszcza jesli nie masz 3 przewodów. DS18b20, zasilany z kabla danych (parasite power), podciągnięty do 5V przez rezystor 3,9k działa wyśmienicie na krótkim kablu. Na 4metrowym cienkim jak diabli kabelku juz nie był skory do działania - read scratchpad zwracał wartość 0x0550 czyli czujnik się z braku prądu resetował. Pomogła zmiana podciągającego na 2,2k. 1-wire to i tak programowa realizacja, wiec nie powinno byc różnicy gdzie podpinasz o ile port działa - ew różnicy w rezystancji wbudowanego pullupa ale ona powinna byc pomijalnie duża w porównaniu z podciągającym.
  • #3 7055170
    Madergames9
    Poziom 15  
    Magistralę ciągnę dwoma przewodami. Rezystor podciągający 511om bo powyżej nie działa nic tzn tak od 640om zanika na 1k nie ma już nic. Na czas konwersji podciągam DQ do plusa przez tranzystor. Odczyty termometrów są prawidłowe, więc cała magistrala działa na AT32 ale z przełączników działa tylko jeden. Na AT168 działa wszystko cacy więc napewno chodzi o procek bo o cóż innego i sposób jego ustawienia lub podpięcia. Chyba że porty są mniej wydajne prądowo w AT32. Gdzieś czytałem, że port C ma lepszą wydajność, ale tam zaimplementowany jest JTAG może więc jego wyłączenie może mieć wpływ na tą sytuację?. W AT168 nie wyłączyłem JTAG-a i !wire mam podłączony właśnie do portu C. Oczywiście mam pociągnięte zasilanie +5V ale korzystają z niego tylko przełączniki i to tylko do włączenia urządzenia. termostaty i tu i tu działają prawidłowo na dwóch przewodach.
  • #4 7056263
    Madergames9
    Poziom 15  
    No i nie ma nikogo z kolegów co mogą podsunąć jakąkolwiek radę, pomysł..?. Np dlaczego muszę zejść do 500om rezystora podciągającego DQ skoro wszyscy co piszą stosują standardowe wartości..?. Nikt nie miał problemów z magistralą 1wire..?
    Pozdrawiam.

    Ps. Przymierzam się do przejścia na RS485 ale to jeszcze chwilę potrwa, więc ten problem najpierw chciałbym załatwić...
  • #5 7056280
    kwesoly
    Poziom 15  
    Nie lubię się powtarzać (bo to samo pytanie juz rzuciłeś gdzie indziej) ale niech będzie:
    Cytat:
    Że 4,7k jest w porządku jako sygnałowy, ale jak masz 5 obciążających urządzeń na linii sygnałowej to już nie jest tak pięknie :)

    Tak całkiem pi*oko licząc - skoro jednemu urządzeniu wystarcza 4,7k (a w PP wystarcza na raczej małe odległości), to żeby przy tych samych spadkach napięć na podciągającym rezystorze uzyskać 2 razy większy prąd musisz już zastosować 2,3kOhm, dla 4 urządzeń już tylko 1,1kOhm ma szanse. Dodaj do tego piąte urządzenie, dystans i już wyjaśnione :)
    Poczytaj DS do tych urządzeń i ogólne uwagi dallasa na temat magistral One-Wire.

    I jeśli chcesz pomocy napisz coś wiecej niż
    Cytat:

    "działała mi magistrala 1wire na ATmega168 a na Atmega32 nie działa - co jest powodem?"
    uzupełnione gdybaniem (częściowo wyssanym z palca). Jakieś schematy, kod?
  • #6 7056418
    Madergames9
    Poziom 15  
    Sorki, że tak trochę "rozdwoiłem się". Najpierw temat poruszyłem tutaj, a potem zajrzałem do tamtego i tak jakoś skrobnąłem. Program na AT168 i na AT32 jest właściwie taki sam po odpowiednich zmianach. Podłączenie do portu właściwie to nie trzeba rysować bo jest to najprostsze z możliwych. Rezystor podciągający 500om wyjście DQ do plusa i równolegle tranzystor do podciągnięcia zasilania podczas konwersji w DS18B20. Kodu programu teraz przy sobie nie mam, ale jest to naprawdę działający kod programu na AT168 a na AT32 ma problem z przełącznikami natomiast termometry działają prawidłowo. Później podeślę kawałek programu jak dotrę do domu.
    Pozdrawiam
  • #7 7056493
    mirekk36
    Poziom 42  
    Powiem krótko, to jaki procek zastosujesz czy m32 czy m168 czy m8 czy m128 - nie ma żadnego - najmniejszego znaczenia.

    poza tym piszesz że masz rezystor podciągający 500R ???? skąd taka wartość

    że masz równolegle podłączony tranzystor i co sterujesz go sam? "ręcznie"

    zadajesz pytanie typu:

    Cytat:
    "Czy zmieniłoby coś jakbym w Atmedze 32 podłączył 1wire pod port C i włączył JTAG..?. "


    czy ty wiesz co to jest JTAG ? jak ustawia się fusebity ?

    jeśli uważasz że wszystko jest dobrze w programie i po co pokazywać kod? jeśli uważasz, że wszystko masz dobrze podłączone i po co schemat? to nie rozumiem po co w ogóle zadajesz pytanie.

    Jak ktoś ma takie problemy to po to jest schemat bo warto zobaczyc co kolega powydziwiał np jeśli chodzi o samo zasilanie procka - tutaj najczęściej ludzie robią sobie masakrę a jednocześnie twierdzą w opisach teoretycznych, że wszystko jest dobrze podłączone. To że twój kod działa ci w m168 może być czystym przypadkiem

    już z samego opisu połączeń można domniemywać, że być może sporo rzeczy jest nie tak - i czy tak trudno wrzucić schemat tego co się zrobiło i co nie działa?

    inna sprawa to to, jakie ty kable w ogóle stosujesz do podłączania czujników. Już byli tacy sprytni koledzy, którzy podłączali to na ekranowanych kablach stereo audio i byli wielce zdziwieni że im coś szwankuje na 1wire

    ale ty jesteś lepszy bo gdzieś doczytałem się tylko, że stosowałeś jakiś super cienki kabelek - no to fakt - to bardzo dużo mówi temu komu zadajesz pytanie

    ....... a wysztaczy tylko troszkę poszperać na elektrodzie żeby zobaczyć, że wystarczy podpiąć czujniki w magistralę na kablu skrętkowym kat.5 UTP i wszystkie problemy znikną jak ręką odjął - tylko trzeba jeszcze wiedzieć jakie podciągnięcie do VCC zastosować i przy jakim trybie Parasite czy 3-przewodowym

    ale ty kurczę prawie o niczym nie jesteś w stanie konkretnie napisać a dziwisz się, że nikt ci nie odpowiada prawie

    Mógłbym jeszcze wiele - wiele przyczyn tego że nie działa u ciebie wymieniać - ale czy taki jest cel forum????? wróżenie z fusów???? toż nawet w regulaminie jest napisane, że pytanie powinno być jasno i rzetelnie zadane a do tego poparte kawałkiem schematu i/lub kodu - ale nie .... lepiej zwracać się jak do wróżbitów


    reasumując - proponuję - weź się w garść - podaj w punktach kilka konkretnych informacji - podeprzyj to schematem ale takim jak to masz teraz podłączone - szczególnie zasilanie procka, pokaż fragmenty kodu odpowiedzialne za komunikację 1wire - a wtedy na pewno nie tylko ja ale i inni chętnie pomogą w rozwiązywaniu problemu
  • #8 7057220
    Madergames9
    Poziom 15  
    Kurcze ale malutki jestem... :D

    Po skrócie
    1. Nie używałem JTAG-a i ta wiedza póki co nie jest mi raczej potrzebna.

    2. Wiem jak ustawia się fusebits, ale jak napisałem na AT mam wyłączony JTAG a na AT168 nie. Jednak magistrala na AT168 działa bez problemu i to na porcie C z włączonym JTAG-iem

    3. Rezystor podciągający dobrałem metodą prób i błędów staneło na 511om. Źródło tej wiedzy jest w pliku pomocy po polsku do Bascom AVR podpisany przez niejakiego Gote Haluza.

    4. Aż takim laikiem jestem i nie piszę o rzeczach oczywistych więc przewód to skrętka UTP kat5e i miodzio prawda..?.

    5. Podsyłam schemat połączeń do procka AT32 jak coś tam brakuje to podeślę jeszcze kawałek:
    [img][Atmega168][Atmega32][1wire][Bascom] problem z komunikacją[/img]

    6. Właściwie całkowicie okrojony kawałek kodu, ale przejżysty i chyba będzie widać co może być nie tak jeżeli to on jest winny. Zachowuje się dokładnie tak samo jak pełny program, ale wywołuje tylko przełączniki po zmianie wartości zmiennej "X" od wartości 41 wzwyż poniżej są adresy termometrów

    $crystal = 16000000
    $swstack = 64
    $hwstack = 64
    $framesize = 32
    
    ' * * * * Ustawienia konfiguracyjne * * * *
    
    Config 1wire = Portc.3
    Config Pinc.7 = Output                                      'podswietlenie LCD
    Config Pina.7 = Output                                      'ustawienie wyjścia dla pullup 1wire
    
    Portc.7 = 1
    Porta.7 = 0                                                 'stan poczatkowy tranzystora pullup 1wire
    
    ' * * * * Zmienne programu * * * *
    Dim Adr(104) As Byte                                         'tablica do przecowywania adresów układów 1wire
    Dim X As Byte
    Dim W As Byte                                               'zmienna odczytu adresów Dallas
    
    
    Cls
    
    W = 1wirecount()
    
    Cls
    Lcd "Ile =" ; W ; "szt"
    Wait 2
    Cls
     X = 1                                                      'zapisz od komorki  X
      Adr(x) = 1wsearchfirst()                                  'znajdź pierwszy adres
     X = 9                                                      'zapisz od komorki  X
      Adr(x) = 1wsearchnext()                                   'znajdź drugi adres
     X = 17                                                     'zapisz od komorki  X
      Adr(x) = 1wsearchnext()                                   'znajdz trzeci adres
     X = 25                                                     'zapisz od komorki  X
      Adr(x) = 1wsearchnext()                                   'znajdz czwarty adres
     X = 33                                                     'zapisz od komorki  X
      Adr(x) = 1wsearchnext()                                   'znajdz piaty adres
     X = 41                                                     'zapisz od komorki  X
      Adr(x) = 1wsearchnext()                                   'znajdz szosty adres
     X = 49                                                     'zapisz od komorki  X
      Adr(x) = 1wsearchnext()                                   'znajdz siodmy adres
     X = 57                                                     'zapisz od komorki  X
      Adr(x) = 1wsearchnext()                                   'znajdz osmy adres
     X = 65                                                     'zapisz od komorki  X
      Adr(x) = 1wsearchnext()                                   'znajdz dziewiaty adres
     X = 73                                                     'zapisz od komorki  X
      Adr(x) = 1wsearchnext()                                   'znajdz dziesiaty adres
     X = 81                                                     'zapisz od komorki  X
      Adr(x) = 1wsearchnext()                                   'znajdz jedenasty adres
     X = 89                                                     'zapisz od komorki  X
      Adr(x) = 1wsearchnext()                                   'znajdz dwunasty adres
     X = 97                                                     'zapisz od komorki  X
      Adr(x) = 1wsearchnext()                                   'znajdz trzynasty adres
    
    
    
    Main:                                                       'pętla glówna
    Do
    X = 49
    
      1wreset
      1wwrite &H55
      1wwrite Adr(x) , 8
    
    Wait 2
    
      1wreset
      1wwrite &H55
      1wwrite Adr(x) , 8
    
    Wait 2
    
    
    Loop
    End
    
    '- - - - - - Koniec petli glownej - - - - - - -


    Jak coś jeszcze znajdę to dorzucę

    Dodano po 11 [minuty]:

    mirekk36 - - tak swoją drogą nie pisałem o rzeczach oczywistych, chociażby o użyciu skrętki UTP, o zastosowaniu kondków 100n i elektrolitów filtrujących zasilanie blisko uP. W przypadku Bascom-a i magistrali 1wire po wyrzuceniu zbędnych rzeczy oprócz prostych Bascom-owych komend do magistrali nic właściwie się nie zmienia oprócz ustalenia portu podpięcia DQ oraz sterowania tranzystora pullup. W przypadku ustalenia jego stanu początkowego przy wchodzeniu do pętli głównej pozwala wyrzucić resztę odpowiedzialną za sterowanie termometrami. Jezeli się mylę będę się kłaniał wszystkim w pas. :D Posądzenie o sterowanie ręczne jego działaniem było chwytem poniżej pasa, więc trochę spokoju i wiary w tych co piszą. Linijki kodu sterujące jego pracą są zawarte w części kodu odpowiedzialnego za sterowanie czujnikami temperatury, ale to chyba ze sprawą nie ma nic wspólnego..?.

    Dodano po 7 [minuty]:

    Dodaję również część schematu ze sterowaniem 1wire:

    [img][Atmega168][Atmega32][1wire][Bascom] problem z komunikacją[/img]

    i kawałek kodu odpowiedzialnego za sterowanie tranzystorem podciągającym

    Zmierzt:
      1wreset                                                   'reset
      1wwrite &H55                                              'wiele kostek, więc wykorzystujemy rozkaz MATCH ROM
      1wwrite Adr(x) , 8                                        'wysylanie adresu kostki
      1wwrite &H44                                              'dokonaj konwersji
      Porta.7 = 1                                               'zalaczenie tranzystora pull up na czas konwersji
      Waitms 750                                                'przeczekaj czas konwersji
      Porta.7 = 0                                               'wylaczenie tranzystora
      1wreset                                                   'reset
      1wwrite &H55                                              'rozkaz adresowy MATCH ROM
      1wwrite Adr(x) , 8
      1wwrite &HBE                                              'rozkaz funkcyjny - polecenie odczytu DS18x20
      Odczyt(1) = 1wread(2)                                     'odczytaj dwa pierwsze bajty
      T = Odczyt(2)                                             'przepisz starszy bajt do zmiennej typu Integer
      Shift T , Left , 8                                        'przesuń ten bajt w lewo na wyższe pozycje
      T = T + Odczyt(1)                                         'przepisz - dodaj młodszy bajt
                                                                'teraz w zmiennej T typu Integer jest dziwna "ułamkowa" wartość temperatury
       T1 = T / 16                                              'wyraź w stopniach Celsjusza, wynik wpisz do zmiennej Single
    '  T1 = T / 2      'dla układów DS18S20 i DS1820   dla innych T1 = T / 16
    Napis = Fusing(t1 , "#.#")
    
      Cls : Lcd Tem ; "= " ; Napis ; "oC"                       'wyświetl wynik ze zmiennej Single
    Return


    Chyba kogoś zaspokoiłem.. ? :D

    Pozdrawiam
  • #9 7057319
    mirekk36
    Poziom 42  
    ad.1 - rozumiem, że nie używasz JTAG'a ale właśnie trzeba zwrócić uwagę, które Piny procka są że tak powiem "nieczynne" dla ciebie jeśli jest on załączony. Więc jeśli chce się z nich korzystać jako ze zwykłych portów I/O to oczywiście trza wyłączyć tego fusebita

    2. to że działa ci magistrala na porcie C przy włączonym JTAG może wcale nie być dziwne - jeśli korzystasz akurat z innych pinów niż te, które są odpowiedzialne za interfejs JTAG

    3. Czy nie porównujesz nigdy źródeł wiedzy - żeby samemu wnioski wyciągnąć ???? toż chyba najważniejszym źródłem dla ciebie powinna być nota PDF szczególnie czujnika DS - a w nocie masz wyraźny - ogromy nawet rysunek - z którego jasno wynika, że w typowych warunkach dla napięć zasilających od 3,3 do 5V - powinien to być rezystor 4,7K. Oczywiście jeśli chcesz wykorzystywać tryb Parasite (dwa przewody to może on być mniejszy - ale 1K spokojnie wystarcza - ja na kablu skrętkowym o długości 15-20m podłączałem do 4-6 czujników w trybie parasite z rezystorem 1K - i bez żadnego dodatkowego tranzystora - wszystko śmigało i śmiga do dzisiaj że hej

    ad.4 nikt ci nie wmawia że jesteś laikiem - ale zrozum, że jak się tak zadaje pytania to różnie można pomyśleć. A nawet gdybyś był laikiem to co z tego - każdemu można pomóc

    ad.5 - najbardziej dziwi mnie co zrobiłeś z AGND ???? czy ona u ciebie nie jest nigdzie połączona ze zwykłym GND ???? to by było dosyć dziwne (gdyby nie była nigdzie połączona z GND) i mogłoby tłumaczyć dziwne zachowania portu A

    co do kodu to za chwilkę może jeszcze coś napiszę

    Dodano po 25 [minuty]:

    ok a teraz takie pytanie - czy nie mógłbyś zrobić testu polegającego na tym, że wyjmujesz ten tranzystor z 1wire a rezystor podciągający niech będzie nawet te 500R ale jak mówiłem mi spokojnie działało z 1K i wtedy zobaczył efekty

    po drugie czy w programie korzystasz z jakichś przerwań np Timera czy innych ???? i masz tam jakieś procedury obsługi tych przerwań?

    jeśli tak? - to obsługa 1wire u ciebie może być skutecznie zakłócana przez takie przerwania - i aby się przed tym zabezpieczyć - trzeba by było skorzystać z poleceń wyłączania i załączania przerwań przed i po serii rozkazwó 1wire

    kolejna rzecz to koniecznie sprawdzać sumy kontrolne po odczycie a przed wyświetlaniem temperatur czy też przed ich odczytem jeśli są używane do sterowania czegokolwiek

    Dodano po 2 [minuty]:

    aaa - a na zakończenie - nie traktuj mojej poprzedniej wypowiedzi jakbym chciał ci w czymkolwiek dogryźć bo to nie jest moim celem - tylko zawsze mi się włosy jeżą na głowie jak ktoś tak zadaje pytania uważając że nic nie jest ważne. Teraz przy tak przedstawionym temacie to jest o czym podyskutować
  • #10 7057603
    Madergames9
    Poziom 15  
    Więc podyskutujmy. :D może coś z tego wyniknie..
    Na początek to gwoli ścisłości. Sterowanie magistralą 1wire zaczynałem od gotowca. Już nie pamietam kiedy, ale był to kit z AVR na osiem czujników temperatury i działało mi to ale na ograniczonej długości tej magistrali co mam no może jakieś 15 metrów. Musiałem odłączać dalszą część kabelków bo innaczej kicha. Dlatego zabrałem się za to sam i efekty są, ale musiałem zejść do tych 500om. "mirekk36" chyba nie doczytałeś tego co na początku napisałem. Generalnie magistrala działa. Termometry AT32 oczytuje prawidłowo, a są rozmieszczone co jakiś kawałek na niej. Reasumując Adresy wywołania i odczytu do termometrów docierają prawidłowo, konwersja prawidłowa i tutaj działa tranzystor. Jest jeszcze jedna sprawa, że komenda

    1wirecount()

    zwraca prawidłową ich ilość tzn obecność na magistrali. Jak napisałem problem jest z zał/wył przełączników a one nie potrzebują podciągnięcia tranzystora więc po prostu on jest otwart cały czas. Jak wiesz zał/ wył polega na wysyłaniu rozkazu do niego. Skoro dociera prawidłowo do termometrów to ki czort że nie dociera do przełączników chociaż jest jeden który reaguje na początku i na końcu magistrali. Może faktycznie wylutuję ten tranzystor, może on ma jakiegoś fiksa sprawdzę to no i włączę JTAG jako sprawdzenie czy nie wpływa to na wydajność prądową portu kto wie..?. Przerwania mam wyłączone timera też nie używam. AGND jest zmostkowane z GND zworką na dalszej planszy. Jest ona tak do prób, jak trafi układ na miejsce AGND pojdzie prosto z zasilacza i spotka się dopiero tam z GND. Wygląda, że trzeba porobić parę eksperymentów wyniki opiszę w najbliższym czasie. Jak miałbyś jeszcze jakieś pomysły to napisz. Tak w sumie sobie myślę czy można zastosować podciągnięcia rezystorem 4,7k bezpośrednio przy układach, może to poprawi działanie układu.? Co o tym sądzisz..? i koledzy..?

    Dodano po 3 [minuty]:

    Ps:
    Obecnie w uP mam wsadzony ten pierwszy kod, więc jak widzisz jest golutki i dotyczy tylko przełączników, bo w końcu o nich mowa... heh :D
  • #11 7057681
    kwesoly
    Poziom 15  
    Po pierwsze wyłącz po prostu JTAGa i nie szukaj cudownych związków pomiędzy nim a "wydajnością prądowa portów". Nawet gdyby na nią jakoś tam minimalnie wpływał 500omów AVR bez problemu zewrze do masy (prąd wyniesie maks 10mA).

    Cytat:
    Tak w sumie sobie myślę czy można zastosować podciągnięcia rezystorem 4,7k

    Skoro masz do czego to podciągnąć to dlaczego nie przejść na 3 przewodowe zasilanie i problemy z rezystorem podciągającym z głowy?:) Albo przynajmniej sprawdzisz czy to nie jest problem z zasilaniem.

    Odnośnie pullupa za pomocą tranzystora - wiesz, że AVR mają wyjścia push-pull przez co do zasilania termometrów na czas konwersji wystarczyłoby ustawic port jako wyjscie w stanie logicznym 1??
  • #12 7057759
    Madergames9
    Poziom 15  
    No nie.. tzn wiedziałem, ale nie stosowałem do tego takiego rozwiązania. Sprawdzę opiszę.
    Właściwie to masz rację z zasileniem termometrów równiez. Ja jednak jeszcze trochę będę trwał przy skrętce.
    Ale koledzy proszę o jedno... my nie rozmawiamy o zasilaniu termometrów i o ich działaniu lub nie, lub o błędnych odczytach. Sprawa się toczy o przełączniki DS2407 które nie dizałają oprócz jednego na AT32 natomiast na AT168 działa wszystko. Ktokolwiek pojawi się w temaci mówi o DS18B20, a sprawa właściwie się ich nie tyczy, chyba że ktoś znajdzie jakiś związek.. . Reasumując DS18B20 działają prawidłowo bez dodatkowego zasilania, a DS2407 musi mieć zasilanie a właściwie układ wykonawczy, aby mógł go załączyć DS... prawda..?. Więc co miałoby zmienić zasilanie termometrów..? jedynie to, że niepotrzebny mógłby być tranzystor i rezystor... i tyle..
  • #13 7057762
    mirekk36
    Poziom 42  
    Madergames9 --> rzeczywiście w tym wszystkim może źle doczytałem ale już widzę, że twój problem dotyczy tylko tych przełączników a nie czujników temp. Ok - rzeczywiście do tego celu tranzystor chyba byłby przydatny - tym bardziej, że jednak masz na tej magistrali "parę" tych urządzeń

    zakładając - że żadne przerwania nie zakłócają ci transmisji po 1wire - to tak samo możesz sobie odpuścić szukanie problemu w jakiejś słabszej wydajności prądowej wyjść w ATmega32

    poza tym jeszcze raz wyjaśnię ci, że jeśli masz włączony fusami interfejs JTAG to niektóre piny portu C - w ogóle nie działają jako we/wy rozumiesz? służą wtedy tylko do celów podłączenia tego interfejsu a nie zwiększania czy zmniejszania wydajności prądowej.

    dlatego wyłączamy ten fusebit JTAG - aby przywrócić tym kilku pinom standardowe działanie jako zwykłe porty we/wy

    ..... ale rzeczywiście to też nie ma związku z tym, że jak piszesz część przełączników czy tam wszystkie działają na jednym procku a na innym nie

    .... ja bym na twoim miejscu może jeszcze raz (wiem że to może nudne) ale posprawdzał połączenia - a szczególnie z tą masą AGND którą zwierasz "jumperkiem" z normalną GND. Tym bardziej, że ze schematu wynika iż magistrala 1wire działa ci właśnie na porcie A

    jeszcze jedna rzecz - jaką wartość ma u ciebie ten rezystor przez który zasilasz AVCC w procku ??? może za dużą? skąd w ogóle ten rezystor??? powinno się jak już to zamiast tego rezystora dać tylko jakąś cewkę/dławik ok 10uH i już

    czy dokładnie tak samo masz rozwiązane to całe zasilanie w Atmega168?
  • #14 7057896
    Madergames9
    Poziom 15  
    Ehhh :D tak jak napisałem JTAG na AT 32 mam wyłączone na AT168 nie a jednak magistrala działa prawidłowo. Druga sprawa to taka, że przepiąłem wyjście na magistralę pod portc.3 tak samo jak na AT168 więc różnica w podłączeniu właściwie znikła. Powiem nawet tak, że po przełączeniu tego pinu na AT32 ilość odczytanych adresów i ilości za kazdym resetem pojawiała sie inna.. Dlatego "rzuciłem" się na forum szukając pomocy lub kierunku... No i temat JTAG-a powstał, bo jest on na porcie C a jest on wyłączony na AT32 a na AT168 nie.. Zasilanie AVCC jest podpięte bezpośrednio pod VCC uP
  • #15 7057950
    mirekk36
    Poziom 42  
    Madergames9 --> coś ty się tak uwziął na tego JTAG'a cały czas o nim mówisz. Cały czas wspominasz go albo tak:

    Madergames9 napisał:
    Ehhh :D tak jak napisałem JTAG na AT 32 mam wyłączone na AT168 nie a jednak magistrala działa prawidłowo.


    albo tak:

    Madergames9 napisał:
    . Może faktycznie wylutuję ten tranzystor, może on ma jakiegoś fiksa sprawdzę to no i włączę JTAG jako sprawdzenie czy nie wpływa to na wydajność prądową portu kto wie..?.


    tymczasem procesor ATmega168 w ogóle nie posiada wyprowadzeń do JTAG i tego fusebita (bo tak mi się coś zdaje, że w głowie sobie coś wymyśliłeś że ma to wszystko u ciebie jakiś związek z tajemniczym JTAG'iem)


    Generalnie - wydaje mi się ale może się mylę - że skoro kod niby masz ten sam, a na m32 nawet za każdym razem odnajduje inną ilość urządzeń na magistrali 1wire to coś musi być nie tak z połączeniami i wcześniej czy później ale to odnajdziesz i skończy się na tym, że był albo jakiś zły lut, albo coś nie stykało itp
  • #16 7058489
    Madergames9
    Poziom 15  
    Dobra oki... rzuciłem się właśnie na datashet jednego i drugiego i fakt że w At168 tego nie wspominają. Albo cos mi sie po...ylo, albo zle odczytałem fusebits z odczytu w BascomAVR, Za dnia to sprawdze bo faktycznie sugerowałem sie tym a danymi aplikacji... Jednym słowem lekki bałagan wprowadziłem... mea kulpa.. sorki za tą część i chylę czoła...
  • #17 7058975
    Madergames9
    Poziom 15  
    Dobrze sprawdziłem i jak wcześniej napisałem moja pomyłka. Więc ta sprawa nie ma nic do znaczenia. Wylutowałem tranzystor i sprawa jest w dalszym ciągu taka sama. Posprawdzam jeszcze połączenia na płytce pod lupą.... Może ktoś z kolegów ma jeszcze jakies dobre pomysły w którym kierunku uderzyć...?

    Dodano po 4 [minuty]:

    Jeszcze jedno pytanie które mi się nasuwa. AT32 chodzi mi na kwarcu 16Mhz a AT168 na 8Mhz ma to jakiś wpływ co do prędkości i możliwości jakichś przekłamań..?
  • #18 7059086
    mirekk36
    Poziom 42  
    to , że procek działa na szybszym kwarcu może wpłynąć tylko korzystnie w takim układzie. Przecież masz deklarację kwarca 16MHz w programie więc kompilator wszystko kompiluje zgodnie z tą dyrektywą....

    czyli jak dobrze rozumiem to już na tym czysto wstępnym etapie programu

    Cls 
    
    W = 1wirecount() 
    
    Cls 
    Lcd "Ile =" ; W ; "szt" 
    Wait 2 


    pojawiają ci się różne wyniki gdy działasz na swoim ATmega32 ?

    czy dokładnie taki sam kawałek kodu (ale dokładnie taki sam kawałek) uruchomiony na Atmega168 działa poprawnie - za każdym razem???? a po przełączeniu na m32 co jakiś czas daje błędne wyniki???
  • #19 7059288
    Madergames9
    Poziom 15  
    Miałem wczoraj sterownik podłaczony gdzie indziej i być może tam coś na szybko mogłem poknocić. Teraz wraz z laptopkiem mam bliżej i pod ręką w pobliżu stacjonarnego. Sprawa wygląda tak, że odczytuje właściwą ilość podłaczonych układów. Wzbogaciłem kod o odczyt konktetnych odczytanych adresów i to działa. Na ten odczytany adres wysyłam adres, aby czujnik zmienił stan i dalej działa mi tylko jeden. W tym samym miejscu mogę przepiąc pod stary sterownik i wszystko śmiga jak trzeba. Więc wydaje mi się, że problem jest z wysłaniem, lub odbiorem adresu przez te kostki. Doczytałem się w książce Pana Góreckiego, że jakiś wpływ może mieć szybkość transmisji, ale ja z tego nic nie kapuję. Nie wiem jak to można zmienić w programie. Pisze w niej ".. maksymalna prędkość magistrali 1wire to nieco ponad 16 kilobitów na sekundę.." jak to się ma do kwarcu 16Mhz .?
  • #20 7059607
    mirekk36
    Poziom 42  
    Madergames9 napisał:
    Doczytałem się w książce Pana Góreckiego, że jakiś wpływ może mieć szybkość transmisji, ale ja z tego nic nie kapuję. Nie wiem jak to można zmienić w programie. Pisze w niej ".. maksymalna prędkość magistrali 1wire to nieco ponad 16 kilobitów na sekundę.." jak to się ma do kwarcu 16Mhz .?


    znowu doszukujesz się problemu nie tam gdzie trzeba - odpowiedź na to pytanie brzmi:

    "nijak to się nie ma do kwarcu 16MHz"

    toż Bascom kompilując kod w tym procedury obsługi 1wire gdzie trzeba dobrać odpowiednie parametry opóźnień czasowych generuje ich długości na podstawie twojej dyrektywy o kwarcu jaki posiadasz. Więc obojetne jaki kwarc zastosujesz to i tak zawsze kompilator dopilnuje (bo musi) aby za każdym razem zapewnić odpowiednie czasy dla odczytu i zapisu slotów 1wire - eeeeh więc nie kręć w tę stronę - lepiej zapoznaj się z podstawami transmisji 1wire - spróbuj to kiedyś sam oprogramować w asemblerze albo w języku C - to wtedy nie będziesz sobie stawiał takich pytań


    .............. ja nadal uważam, że coś do końca nie chcesz potwierdzić lub zaprzeczyć na moje wyraźne pytanie które ci wcześniej zadałem????

    powtórzę jeszcze raz:

    - czy ten sam - ale dokładnie ten sam fragment twojego kodu tylko do odczytu ilości urządzeń na magistrali - działa tak samo na każdym z tych procków????? czy ty już nie zadajesz sobie trudu aby na chwilę przeprogramować procka m168 oraz m32 tym samym fragmentem i zobaczyć na wyświetlaczu LCD czy daje te same rezultaty?????

    podejrzewam, że na m32 masz napisany być może mocno zmieniony kod - poza wiadomo dyrektywami koniecznymi dla procka - a na m168 masz niezmieniony stary wsad i nie chce ci się przetestować tego wszystkiego w takich samych warunkach - jeśli chodzi o program

    tylko sztywno się trzymasz tego - że: "stary strownik mi działa" - a na m32 wpisując kod który pokazałeś zchowuje się to inaczej

    (chyba że się mylę .... ale tak to jest jak zadaje ci się pytanie a ty w zasadzie nie odpowiadasz na nie tylko znowu inna teoria.... oczywiście rozumiem, że nie chce ci się - czy też nie masz ochoty przeprogramować na chwilę m168 - no ale to można o tym jasno napisać i już)

    Dodano po 5 [minuty]:

    a problem uważam że jest jakiś banalny i wkrótce wyjdzie jak szydło z worka. Sam ostatnio używam m168 a wcześniej mój ulubiony procek do wszystkiego to był zwykle m32. Zarówno na jedym i na drugim robiłem magistralę 1wire i nigdy nie było żadnych problemów. Z tym, że na m32 to dosyć już dawno robiłem w Bascomie - a ostatnio wszystko piszę sam w C
  • #21 7060341
    Madergames9
    Poziom 15  
    mirekk..
    Sorki, że na to nie odpisałe, ale już spieszę z odpowiedzią. Program który chodzi na AT168 (działający) został przeniesiony na AT32 z uwzględnieniem różnic uP. Jednak dla samego sprawdzenia jak mogles zauważyc w jednej z odpowiedzi powyzej został okrojony do minimum potrzebnego do sprawdzenia samych przełączników. Sam chyba przyznasz, że mniej nie da się napisać, a więcej to rzecz zbędna. Mogę i przeładuje za chwilę ten mały programik na AT168 i zobaczę, czy na nim chodzi. Odezwę się za chwilę
  • #22 7060424
    mirekk36
    Poziom 42  
    Madergames9 napisał:
    Mogę i przeładuje za chwilę ten mały programik na AT168 i zobaczę, czy na nim chodzi. Odezwę się za chwilę


    no właśnie o to chodzi - ja bym tak próbował to testować - aby mieć w 100% te same warunki do porównywania. Sam chyba przyznasz - że tą drogą szybciej powinno dać się dojść co się tam u ciebie z tym dzieje

    - czekam więc na info - a problem rzeczywiście wydaje się coraz bardziej dziwny - zakładając - że w 100% sprawdziłeś połączenia na płytce z prockiem jak wspomniałeś wyżej
  • #23 7062488
    Madergames9
    Poziom 15  
    mirekk...
    Problem właściwie został rozwiązany. Głupio mi właściwie się przyznać do tego, ale to moja wina. Człowiek jak ma to w naturze, szuka przyczyny gdzie indziej. Prosta rzecz adresy urządzeń mam zapisane w zmiennych X z numerkiem (x) ha no i te numerki pomieszałem. Ale naprawdę jest Tobie wdzięczny za cierpliwość :D. Właściwie tak, aby może do końca pociągnąć temat z innej beczki to powiedz mi jak to jest. Teraz na samym rezystorze 500om bez tranzystora podciągającego (bo go wylutowałem) wszystko chodzi. Oczywiście cieszę się, że tak jest, ale jak możesz wytlumacz mi jak to się ma do 4,7k zalecanego..?. Mówię wlutuję coś powyżej 600om i kaput. Przypmnę ze mam skrętke UTP
  • #24 7062639
    mirekk36
    Poziom 42  
    Madergames9 --> dlatego mówiłem ci żeby sprawdzać małymi kroczkami te same fragmenty na jednym i drugim procku - i tak jak wspominałem - będziesz na końcu się śmiał - że przyczyna okaże się jakaś banalna - nie mająca nic wspólnego z wymianą procka

    ale ok - odnośnie rezystora podciągającego

    toż w nocie wszystko jest w zasadzie opisane. Zalecany jest rezystor 4,7K dla 3przewodowego połączenia ale również dla Parasite jeśli stosuje się tranzystor - tak jak miałeś.

    pytasz się dlaczego tak się dzieje, że ty musisz dawać rezystor tak mały - 500R

    być może dlatego (tego nie jestem niestety pewien) , że Bascom swoje procedury 1wire ma przystosowane tylko do obsługi 3przewodowej i nie podaje na zakończenie każdego z rozkazów aktywnego podciągania do VCC. Ja pisząc w C - robię to dla Parasite - jasno i wyraźnie - i dzięki temu działa mi to spokojnie z rezystorem 1K i bez tranzystora.

    Generalnie po to zmniejsza się wartość tego rezystora 4,7K aby można było wyeliminować tranzystor. Czasem przy króciutkiej magistrali - może pozostać nawet 4,7K przy nieco dłuższej można dać 3,3K - a przy długiej 1K (mniej nie potrzeba)

    skoro u ciebie działa to tylko z 500R - to chyba - może - też się nic nie stanie ;) .... ale jak wspominałem wyżej wynikać to może z braku przystosowania procedur 1wire w Bascomie dla trybu Parasite (ale zastrzegam , że to tylko moje domysły - a nie do końca sprawdzone informacje)
  • #25 7062796
    Madergames9
    Poziom 15  
    mirekk....
    Włąsciwie to co napisałeś powinno to wytłumaczyć ale....
    Trazystor właściwie wykorzystuje się do li i jedynie do konwersji temperatury do reszty ni czorta nie jest to potrzebne. Jest też wzmianka o podciąganiu tzw dynamicznym, ale tego nie stosowałem jeszcze, ale zamierzam sprawdzic. Do odczytu adresów poleceniami

    1wsearchfirst i ...next

    nie wykorzstują tranzystora i już. Tak samo się ma wysyłanie rozkazów do urządzeń. A teraz sytuacja jest taka, że bez tranzystora działa konwersja. Nie zmniejszałem czasu na konwersję i być może to dałoby jakąś sensowną odpowiedź. Chyba Ty sugerowałeś użycie wbudowanego w AVR pullup-a jako tranzystora, więc może w poleceniach 1wire BascomAVR ma to zaimplementowane..?. Zauważ, że skoro ani wyżej, ani niżej z opornikiem nie da się zejsc to chyba jest na to jakieś wytłumaczenie..?. Opornik powinien być taki, aby działała magistrala, a konwersja nie koniecznie, lub przekłamana i wtedy powinien wkraczać tranzystor. Jaki sens używania wyżyłowywania rezystora do 500om skoro poniżej transmisja pada wogóle..?. Może rzucić to w osobny temat, bo chyba w sumie wart rozgryzienia..? :D
  • #26 7062862
    mirekk36
    Poziom 42  
    Madergames9 --> nie gniewaj się, ale masz tak ogromną tendencję do potrójnego z poczwórnym saletem "przekomplikowania" sobie problemu w głowie, który dawno już został wyjaśniony, opisany , poparty przykładami i wszystkim co tylko można w nocie aplikacyjnej ;)

    na prawdę nie ma co odkrywać na nowo świata - trza tylko poczytać PDF'a

    ciężko mi to tłumaczyć w całości i od nowa ale dam ci tylko taką jedną podpowiedź/przykład - przemyśl to sobie:

    powiedziałeś, żetranzystor nie jest potrzebny do działania 1wire, że w ogóle silne podciąganie jest potrzebne tylko na czas konwersji dla czujników temperatury itp (przynajmniej to można wywnioskować z nieco jak zwykle twojej troszkę zakręconej teorii)

    tymczasem po pierwsze nadal nie wiesz - to widać - czym różni się tryb Parasite od połączenia 3-przewodowego (próbowałem to ci co nieco wyjaśnić ale to nic nie daje - hmmm może źle to robię - fakt - ale nota PDF na pewno nie kłamie i robi to wystarczająco)

    po drugie - weź sobie teraz do rozważań tryb Parasite - połączenie 2-przewodowe, gdzie zasilanie dla czujnika i sygnał masz na tej samej linii.

    i teraz: - dokonujesz konwersji/pomiaru temperatury - podtrzymujesz silne podciąganie czy to małym rezystorem czy to tranzystorem (obojętnie) po konwersji wg twojej nowej teorii - zdejmujesz podciąganie (no bo układ dokonał już konwersji)

    i po jakimś tam krótkim czasie znowu wysyłasz rozkaz ale do odczytu tej zmierzonej temperatury - a tu MEGA KLOPS! układ zwraca ci 85stC - i zgadnij dlaczego ????? (a dodam, że będzie to reakcja prawidłowa - dla utrudnienia lub ułatwienia - jak wolisz)

    jak do tego dojdziesz to zapewne od razu wiele rzeczy wyjaśni ci się odnośnie 1wire i już pozbędziesz się pomysłu na osobny temat badania "dziwnych przypadków"
  • #27 7064061
    Madergames9
    Poziom 15  
    mirekk...
    Teraz ja powiem bez obrazy ale...
    1. Z angielskim fakt jestem na bakier jednak obrazki oglądam i jakby co to wiem na czym polega różnica pomiędzy 2wire i 1wire przynajmniej na czym polega różnica w podłączeniu i sposobie ich zasilania

    2. W datasheet DS18B20 angielski jest, ale jak spojrzysz na stronę 6 są dwa rysunki i widać jak drut różnicę w sposobie podłączenia tego układu do magistrali 2 i 3 przewodowej. W przypadku magistrali 2 przewodowej są dwa rodzaje podciągnięcia zasilania pullup (rezystor) i strong pullup (tranzystor). Podpierasz się datasheet a obrazków nie oglądasz...?. To akurat każdy zrozumie.

    3. W cytowanej wcześniej przez mnie książce Pana Piotra Góreckiego "Mikrokontrolery dla początkujących" na stronie 327 pisze:
    "..Wszystko oczywiste: na czas konwersji temperatury, gdy kostka POTRZEBUJE WIĘCEJ PRĄDU, końcówka PD.6 pracująca jako wyjście zostaje ustawiona w stan wysoki i przez diodę D zasila linię danych (tzw. strong pullup )..."
    w moim przypadku jest to tranzystor i w datasheet widać go jak wół.

    4. Właściwie znalazłem odpowiedź na swoje wcześniejsze pytanie i w tejże samej książce na stronie dalej pisze:
    ".. Tymczasem my do współpracy z linią danych wykorzystujemy końcówkę PD.5, która przecież może być wyjściem o znacznej wydajności prądowej. I właśnie teraz okazało się, że BASCOM w czasie gdy łącze 1wire nie transmituje danych, ustawia końcówkę PD.5 jako wyjście w stanie wysokim i można z niej pobrać kilka do kilkunastu miliamperów prądu. O tym, że tak jest, możesz się przekonać mierząc napięcie na lini woltomierzem....'
    Więc odpowiedź mam, że BSCOM robi to automatycznie sam od siebie i tranzystor u mnie jest właściwie zbędny. Jednak w dalszym ciągu nie znam odpowiedzi dlaczego to taka niska wartość.

    mirekk... wygląda na to, że nie jestem, aż taki zamotany jak to opisujesz. Uzyskałem właściwie sam odpowiedź na zadane pytanie w poprzednim poscie. Nie jestem, aż takim laikiem na jakiego wyglądam, ale jeżeli odwołujesz się do danych aplikacyjnych to może rzetelnie najpierw popatrz na nią, bo czytać nawet nie trzeba, aby pewne rzeczy wiedzieć. Sam posiadam parę książek po polsku i sądziłem, że o oczywistych rzeczach nie rozmawia się pomiędzy dwoma osobami, które swoją wiedzę maja. Zapewne w ograniczonym stopniu, ale przecież o podstawach nie rozmawiamy...
    Jeżeli masz pomysł na to dlaczego muszę mieć taki niski opornik to poczytam, jeżeli nie to będę uważał za zamknięty..
  • #28 7064372
    mirekk36
    Poziom 42  
    oczywiście, że się nie obrażam ;) tak jak i nie chciałem nigdy ciebie obrazić - dyskusja to dyskusja....

    ... a skoro tak ślicznie wszystko sam sobie wyjaśniasz to zapewne niedługo dojdziesz dlaczego masz taki rezystor a nie inny. Tym bardziej, że przecież uważasz jak sam napisałeś:

    "o oczywistych rzeczach nie rozmawia się pomiędzy dwoma osobami, które swoją wiedzę maja"

    .... dodam tylko, że gdybym nie sprowokował rozmowy o rzeczach oczywistych, o kodzie a to o schemacie itp to nadal byś jeszcze siedział nad pomysłem, że z prockiem Atmega32 jest coś nie tak, nie wspomnę o JTAG'u itd

    może ktoś inny podejmie te trudne dyskusje z tobą - bo ja może nie nadążam czy jak .....

    tyle, że inni też coś się nie kwapią - przemyśl to sobie na przyszłość zanim zaczniesz zadawać kolejne pytania (i nie mówię tago złośliwie)

    pozdrawiam i życzę powodzenia
  • #29 7065319
    Madergames9
    Poziom 15  
    Skoro temat tejże rezystancji przewija się w temacie tzn że to nie jest rzecz oczywista. Oczywista była sprawa zasilenia oraz użycia skrętki UTP. Dyplomatycznie pomijasz fragmenty, które sam przytaczasz, a jednocześnie one wykazyją, że prawda nie jest tak oczywista. Angielskiego nie znam, przyznaję, i dla mnie twoja wypowiedź, że czytałeś jest wiarygodna, jednak podważanie sposobu zasilenia już taki nie jest. Pominąłeś to jednak.
    Wobec powyższego temat użycia takiej a nie innej rezystancji chyba jest tobie znany, chyba, że tylko potrafisz mówić ale tego wytłumqaczyć nie potrafisz.
    Za wcześniejsze rozmowy jestem wdzięczny i ukierunkowanie też.
    Jednak użycie swojej osoby która to zlitowała się nade mną był i jest chwytem poniżej pasa.
    Pomyliłeś się sam w temacie zasilania magistrali i to musisz chyba przyznać rację, a w sumie udowadniałeś coś innego prawda..?
    Więc może już nie rozwijajmy tych durnych tematów bo psują relację. Jak masz coś do napisania na temat użytej rezystancji, ewentualnie co tak diametralnie może na to wpływać to napisz. Innej polemiki już nie podejmuję, więc jak coś wiesz to napisz, a jak nie to zamknę temat.

    Pozdrawiam
REKLAMA