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



Teraz jest 25 cze 2026, o 00:38


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 27 ] 
Autor Wiadomość
 Tytuł: I2C - problem
PostNapisane: 23 mar 2015, o 23:34 
Offline
Nowy

Dołączył(a): 20 mar 2015
Posty: 12
Pomógł: 0

Witam. Mam problem z uruchomieniem komunikacji z barometrem MPL3115A2. Oto mój kod:
Cytuj:
#ifndef F_CPU
#define F_CPU 1000000UL // NIGDY TEGO NIE ROBIMY W KODZIE PROGRAMU - mirekk36
#endif
[ widzę, że kolega jest nowy na tym forum - więc proszę pamiętać o tej uwadze na przyszłość ok? - mirekk36 ]

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


Problem polega na tym, że w miejscu: "while(!(TWCR & (1<<TWINT)));" kod nie wychodzi z pętli while. SDA i SCL podciągnąłem przez rezystory 4,7kOm do napięcia 3,3V. Proszę o pomoc



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 mar 2015, o 10:13 
Offline
Użytkownik

Dołączył(a): 18 kwi 2013
Posty: 183
Lokalizacja: Kraków
Pomógł: 30

Domyślam się , że działasz na procesorze ATmega32 - przynajmniej z nazw rejestrów można tak wróżyć. Ciekawe skąd wziąłeś tą inicjalizację TWI i jak wyliczyłeś nastawę prędkości interfejsu. Ale napewno brakuje w niej włączenia interfejsu TWI:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Zerowanie bitu TWIE w TWCR jest niepotrzebne, on i tak jest zerowany po resecie.
Dobrze by było żebyś napisał na czym to testujesz, jaki procek, gdzie co masz podłączone - bo w takim wydaniu to raczej wróżenie z fusów będzie jedynie możliwe a nie merytoryczna pomoc.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 mar 2015, o 17:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 16 lut 2014
Posty: 96
Lokalizacja: Łódź
Pomógł: 6

podobnie jest z bitami TWPS - też je zerujesz, choć wyzerowane ;)

------------------------ [ Dodano po: 1 minucie ]

podaj też taktowanie, bo nie wiadomo, z jaką prędkością zasuwa I2C



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 mar 2015, o 23:20 
Offline
Nowy

Dołączył(a): 20 mar 2015
Posty: 12
Pomógł: 0

Używam ATmegi8 , taktowanie 1MHz. Podłączyłem linie SDA i SCL z procesora do barometru oraz podciągnąłem przez rezystory 4,7kOm do napięcia 3,3V



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 mar 2015, o 10:09 
Offline
Użytkownik

Dołączył(a): 18 kwi 2013
Posty: 183
Lokalizacja: Kraków
Pomógł: 30

Z całym szacunkiem, ale na podstawie czego wnioskujesz, że program się zawiesza na na pętli while?
Właściwie to zapisujesz coś do rejestrów układu MPL3115, potem odczytujesz i gdzie niby ma być widoczny wynik tego odczytu? Bo w kodzie nie widać nigdzie obsługi jakiegoś wyświetlacza lub wysyłania przez UART. Poza tym chyba nie za dokładnie czytałeś notę PDF tego układu. Jest tam napisane, że wymaga on pewnej inicjalizacji w zależności od tego czy ma mierzyć wysokość npm. , czy ciśnienie, no i jeszcze trzeba go wprowadzić w stan aktywny ze zstanu stand-by.
Poniżej przykładowe procedury:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Podsumowując: najpierw musisz ustawić rejestry układu w odpowiedni tryb - albo pomiar wysokości , albo pomiar ciśnienia. Następnie wprowadzasz go w stan aktywny. Teraz dopiero możesz odczytywać zmierzone wartości i po odpowiednim przeliczeniu wysłać je gdzieś do odczytu czyli na wyświetlacz lub przez UART do terminala.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 mar 2015, o 20:54 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 16 lut 2014
Posty: 96
Lokalizacja: Łódź
Pomógł: 6

osip7 napisał(a):
Podłączyłem linie SDA i SCL z procesora do barometru oraz podciągnąłem przez rezystory 4,7kOm do napięcia 3,3V


A atmegę jakim napięciem zasilasz?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 mar 2015, o 22:59 
Offline
Nowy

Dołączył(a): 20 mar 2015
Posty: 12
Pomógł: 0

ATmegę zasilam napięciem 5V i używam stabilizatora 3,3V.

Dziękuję za pomoc, spróbuję to uruchomić i napiszę jak efekty.

Wniosek o tym, że program zapętla się wysnuwam na podstawie tego, że próbowałem włączać diodę wewnątrz funkcji start uruchomiając ją w funkcji main i przed pętlą normalnie się włączała, a za pętlą już nie.
A odczytać chciałem jeden rejestr 8 bitowy na diodach LED na porcie B, jednak faktycznie pominąłem tę część kodu pisząc tutaj post.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 mar 2015, o 23:16 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 16 lut 2014
Posty: 96
Lokalizacja: Łódź
Pomógł: 6

Pokaż połączenia (schemat, fotki lub jedno i drugie) bo Twoje pierwsze zdanie zabrzmiało interesująco :P



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 mar 2015, o 23:42 
Offline
Nowy

Dołączył(a): 20 mar 2015
Posty: 12
Pomógł: 0

Obrazek

Jakość jest jaka jest, ale mam nadzieję, że coś widać. Tak wyglądają podłączenia. A tak jak pisałem od góry do pinów podłączam 4 linie barometru - SDA, SCL, GND, VCC.

Które zdanie? ;)
Proszę o wyrozumiałość, to moja pierwsza próba z I2C.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 mar 2015, o 09:43 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 16 lut 2014
Posty: 96
Lokalizacja: Łódź
Pomógł: 6

Czyli układ barometru masz zasilany z 3,3V a atmegę z 5V.
Magistrala I2C atmegi operuje na napięciach 0-5V a barometru na 0-3,3V. O ile się nie mylę, to nawet z pull-upami do 3,3V nie można tak po prostu podłączyć jednego standardu napięciowego do innego z uwagi na prądy wyrównujące. Trzeba zrobić konwersję napięć przy pomocy dwóch MOSFETów (jak na płytce atnel air).

Jeśli to Twoja pierwsza próba z I2C to na początek spróbuj się skomunikować z układem pięciowoltowym. Wyeliminujesz znaczną część problemu. Może komunikacja nawet od razu Ci wystartuje.

Wysłane z mojego GT-S7710



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 mar 2015, o 18:54 
Offline
Użytkownik

Dołączył(a): 18 kwi 2013
Posty: 183
Lokalizacja: Kraków
Pomógł: 30

No to jak podłączyłeś ten czujnik ciśnienia do procka zasilanego napięciem 5V , to niestety może już być po nim. A przecież ATmega8 może być zasilana niższym napięciem i wtedy konwersja nie była by potrzebna.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 kwi 2015, o 01:10 
Offline
Nowy

Dołączył(a): 20 mar 2015
Posty: 12
Pomógł: 0

Starałem się uważać i zawsze sprawdzałem multimetrem napięcie.
Napisałem teraz taki kod, lecz dalej komunikacja nie chce wystartować.
Moim celem jest po prostu cokolwiek odczytytać, więc ustawiam BarometrMode, a następnie na diodkach na porcie D chcę wyświetlić wynik. Komunikacja jednak wciąż nie działa

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 kwi 2015, o 08:08 
Offline
Użytkownik

Dołączył(a): 18 kwi 2013
Posty: 183
Lokalizacja: Kraków
Pomógł: 30

Widzę , że strasznie się tu zakałapućkałeś :-)
Po pierwsze dobrze by było widzieć schemat tego układu.
Co do samego kodu, to ciekaw jestem czy on się kompiluje bez ostrzeżeń.
Funkcję uint8_t TWI_read_register(uint8_t address, uint8_t reg) - zadeklarowałeś jako zwracającą wartość typu uint8_t. Natomiast w jej definicji nie masz nigdzie instrukcji return. Kompilator chyba zgłasza to jako błąd.
Ale nawet gdyby kod tej funkcji był poprawny, to i tak w swoim programie nie masz nigdzie przypisania wartości, którą ona zwraca.
Masz tylko wywołanie tej funkcji i gdzie niby ma być widoczny wynik?
Trzecia sprawa, to kolejność instrukcji w głównej pętli programu - main, która powinna wyglądać tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 kwi 2015, o 00:18 
Offline
Nowy

Dołączył(a): 20 mar 2015
Posty: 12
Pomógł: 0

Tak to teraz wygląda, lecz PORTD siedzi cicho :?
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 kwi 2015, o 06:35 
Offline
Użytkownik

Dołączył(a): 18 kwi 2013
Posty: 183
Lokalizacja: Kraków
Pomógł: 30

Pisałeś , że procesor zasilasz napięciem 5V. Masz zrobioną konwersję napięć na magistrali I2C?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 kwi 2015, o 21:01 
Offline
Nowy

Dołączył(a): 20 mar 2015
Posty: 12
Pomógł: 0

Obrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 kwi 2015, o 21:11 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 30 gru 2012
Posty: 188
Lokalizacja: Świnice Warckie woj. łódzkie
Pomógł: 12

osip7 napisał(a):
Obrazek



To jeśli dobrze widzę to atmega jest zasilana 5v a MPL3115A2 3.3v wiec moim zdaniem mogłeś usmażyć czujnik ... aby to zadziałało to albo całość zasilasz z 3.3v lub musisz zastosować konwersję napięć.

_________________
ATMEL-ICE+ATXmega256A3BU oraz dużo samozaparcia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 kwi 2015, o 23:22 
Offline
Nowy

Dołączył(a): 20 mar 2015
Posty: 12
Pomógł: 0

Nie do końca rozumiem. Atmega jest zasilana z 5V, ale używam stabilizatora i do czujnika dochodzi napięcie 3,3V



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 kwi 2015, o 23:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 30 gru 2012
Posty: 188
Lokalizacja: Świnice Warckie woj. łódzkie
Pomógł: 12

osip7 napisał(a):
Nie do końca rozumiem. Atmega jest zasilana z 5V, ale używam stabilizatora i do czujnika dochodzi napięcie 3,3V


Zasilanie to jedno a drugie to napięcia panujące na liniach i2c...
Ujmę to bardzo ogólnie .... w przypadku atmegi zasilanej z 5v to stan wysoki panujący na liniach I/O wynosi (powinien wynosić) 5v a w/g noty MPL3115A2 I/O Supply Voltage max 3.6v... nie twierdzę, iż na 100% padł czujnik ale w takich przypadkach należy zadbać o konwersję napięć lub zasilić całość z 3.3v a nie prosić się o kłopoty z tego wynikające...

ps. tak na szybko jeśli chodzi o konwersję napięć i co można zastosować http://botland.com.pl/moduly-rozszerzajace-raspberry-pi-2/1513-konwerter-poziomow-logicznych-33v-5v-i2c-uart-spi.html

_________________
ATMEL-ICE+ATXmega256A3BU oraz dużo samozaparcia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 kwi 2015, o 07:21 
Offline
Użytkownik

Dołączył(a): 18 kwi 2013
Posty: 183
Lokalizacja: Kraków
Pomógł: 30

No niestety Kolega lemurek ma rację, przy takim podłączeniu jak pokazałeś układ może się uszkodzić. Zrób porządną konwersje napięć albo zasil wszystko z 3,3V i wtedy się przekonasz.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 kwi 2015, o 08:04 
Offline
Użytkownik

Dołączył(a): 22 sty 2014
Posty: 1806
Zbananowany użytkownik

Pomógł: 168

osip7, weź że porządnie zrób tą konwersję napięć bo na razie to błądzisz jak ślepy w w opuszczonej kopalnii węgla kamiennego. Jak połączysz wszystko dobrze i pewnie, to wtedy się bierz za program. Tu masz schemat bardzo prostej konwersji poziomów logicznych:

https://www.sparkfun.com/products/12009

jest tam wszystko, schemat, pcb, opis.

Powodzenia.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 kwi 2015, o 21:46 
Offline
Nowy

Dołączył(a): 20 mar 2015
Posty: 12
Pomógł: 0

Dzięki wielkie za rady, nie wiedziałem(widocznie za mało szukałem) o tym. Zakupię takie urządzonko i będę dalej walczył ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 kwi 2015, o 23:58 
Offline
Nowy

Dołączył(a): 20 mar 2015
Posty: 12
Pomógł: 0

Zakupiłem to urządzenie : http://botland.com.pl/moduly-rozszerzaj ... t-spi.html
Oto mój schemat teraz.
Obrazek

Sprawdziłem teraz czy działa mój program. Poprzez zapalanie kontrolnej diodki wnioskuję, że wszystkie czynności się wykonują(program nie zapętla się), lecz PORTD wciąż wskazuje same zera. Macie pomysł w czym tkwi problem?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 kwi 2015, o 07:06 
Offline
Użytkownik

Dołączył(a): 22 sty 2014
Posty: 1806
Zbananowany użytkownik

Pomógł: 168

a SDA i SCL atmegi dp +5V podciągniete?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 kwi 2015, o 11:29 
Offline
Nowy

Dołączył(a): 20 mar 2015
Posty: 12
Pomógł: 0

Nie podciagalem. A powinienem? Rowniez przez rezystory 4,7k om?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 kwi 2015, o 11:39 
Offline
Moderator
Avatar użytkownika

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

osip7 napisał(a):
Nie podciagalem. A powinienem? Rowniez przez rezystory 4,7k om?

A może tak zajrzyj na schemat tego "urządzenia" które kupiłeś do konwersji hmmm? ... widzę że nie zaglądałeś

Bo za chwilę to zbudujesz wieżę ajfla z rezystorów na PCB. W ogóle zastanów się czy jest sens brać takie "urządzenie" ... skoro to tylko dwa tranzystory i 4 rezystory - a ty i tak sam sobie lutujesz tego typu rzeczy ....

_________________
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: 28 kwi 2015, o 17:29 
Offline
Użytkownik

Dołączył(a): 18 kwi 2013
Posty: 183
Lokalizacja: Kraków
Pomógł: 30

Czy TY masz Mirkowego blue booka? Jeśli tak to masz tam biblioteki do obsługi I2C. Na pewno masz błąd w funkcji void Read() - no bo skoro coś odczytujesz to chyba jest oczywiste, ze funkcja musi coś zwracać. Druga sprawa, to zachowanie funkcji gdy układ wysyła lub nie potwierdzenie czyli tzw sygnał ACK. Oczywiście błąd w tej funkcji pociaga za sobą błąd w funkcji uint8_t TWI_read_register(uint8_t address, uint8_t reg).
Trzecia sprawa to kolejność definiowania funkcji w programie. Musisz mieć zdefiniowane najpierw te najprostsze a potem dopiero bardziej złożone, w których korzystasz z tych pierwszych. Czy Tobie się to wogóle kompiluje bez błędów?
Patrząc na fotografię Twojego układu zastanawiam się też czy dobrze masz wlutowany układ MPL3115A2. Chodzi o wielkość pól lutowniczych w tym układzie i widoczne na płytce luty - większe od całego układu MPL3115A2.
Musisz się też niestety liczyć z możliwością uszkodzenia układu kiedy zasilałeś go z 5V.
Ale podstawa to poprawna obsługa magistrali I2C.



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: 27 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 3 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