Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Fibaro Fibaro
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[ATmega32][C] - Komunikacja dwóch czujników na I2C o różnych parametrach

doles 22 Sie 2012 19:55 8152 77
  • #61 22 Sie 2012 19:55
    doles
    Poziom 19  

    No nic, będę musiał przestudiować to i owo, zrobić programator na LPT, ale najpierw kupić wtyk itp. U mnie w mieście nawet elektronicznego nie ma. Mam do Ciebie pytanie, jeżeli procesor myka na oscylatorze RC i ma 1MHz, w takim razie powinno dać się połączyć z procesorem przecież, obawiam się że wina leży po stronie prędkości programatora w Atmel Studio 6 w wyniku braku mojej wiedzy. Ustawiałem maks czyli tam jest 1,8kHz chyba...a jest wyraźnie napisane - prędkość ISP musi być niższa niż 1/4 prędkości procesora, więc powinienem zmniejszyć prędkość...wtedy powinno się połączyć?

  • Fibaro
  • Pomocny post
    #62 22 Sie 2012 20:01
    mirekk36
    Poziom 42  

    zmniejsz prędkość na maxa i sprawdź - czy to czymś grozi ? ;) sprawdzenie odczytu ? - przecież nie chodzi o zapis. Uparłeś się na kocie AVR Studio to się pomęcz teraz żeby w nim dostać się do procka ;) .... (zaraz pewnie odezwą się obrońcy zwierząt, kotów i AVR Studio)...

    Ja się tylko trochę dziwię, że tak niechętnie chce ci się sprawdzić - chociaż na chwilę byle jaki inny program do komunikacji z użyciem nawet twojego stk500. A czy to zaraz będzie dla ciebie oznaczało zdradę AVR Studio o odcięcie się od niego ???? ;) chyba nie .... toż gdybyś sprawdził że w innym programie działa - to wiedziałbyś już na pewno że wystarczy coś jeszcze innego zmienić w AVR Studio i ruszy ;)..... Tym bardziej że rozumiem iż w twojej miejscowości nie ma nikogo kto np może pożyczyć ci inny programator. To jednak net masz pod ręką - a programów masz bez LIKU do sprawdzenia. Aż mi się nie chce nazw wymieniać.

  • #63 22 Sie 2012 20:48
    janbernat
    Poziom 38  

    Uruchom to z AVRStudio4, ustaw parametry zegara i sprawdź.

  • #64 22 Sie 2012 23:20
    doles
    Poziom 19  

    Już jestem, robiłem nową płytkę - tamta miała wadę estetyczną z gniazdem ISP. W AVR Studio zmniejszyłem prędkość ISP na 115kHz - programator połączył się z procesorem. Teraz pozostaje mi tylko ustawić fuse bit odnośnie zegara, za bardzo nie wiem czym są oznaczenia z tej listy w AVR Studio. Widzę, że jest kilka ustawień dla kwarcu od 8MHz w górę. Ustawiłem inne fuse bity wg. informacji (tutoriali) znalezionych w internecie.

  • Fibaro
  • #65 23 Sie 2012 10:11
    doles
    Poziom 19  

    Mam takie pytanie natury fuse bitów i odpalania procesora - ustawiłem sobie w razie czego fuse bity domyślne które przedstawione są w dokumentacji procesora. Fuse high na 0x99 a fuse low 0x46. Mam takie pytanie odnośnie zachowania procesora - czy mam to rozumieć jako upalenie czegoś w jego strukturze przez przelutowywanie albo przypadkowe zwarcie jaki mi się zdarzyło (przez przypadek zwarły mi się kabelki 5V i GND w wyniku bałaganu jaki panuje na biurku). W celu sprawdzenia w ogóle pinów dałem sobie proste

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Po wgraniu hexa port C szwankuje, tzn tylko 4 z 8 pinów mają stan niski - sygnalizuje diodą. Czy mam rozumieć to jako uszkodzenie ?

  • #66 23 Sie 2012 11:24
    LordBlick
    VIP Zasłużony dla elektroda

    doles napisał:
    Fuse high na 0x99 a fuse low 0x46.
    Nie są to ustawienia domyślne:
    [ATmega32][C] - Komunikacja dwóch czujników na I2C o różnych parametrach
    Domyślnie to tak :
    [ATmega32][C] - Komunikacja dwóch czujników na I2C o różnych parametrach
    Zrzuty ekranowe pochodzą z programu avrmate.

  • #67 23 Sie 2012 11:48
    doles
    Poziom 19  

    Ale to są dla ATmega32, a ja mam ATmega644PA i tak swoją drogą ATmega644 domyślnie pracuje na kwarcu wewnętrznym 8MHz a nie 1MHz - jeden jest dla ATmega32. Czytam datasheet obydwu. Pewnie spojrzałeś na procesor w temacie, ale temat się tak rozwinął i zasyfił a mowa była o obydwu procesorach, także ... powstał mętlik. Co jeśli chodzi o zachowanie portów ? Są to dokładnie piny:
    PC3(TCK), PC4(TMS), PC5(TDO), PC6(TDI)

    EDIT: wystarczyło doczytać, że te piny zarezerwowane są dla JTAGa, a że z niego nie korzystam po prostu je wyłączam. Dondu może warto by było abyś tę informację też umieścił w poradniku dla początkujących tak jak z ustawieniem prędkości ISP ?
    Mam jeszcze tylko duże problem z ustawieniem fuse bitów aby ATmega pracowała na kwarcu 20MHz, ATmega644 ma nieco inne ustawienia od ATmega32... nie wiem za bardzo co wybrać, bo przy żadnym ustawieniu dla kwarcu zewnętrznego mi nie działa, tzn sprawdzam sobie na prostej migającej diodzie

    Kod: c
    Zaloguj się, aby zobaczyć kod

    dyrektywa F_CPU=20000000 i próbuję ustawić tak fuse bity SKCEL aby dioda "mrugała" - będę wtedy wiedział, że oscylator jest ustawiony... Narazie mam na:

    [ATmega32][C] - Komunikacja dwóch czujników na I2C o różnych parametrach

  • Fibaro
  • Pomocny post
    #68 23 Sie 2012 13:31
    LordBlick
    VIP Zasłużony dla elektroda

    doles napisał:
    Ale to są dla ATmega32, a ja mam ATmega644PA
    Nie podawałeś efuse i to mnie zmyliło. Mimo wszystko 0x46 nie jest wartością domyślną dla lfuse...
    Patrząc na twoje ustawienia (przewidujesz bootloader i brak kasowania EEPROM podczas Chip Erase) i te 20MHz, proponuję tak:
    [ATmega32][C] - Komunikacja dwóch czujników na I2C o różnych parametrach

  • #69 23 Sie 2012 13:37
    doles
    Poziom 19  

    Zmieniłem tak jak proponujesz oraz w while(1) dałem tylko PORTC = 0x00; efektem jest szybkie miganie diody ? hm

    EDIT: zmieniłem na: high 0xD0 a low na 0xE7 i działa :) Dziękuję strasznie wszystkim za pomoc...teraz mogę dalej kombinować z czujnikiem światła - zabawa ze znalezieniem rezystorów na niższą częstotliwość I2C i napięcie 1,8V... w nocie katalogowej jest 560Ω dla tego czujnika SFH5712 ale to jest do prędkości 3,4Mbit.

  • #70 23 Sie 2012 23:41
    doles
    Poziom 19  

    Czytam dokumentacje magistrali I2C oraz różnych artykułów w internecie odnośnie I2C. Mam parę pytań - jeśli istnieje zależność, że im mniejsza rezystancja rezystorów podciągających do VDD tym większe prędkości transmisji (czasy narastania i opadania zboczy, mniejsze ? pojemności) w takim razie jeśli 560Ω przy 1,8V w czujniku przystosowane do transmisji 3,4Mbit/s, jeśli zwiększę rezystancję spowolnię prędkość magistrali. Ze specyfikacji I2C widzę, że dla niskich napięć i prędkości takim uniwersalnym rezystorem jest 4k7Ω, czy dobrze myślę?

    Dochodzi też inna kwestia która mnie nurtuje, jeśli czujnik ten będzie na przewodach o długości 50-80cm jak będzie wyglądać sprawa z filtracją zakłóceń na magistrali ? Rozumiem, że przewody dobrze ekranowane, nie byle szajs, ale czy podciąganie lini SDA i SCL kondensatorem do masy o wartościach pF ? Znów jeśli tak, problem pojemności lini magistrali, a przekroczyć ich nie mogę z tego co pamiętam 400pF ? To wartość typowa. Czujnik polutuję chyba tak, że będzie on sam na płytce dajmy na to 1x1cm + pady na przewody zasilania i danych, przewód o długości jakiej wspominałem do sterownika gdzie będzie dopiero konwerter logiczny itp. Co myślicie o takim rozwiązaniu ?

  • #71 24 Sie 2012 21:26
    atom1477
    Poziom 43  

    doles napisał:
    Czytam dokumentacje magistrali I2C oraz różnych artykułów w internecie odnośnie I2C. Mam parę pytań - jeśli istnieje zależność, że im mniejsza rezystancja rezystorów podciągających do VDD tym większe prędkości transmisji (czasy narastania i opadania zboczy, mniejsze ? pojemności) w takim razie jeśli 560Ω przy 1,8V w czujniku przystosowane do transmisji 3,4Mbit/s, jeśli zwiększę rezystancję spowolnię prędkość magistrali. Ze specyfikacji I2C widzę, że dla niskich napięć i prędkości takim uniwersalnym rezystorem jest 4k7Ω, czy dobrze myślę?

    Chm, nie bardzo.
    Pojemności wpływają na maksymalną możliwą do uzyskania częstotliwość, a nie bezpośrednio na częstotliwość.
    Czyli jeżeli układ pracuje na 3,4MHz, a Ty zwiększysz pojemności, to układ automatycznie nie przejdzie na niższą częstotliwość. Po prostu przestanie działać.
    Częstotliwość musisz zmniejszyć ręcznie.

    doles napisał:

    Dochodzi też inna kwestia która mnie nurtuje, jeśli czujnik ten będzie na przewodach o długości 50-80cm jak będzie wyglądać sprawa z filtracją zakłóceń na magistrali ? Rozumiem, że przewody dobrze ekranowane, nie byle szajs, ale czy podciąganie lini SDA i SCL kondensatorem do masy o wartościach pF ? Znów jeśli tak, problem pojemności lini magistrali, a przekroczyć ich nie mogę z tego co pamiętam 400pF ? To wartość typowa. Czujnik polutuję chyba tak, że będzie on sam na płytce dajmy na to 1x1cm + pady na przewody zasilania i danych, przewód o długości jakiej wspominałem do sterownika gdzie będzie dopiero konwerter logiczny itp. Co myślicie o takim rozwiązaniu ?

    Generalnie I2C nie jest przystosowane o pracy na większe odległości. Ale ludzie je do tego stosują i pare dobrych rozwiązań powstało. Ogólne wnioski są takie jak piszesz. Czyli kable ekranowane ale takie gdzie pojemności linii sygnałowych do masy są małe.

  • #72 24 Sie 2012 21:58
    doles
    Poziom 19  

    Tzn, rozumiem, że nie zgadasz się i poprawiłeś moje rozumowanie odnośnie pojemności w magistrali, a co odnośnie rezystancji ? Chodzi mi moje wstępne wnioski które wyciągnąłem po przeczytaniu paru rzeczy i przeanalizowaniu w skrócie wykresów z dokumentacji I2C. Co masz na myśli zmniejszyć częstotliwość ręcznie ?

  • #73 25 Sie 2012 11:34
    atom1477
    Poziom 43  

    No chodzi mi o to że zwiększenie rezystancji zmniejszy maksymalną częstotliwość pracy*.
    Np. z 5MHz do 2MHz.
    Ale jak układ pracował na 3,4MHz, to automatycznie nie przejdzie na 2MHz.
    Musisz to zrobić ręcznie, czyli w programie w procesorze zmienić częstotliwość z 3,4MHz na 2MHz. Nie wiem jak to Ci dokładniej wyjaśnić :D

    *tzn. zwiększenie rezystancji przy niezmiennej pojemności. Bo te rzeczy obydwie na raz decydują o maksymalnej częstotliwości. Np. jak zwiększysz rezystancję 2 razy i jednocześnie zmniejszysz pojemności 2 razy, to maksymalna częstotliwość się nie zmieni.

  • #74 25 Sie 2012 16:35
    LordBlick
    VIP Zasłużony dla elektroda

    atom1477 napisał:
    Musisz to zrobić ręcznie,
    No może raczej chodzi o zmiany w kodzie i to możesz zrobić tym, czym preferujesz obsługiwać klawiaturę lub inne urządzenie do wprowadzania/zmiany kodu... ;)

  • #75 26 Wrz 2012 19:54
    doles
    Poziom 19  

    Dawno nie zajmowałem się czujnikiem ale znów wracam do niego...wlutowałem na kablach dwa potencjometry podciągające magistralę - zasilanie ATmegi 1,8V i tyle samo na magistrali, bez konwertera. Ustawiłem narazie na potencjometrach około 4,7k i nic, nie da się połączyć z czujnikiem. Zastanawiam się czy da się w ogóle na 1,8V uzyskać niskie transmisje I2C, bo skoro rezystor podciągający determinuje napięcie a rezystor pośrednio na pojemność i dalej częstotliwość no to chcąc nie chcąc wg. takiej teorii do 1,8V będzie około 500-600Ω czyli automatycznie uzyskamy wysoką częstotliwość...Ten czujnik mnie po prostu rozbraja już. Bez oscyloskopu to tutaj dużo nie zdziałam chyba. Kwarc ATmegi to 4MHz, więc wg. wzoru na częstotliwość I2C rejestr TWBR i bez preskalera ustawiłem na wartość 3 - teoretycznie 100kHz.

    PS: mam już totalny mętlik w głowie, czytając o I2C wynika z tego, że tryb standard to główni(i tylko?) napięcia 5V i do 100kHz...czyli 1,8V to napięcie tylko dla HS mode. Nic już nie wiem oO. To w końcu jak, można zrobić 1,8V i 100kHz rozumiane jako standard ?

    Dziś w pracy zmierzyłem prąd płynący przez czujnik - wynosi on 1,2uA -> czyli jest OK, lutowanie dobre i czujnik działa bo w datasheecie jest notka o tym, że czujnik w stanie stand-by mode pobiera max 2,5uA. Mam chociaż pewność, że nie jest on uszkodzony albo źle przylutowany.

  • #76 21 Lis 2012 18:57
    doles
    Poziom 19  

    Witam, po długim czasie znów odgrzebuję ten temat... i problem z czujnikiem, który zostawiłem na rzecz ważniejszych rzeczy. Sprawa wygląda tak. Totalnie nie mam już pojęcia co jest nie tak, próbowało mi na uczelni pomóc 2 doktorów i żaden nie miał pojęcia co się dzieje. W końcu zalecono mi wywalić owy czujnik SFH5712 który miałem i kupić coś bardziej sensownego. Promotor polecił mi czujnik TSL2561...Więc zakupiłem go, w piecu rozpływowym na uczelni przylutowałem i próbuję go odpalić. Efekt ? Ten sam problem co z poprzednim czujnikiem. Wrzucę może prymitywny kod i powiem co dalej.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Problem jest taki. Procesor "żyje" dopóki zakomentowana jest linijka TWI_Write(0x8C);. Jest to adres rejestru poleceń, wybór konwersji światła - odczyt całego słowa lub tylko bajtów. Gdy odkomentuję tę linijkę to procesor idzie po prostu w las. Specjalnie dałem potem migające diody, aby widzieć czy idzie w las czy nie. Wszystko jest OK, do momentu gdy mam tylko polecenie START i adres urządzenia. A potem koniec. Biblioteki są te same co wcześniej.
    Procesor ATmega644PA, zasilanie 3V ze stabilizatora MCP1825, chociaż tutaj też dziwactwa są -zamisat 3V na wyjściu mam 2,86V. W dodatku na lini SDA mam 2,86V a na lini SCL mam 0V. Totalnie nie mam już pojęcia ani pomysłów co jest nie tak. Wychodzę ze założenia, że jeśli dwie osoby z doktoratem nie potrafiły mi pomóc na uczelni to ja chyba nie mam większysz szans. Sama biblioteka do I2C jest wzięta z zestawu ewaluacyjnego pod ATmega32, ale te procesory chyba niczym się nie różnią prócz pamięci flash...Rejestry itp mają takie same. Nie wiem gdzie może być przyczyna oraz nie wiem czy jest sens próbować odpalić to dziadostwo z ATmega32 i konwerterem logicznym na dwóch tranzystorach BSS138. Rezystory podciągające na płytce mam 10k. Tak jak zalecane w datasheecie - 10k i zasilanie 3V. Pewną ciekawostkę powiedział mi promotor, że obudowy QFN6 czujników SFH5712 są bardzo słabe a urządzenia często wadliwe. Przytoczył mi przykład pewnej firmy która masowo zamawiała z OSRAMu te czujniki i masowo je wywalali bo okazywały się wadliwe i łatwo niszczące przy montażu - np spalenie podczas lutowania. Ten czujnik który mam też jest w tej obudowie... DFN to praktycznie to samo.

  • #77 27 Lis 2012 01:15
    doles
    Poziom 19  

    Dzisiaj sprawdziłem dokładnie magistralę I2C i biblioteki na 2 procesorach obsługując pamięć 24C64. Zarówno na ATmega32 jak i ATmega644PA wszystko działa poprawnie używając bibliotek które pokazywałem oraz dodatkowo wszystko działa z różnymi napięciami zasilania eepromu i procesora przy pomocy konwertera. Nie wiem gdzie teraz szukać przyczyny tego błędu.
    1. Biblioteka jest OK
    2. Konwerter jest OK
    3. Procesory oba sprawne - moduły I2C

    Uszkodzony czujnik przy lutowaniu ? Lutowany był w piecu i miał odpowiedni profil. Nie mam pojęcia dlaczego się tak zachowuje.

  • #78 28 Lis 2012 12:11
    doles
    Poziom 19  

    Witam, problem został rozwiązany. Powodem zawieszania się był zły adres urządzenia slave oraz niepoprawna procedura zapisu I2C. Temat do zamknięcia.

TME logo Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME
TME Logo