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

[AVR][C] - Obsługa I2C. Zegarek w oparciu o Atmega8 i DS1307

filus66 18 Lut 2013 12:13 2907 4
REKLAMA
  • #1 11950869
    filus66
    Poziom 10  
    Witajcie ;)
    W akcie desperacji postanowiłem zapytać na forum...;p

    A więc, sprawa wygląda tak. Dopiero od niedawna zacząłem swoją przygodę z mikrokontrolerami. Na dobry początek wyposażyłem się w książki panów M. Kardasia oraz T. Francuza.

    Chciałem zbudować zegarek w oparciu o Atmega8 i DS1307.
    Zajrzałem więc do odpowiednich rozdziałów. Naczytałem się o interfejsie TWI. Następnie chciałem zabrać się za dogadanie z DS'em.

    Tak więc potrzebowałem funkcji startu :)
    Korzystając z dobrodziejstwa pierwszej książki wykorzystałem
    
    I2C_Start(void)
    {
    	TWCR = (1<<TWINT ) | (1<<TWSTA) | (1<<TWEN);
    	while(!(TWCR&(1<<TWINT)));
    }
    

    I tutaj pojawił mi się pierwszy problem, którego nie mogę zrozumieć.
    Pierwsza linijka spoko, ustawiamy wszystkie potrzebne bity.
    Ale za to druga ;(
    Nie bardzo wiem, jak ugryźć ten temat.
    Jak czytać ten zapis? Od środka?
    Najpierw znowu ustawiam 1 na bicie TWINT rejestru TWCR, tyle, że tym razem za pomocą maski? Tak więc, chwile wcześniej ustawiłem tam 1, więc iloczyn logiczny da też 1. I na końcu negujemy cały rejestr. Czyli ostatecznie bity chwile wcześniej ustawione zostaną wyzerowane?
    (To by sie trochę zgadzało z tym co wyczytałem w książce Pana Francuza, że TWINT należy kasować programowo).
    Ale przecież pętla skończy się kiedy na wszystkich bitach będzie 1?
    Dobrze to rozumiem?

    Zdaje sobie sprawę, że pewnie jest to banalna sprawa, ale jakoś nie potrafiłem nigdzie znaleźć jasnej odpowiedzi.
  • REKLAMA
  • #2 11950892
    BlueDraco
    Specjalista - Mikrokontrolery
    W drugiej linijce nic nie ustawiasz. Zapis czytasz zgodnie z hierarchią nawiasów. Kręcisz się w pustej pętli tak długo, jak spełniony jest warunek, a warunek to "nieprawda, że ustawiony jest bit TWINT w rejestrze TWCR".

    Ciekawe, czy to działa - na pierwszy rzut oka wygląda podejrzanie, ale na szczęście nie pamiętam już nic z TWI w ATmega, więc poczekajmy na odpowiedź jakiegoś eksperta, który zna TWI w ATmega albo, ostatecznie, autora tego kodu.
  • REKLAMA
  • #3 11950904
    xamrex
    Poziom 28  
    filus66 gdybyś przeczytał DOKŁADNIE książkę Pana Kardasia, wiedizałbyś, że akurat tutaj KASOWANIE flagi odbywa się poprzez wpisanie "1"

    Dziwne, bo dziwne, ale tak to zostało rozwiązane.
    filus66 napisał:
    Ale przecież pętla skończy się kiedy na wszystkich bitach będzie 1?

    Zauważ, że przed pętlą jest !

    Dodano po 2 [minuty]:

    BlueDraco Działa to :)
    A autorem kodu jest sam Datasheet Atmegi :)
  • REKLAMA
  • #4 11952886
    dondu
    Moderator na urlopie...
    filus66 napisał:
    Najpierw znowu ustawiam 1 na bicie TWINT rejestru TWCR, tyle, że tym razem za pomocą maski? Tak więc, chwile wcześniej ustawiłem tam 1, więc iloczyn logiczny da też 1. I na końcu negujemy cały rejestr. Czyli ostatecznie bity chwile wcześniej ustawione zostaną wyzerowane?

    Nie wiem, czy dobrze zrozumiałem powyższy tekst, ale to jest tylko warunek i nie zmienia on nic w rejestrze TWCR.

    Poza tym zerknij tutaj: http://mikrokontrolery.blogspot.com/2011/04/P...VR-Zerowanie-bitu-przez-wpisanie-jedynki.html
  • #5 11970712
    filus66
    Poziom 10  
    Przepraszam, że dopiero po takim długom czasie odpisuje, ale wyjechałem i nie miałem dostępu do internetu.
    Temat został zrozumiany przeze mnie. Także dziękuję wszystkim zainteresowanych ;))

    Pozdrawiam
REKLAMA