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



Teraz jest 27 gru 2025, o 15:48


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 22 ] 
Autor Wiadomość
PostNapisane: 28 paź 2015, o 19:04 
Offline
Nowy

Dołączył(a): 27 sie 2015
Posty: 23
Pomógł: 0

Witam,
Robię prosty test układu RTC DS1307 - na zasadzie, żeby tylko sprawdzić, nawiązać jakiekolwiek połączenie - wyświetlić np. tylko sekundy na terminalu (nwet niepoprawnie). Sam UART oczywiście działa (używam funkcji z noty katalogowej).

Kod może piękny nie jest (nie mam jeszcze nawet funkcji TWI_write_buf oraz TWI_read_buf) ale kompletnie nie o to chodzi. Chcę zrobić najprostszy na świecie, mały test.

Schemat taki jak tu: http://1.bp.blogspot.com/-CA8Ew1AhmH8/U ... 600/r1.jpg (mam gotowy modul). Linie SDA i SCL podciagniete do Vcc przez 4,7k. uC: Atmega328P.

Wiem (dzięki debugerowi jednodiodowemu), że program zawiesza się w funkcji TWI_read dokładnie po while(!(TWCR&(1<<TWINT)));. Bardzo proszę o jakieś wskazówki dlaczego tak może być i gdzie jest błąd w programie. Proszę o sprawdzenie poprawności inicjalizacji DS1307, bo tu podejrzewam może być coś źle.

(użyte funkcje jak w BB)

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.



Ostatnio edytowano 3 lis 2015, o 23:59 przez Zagatka, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 paź 2015, o 20:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Nie kontrolujesz statusów zwracanych przy kolejnych operacjach TWI, dlatego nie wiesz czy poprzednie działanie Ci nie zwróciło przypadkiem błędu. Po każdej operacji (odczekaniu na jej zakończenie przez while (!(TWCR & (1 << TWINT)));) masz w rejestrze TWSR status tej operacji.
Sprawdzaj czy masz odpowiednie statusy dla (TWSR & 0xF8):
- po poprawnym wysłaniu adresu do zapisu masz mieć 0x18
- po poprawnym wysłaniu danej masz mieć 0x28
- po poprawnym wysłaniu adresu dla odczytu masz mieć 0x40
- po poprawnym odczytaniu danej masz mieć 0x50 (lub jak nie wysyłałeś ACKa to 0x58)
Możesz jeszcze sprawdzać czy poprawnie wysłał Ci się start i ponowny start, ale to już przy jednym masterze jest nie potrzebne.

--
Pozdrawiam,
Robert


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 paź 2015, o 20:13 
Offline
Nowy

Dołączył(a): 27 sie 2015
Posty: 23
Pomógł: 0

Dzięki, biorę się za pisanie i zobaczymy co dalej :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 paź 2015, o 20:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Informacje o zwracanych statusach masz opisane w datasheetcie to Atmega328P (http://www.atmel.com/images/atmel-8271-8-bit-avr-microcontroller-atmega48a-48pa-88a-88pa-168a-168pa-328-328p_datasheet_complete.pdf) na stronie 218 (Status codes for Master Transmitter Mode) oraz na 221 (Status codes for Master Receiver Mode).

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 paź 2015, o 20:44 
Offline
Nowy

Dołączył(a): 27 sie 2015
Posty: 23
Pomógł: 0

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


ERROR(); to zapalenie się diody. Niestety już przy pierwszym odpaleniu programu dioda się zapala...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 paź 2015, o 20:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Brak ACKa (NACK) przy adresowaniu write powinno zwrócić Ci status 0x20. Jak ten status odczytujesz to szukaj błędu w podłączeniu / działaniu DS1307.
Sprawdź czy pewno masz poprawnie podpięty DS1307 do procka? Jak masz działający RS232 (a to napisałeś że tak) to tam możesz wyrzucać statusy operacji TWI.

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 paź 2015, o 21:12 
Offline
Nowy

Dołączył(a): 27 sie 2015
Posty: 23
Pomógł: 0

0x20 również nie odczytuje (ERROR się aktywuje) :(

Połączenia powinny być dobre, mam gotowy moduł z kwarcem, baterią itp. ma jedynie wyprowadzenia GND, 5V, SDA, SCL, SQW.
Mam podłączone do niego zasilanie oraz SDA - do SDA i SCL do SCL w procku. Sam procek też jest poprawnie podłączony (dioda działa, UART działa - jeśli wrzucę sobie do niego chociażby jakąś literkę/string).
Cały dzień dzisiaj się w to wgapiam i nic :( Funkcje TWI_start(), TWI_stop() itd. takie same jak w datasheecie / BB. Co mogę jeszcze sprawdzić?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 paź 2015, o 21:37 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Jak masz działający RS232 to wysyłaj na niego wartości statusów jakie masz po każdej operacji TWI (zaczynając od startu). Zobaczymy co według avr-a się dzieje na TWI i będzie można coś więcej powiedzieć. Bo na pewno coś jest nie tak :(
Czy po stronie DS-a masz poprawnie podłączony kwarc (i o dobrej wartości)?

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 paź 2015, o 10:01 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 gru 2013
Posty: 121
Pomógł: 16

Jeśli używasz biblioteki TWI Mirka z książki to zwróć uwagę na stronie Mirka jest errata do tej biblioteki. Bez uwzględnienia erraty nie zagadasz poprawnie z DS1307 bo TWI się będzie właśnie wieszał :)

_________________
http://strefapic.blogspot.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 paź 2015, o 12:14 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Ale błąd był w funkcji TWI_Stop http://www.atnel.pl/i2c_twi_lib_stop_error.html, a kolega jeszcze nie doszedł do tego, bo wiesza mu się na pierwszym TWI_Read
Kod:
odczyt.sek = TWI_read(1);
//Tu się zawiesza!
odczyt.min = TWI_read(1);


--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 paź 2015, o 16:06 
Offline
Nowy

Dołączył(a): 27 sie 2015
Posty: 23
Pomógł: 0

TWI_stop mam poprawne.

ok, napisałam na szybko taką funkcję:

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


Oto wyniki (wstawiając tą funkcję po kolei po każdym z tych poleceń):

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


Obrazek

Co ciekawe - jednak "NOT ACK has been received", nie wiem czemu wcześniej przy ERROR mi tego nie wyświetlało...

0x?8 to jest 0xF8 (kwestia przeliczania na ASCII...) czyli "No relevant state information
available; TWINT = “0” ". No TWDR action.

Czyli jakieś błędy w połączeniach? Kwarc mam przylutowany przez producenta modułu (kwarc 32.768khz)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 paź 2015, o 18:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Status 0x20 na adresowanie oznacza, że nie ma odpowiedzi na i2c (TWI) ze slave.
Masz może jakiś inny układ mający i2c? Podłączając go możesz szybko potwierdzić że na pewno jest to problem z DS1307.

Jak nie masz to proponuję od początku sprawdzić czy na pewno jest wszystko ok pod względem podłączenia.
Czy rezystory podciągające były już na płytce czy ty dawałeś? Nie pomyliłeś ze sobą linii SDA z SCL?

Najlepiej zrób schemat typu "spis z natury" nie sugerując się tym co powinno być tylko jak jest i wstaw go tutaj (nie opisuj nazwami pinów i przy robieniu schematu nie sprawdzaj jak powinno być, tylko daj ich fizyczne numery by się niczym nie sugerować). Schemat zrób na zwykłej kartce i wstaw zdjęcie.

W zamianie na hexa aby wyświetlać cały zakres poprawnie musisz jeszcze sprawdzić czy przekroczyłeś 9 i wtedy dodać zamiast 48 to 55, np. na szybko
Kod:
USART_transmit((status >> 4)>9?(status >> 4)+55:(status >> 4)+48));
USART_transmit((status & 0x0f)>9?(status & 0x0f)+55:(status & 0x0f)+48);


--
Pozdrawiam,
Robert

PS. Sprawdź czy na pewno masz ten tytułowy układ, bo może to jest jakaś inna wersja z innym adresem ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 paź 2015, o 22:32 
Offline
Nowy

Dołączył(a): 27 sie 2015
Posty: 23
Pomógł: 0

Nowe wieści: udało mi się pożyczyć Arduino Leonardo. Moduł RTC podłączony został następująco: SCL oraz SDA do pinów SCL i SDA na Arduino, GND do GND na Arduino i 5V do 5V do Arduino (czyli tak samo jak do Atmegi - w Atmedze był podłączona odpowiednio do PC4 i PC5). Biblioteka do Arduino: DS1307RTC. Następuje poprawna komunikacja, odczyt i zapis danych do RTC.

Już nic nie wiem z tego wszystkiego :roll: . Jutro trzeba na spokojnie usiąść i to przeanalizować...

Cytuj:
W zamianie na hexa aby wyświetlać cały zakres poprawnie musisz jeszcze sprawdzić czy przekroczyłeś 9 i wtedy dodać zamiast 48 to 55, np. na szybko


Dzięki, przydatne. ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 paź 2015, o 16:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Twój program w wersji działającej (sprawdzone :)) po połączeniu kodu w jeden plik i wykorzystywaniu bibliotek Mirka wygląda następująco (jak nie będzie Ci działał w takiej wersji to szukaj problemu tylko w sprzęcie):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 paź 2015, o 18:52 
Offline
Użytkownik

Dołączył(a): 17 paź 2015
Posty: 59
Lokalizacja: Gdynia
Pomógł: 1

rskup napisał(a):
Jak nie masz to proponuję od początku sprawdzić czy na pewno jest wszystko ok pod względem podłączenia.
Czy rezystory podciągające były już na płytce czy ty dawałeś? Nie pomyliłeś ze sobą linii SDA z SCL?

Najlepiej zrób schemat typu "spis z natury" nie sugerując się tym co powinno być tylko jak jest i wstaw go tutaj (nie opisuj nazwami pinów i przy robieniu schematu nie sprawdzaj jak powinno być, tylko daj ich fizyczne numery by się niczym nie sugerować). Schemat zrób na zwykłej kartce i wstaw zdjęcie.
Jak nie masz to proponuję od początku sprawdzić czy na pewno jest wszystko ok pod względem podłączenia.


spróbuj tak jak kolega napisał ja się kiedyś męczyłem bo rezystory podciągające miały jakąś przerwę.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 paź 2015, o 21:19 
Offline
Nowy

Dołączył(a): 27 sie 2015
Posty: 23
Pomógł: 0

rskup - nie działa :( A mam wszystko to samo tylko zamiast
Kod:
TWI_read_buf(208, 0, 7, (uint8_t *)&odczyt);
osobno wczytywanie po kolei

Rezystory są na płytce.
Na Arduino wszystko śmiga (gdzie ktoś mądry za mnie wszystko napisał :P) - udało się zmienić czas, wyświetlają się ładnie godziny w terminalu oraz komunikaty o poprawności komunikacji.
Więc wydaje mi się, że w programie coś mieszam.

Wogóle nie ogarniam, bo dziś np. w funkcji Start po
Kod:
TWCR = (1<<TWINT) | (1<<TWSTA)| (1<<TWEN);

jest status 0xF8 ... A jeszcze wczoraj było 0x08. Hehe. Oprócz tego program nigdy nie wychodzi z while(!(TWCR&(1<<TWINT))); w funkcji Start.


Ale ogólnie pomijając to wszystko mam jeszcze kilka pytań. Proszę o zweryfikowanie poprawności tych stwierdzeń:
1) Jeśli mam taktowanie 8MHz, to zamiast funkcji i2cSetBitrate(100); mogę napisać poprostu (zgodnie ze wzorem z noty katalogowej) TWBR = 32; (preskaler jest domyślnie po resecie ustawiony na 1).
2) Chodzi podawanie adresu slave'a do zapisu/odczytu ( TWI_write(208); / TWI_write(209);). W TWI "format danych" jest 9 bitowy (z tego ostatni bit ACK/NACK). A 208 / 209 to 7-bitowy adres. Czy nie powinno się podawać zamiast tego 0b11010000 / 0b11010001 (8 bitów zamiast 7)? (Żeby nie było: na oba sposoby mi nie działa)
3) Inicjalizacja DS1307 - rskup, we wklejonym przez Ciebie kodzie nie ma "nic na ten temat". A w nocie DS'a piszą, żeby ustawić bit CH=0 (co miało niby być w mojej funkcji DS1307_init() ). Szukam w kodach tych bibliotek Arduino, ale oni też tam tego nie robią ...

Btw. serdeczne dzięki za zainteresowanie i za pomoc :!:



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 paź 2015, o 21:36 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Mój kod nie był pisany / sprawdzany na DS1307 tylko dla DS3231, więc nie ma tam dodatkowej inicjalizacji. Ale bez zmiany (wykasowania) bitu CH, odczyt i zapis będzie Ci działał, a tylko czas nie będzie płynął :).

Co do TWI_read_buf, to we wklejonej wersji programu jest warunkowe kompilowane i jak jest zdefiniowany DEBUG, to program nie korzysta on z funkcji TWI_read_buf tylko z cząstkowych funkcji TWI.

Status 0xF8 jest zwracany gdy nie jest są wykonywane żadne operacje na TWI.

Tak poprawna jest wartość TWBR = 32 przy 8MHz, gdy szyna TWI ma pracować z 100kHz.

Czy zasilasz układ z 5V czy 3.3V? Bo DS1307 jest 5V only.

Edit:
TWI / I2C jest szyną z przysyłającą w czasie wymiany jednego bajtu 9 bitów, z czego 8 bitów idzie w jedną stronę a na ostatnim dziewiątym jest potwierdzenia ACK (lub go nie ma).
Jak adresujesz to wysyłasz także daną 8 bitową z czego najmłodszy bit to znacznik czy to jest adresowanie do zapisu czy odczytu. U Ciebie to są adresy:
- zapis = 208 = 0xD0 = 0b11010000
- odczyt = 209 = 0xD1 = 0b11010001
Mimo, iż wiadomo o tym że adres do odczytu ma być o 1 większy niż do zapisu, to często jest on także podawany w datasheetach.
Ja w swoich funkcjach mam zawsze podawanie adresu podstawowego (do zapisu) a przy adresowaniu odczytu ustawiam dodatkowo najmłodszy bit (addr | 0x01).

Bit CH kasujesz jak wpisujesz czas, bo to jest bit w rejestrze sekund. Więc albo masz poprawny czas, bo jest podtrzymanie baterią i masz skasowany bit i działający oscylator, albo musisz wpisać poprawny czas co automatycznie wyzeruje Ci bit CH :D.

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 lis 2015, o 23:49 
Offline
Nowy

Dołączył(a): 27 sie 2015
Posty: 23
Pomógł: 0

Dalej nic.
Zasilam z 5V.

Jedyne połączenia:
GND - do GND
5V - do Vcc
SCL - do PC5
SDA - do PC4

Sprawdzone omomierzem przy odłączonym zasilaniu jest 4,7k pomiędzy SCL a Vcc oraz SDA a Vcc.

Po sekwencji startu status: 0xF8. Czyli to by sygnalizowało problemy ze sprzętem. Ale z drugiej strony na Arduino działa. Chyba się poddaję z tym modułem.

Źle wstawiony obrazek - Różowo-Zielony J.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 lis 2015, o 09:39 
Offline
Nowy

Dołączył(a): 27 sie 2015
Posty: 23
Pomógł: 0

Błagam, niech mi ktoś wyjaśni, dlaczego BEZ ŻADNYCH ZMIAN z kodzie i połączeniach zaczęło to działać!!! Co mogło być tego przyczyną ?! Stykówka?

Obrazek

Bo teraz boję się, że tak jak nagle zaczeło działać, tak nagle może przestać...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 lis 2015, o 10:49 
Offline
Użytkownik

Dołączył(a): 20 lip 2015
Posty: 83
Pomógł: 6

Zagatka napisał(a):
Stykówka?



Niestety w 99,9% to jest przyczyna Twojego problemu... Sam posiadam stykówkę marnej jakości z chin i czasami lubi płatać figle....



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 lis 2015, o 18:01 
Offline
Nowy

Dołączył(a): 27 sie 2015
Posty: 23
Pomógł: 0

Czyli co, za każdym razem nawet do prostych testów mam wytrawiać płytkę? xD...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 lis 2015, o 19:31 
Offline
Użytkownik

Dołączył(a): 04 paź 2011
Posty: 8626
Pomógł: 338

Zagatka napisał(a):
Czyli co, za każdym razem nawet do prostych testów mam wytrawiać płytkę? xD...


nie wystarczy sobie z robić testową z np tzw płytki sitko ... czyli wiercona universalna

Obrazek

albo zaopatrzyć się w gotowe moduły łączone przewodami , lub najlepsze rozwiązanie
zakupić zestaw testowy , np ATB 1.4

https://www.sklep.atnel.pl/pl/p/Zestaw- ... VR-LIBRA/2

oszczędzisz sobie nerwów i siwych włosów :)



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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