Skocz do zawartości

Przeszukaj forum

Pokazywanie wyników dla tagów 'DS1307'.

  • Szukaj wg tagów

    Wpisz tagi, oddzielając przecinkami.
  • Szukaj wg autora

Typ zawartości


Kategorie forum

  • Elektronika i programowanie
    • Elektronika
    • Arduino i ESP
    • Mikrokontrolery
    • Raspberry Pi
    • Inne komputery jednopłytkowe
    • Układy programowalne
    • Programowanie
    • Zasilanie
  • Artykuły, projekty, DIY
    • Artykuły redakcji (blog)
    • Artykuły użytkowników
    • Projekty - DIY
    • Projekty - DIY roboty
    • Projekty - DIY (mini)
    • Projekty - DIY (początkujący)
    • Projekty - DIY w budowie (worklogi)
    • Wiadomości
  • Pozostałe
    • Oprogramowanie CAD
    • Druk 3D
    • Napędy
    • Mechanika
    • Zawody/Konkursy/Wydarzenia
    • Sprzedam/Kupię/Zamienię/Praca
    • Inne
  • Ogólne
    • Ogłoszenia organizacyjne
    • Dyskusje o FORBOT.pl
    • Na luzie

Kategorie

  • Quizy o elektronice
  • Quizy do kursu elektroniki I
  • Quizy do kursu elektroniki II
  • Quizy do kursów Arduino
  • Quizy do kursu STM32L4
  • Quizy do pozostałych kursów

Szukaj wyników w...

Znajdź wyniki, które zawierają...


Data utworzenia

  • Rozpocznij

    Koniec


Ostatnia aktualizacja

  • Rozpocznij

    Koniec


Filtruj po ilości...

Data dołączenia

  • Rozpocznij

    Koniec


Grupa


Imię


Strona

Znaleziono 2 wyniki

  1. Jakiś czas temu postanowiłem zbudować zegarek z jakimś termometrem i od razu zabrałem się do roboty dopiero później dodałem do niego buzzer by mógł służyć też w razie potrzeby za budzik. Do budowy wykorzystałem zegar czasu rzeczywistego ds1307, arduino nano, wyświetlacz lcd 2x16 wraz z konwerterem I2C, przetwornicę step up na 5v, akumulator li-ion, termometr dht11 oraz moduł ładowania. Z racji , że nie posiadam drukarki 3d a nie chciało mi się wykonywać całej obudowy zegarka ze sklejki postanowiłem użyć plastikowego opakowania znalezionego u siebie w pokoju przy okazji postanowiłem zużyć trochę elementów odlutowanych z różnych elektro śmieci. Zdjęcia: Jak widać na jednym z zdjęć postanowiłem wykorzystać ds1307 w wersji modułu do przylutowania nie zaś płytki z modułem ponieważ chciałem wypróbować wyjście tego układu(na filmie wykorzystałem je do migania diodą podczas alarmu).Przetwornica z kolei była niezbędna do działania wyświetlacza który bez tych 5v miał tak słabe podświetlenie że niewiele było widać a buzzer ukryłem pod mikrokontrolerem. Jeśli chodzi o montaż to większość trzyma się na śrubach poza przetwornicą i modułem ładowanie które przymocowałem klejem na gorąco oraz przyciskami które są zamontowane na wcisk. Jeden włącza cały zegarek drugi wyłącza alarm. Film: Na filmie uchwyciłem moment aktywacji alarmu. Zegarek najlepiej wygląda kiedy jest ciemno wtedy właśnie najlepsze wrażenie sprawia dioda która oświetla od wewnątrz plątaninę kabli znajdującą się wewnątrz. Co do kodu to jest on tak prosty jak się da z po za tym korzystałem z bibliotek: Wire, DHT, LiquidCrystal_I2C, DS1307. Szczególnie warto wspomnieć o tej ostatniej nad wyraz wygodna oferująca funkcje sterowania wyjściem zegara i dostępu do wewnętrznej wbudowanej w zegar pamięci przygotowana przez jarzebskiego jak toś będzie chciał to wystarczy po prostu wpisać w wyszukiwarkę i wyskoczy na pierwszym miejscu.
  2. Cześć, Jako że to mój pierwszy post tutaj nie bijcie 😄 Mam zerowe doświadczenie w C i małe w innych językach więc pewnie to czego szukam jest banalne... Do rzeczy. Robię swój pierwszy projekt na AtMega88PA, którego częścią jest wyświetlacz 2x16 i zegar czasu rzeczywistego DS1307. Oba urządzenia podłączone są przez i2c do procka (wyświetlacz poprzez extender) i wyświetlacz udało mi się zmusić do pracy - czyli komunikacja i2c działa. Schemat podłączenia w załączniku. Połączenie sprawdzone. Bateria po odłączeniu programatora daje 1 mikroamper do układu więc zakładam że zegar podtrzymuje swoje działanie. Po ustawieniu zegara jakiś czas temu (zanim zaprogramowałem wyświetlacz) udało mi się wyprowadzić sekundnik na diodę - time.sec%2 powodowało zmianę stanu LED'a i ten ładnie mrygał w odstępie sekundowym. Zegar ustawilem nastepujacym kodem: RTC_Init(); rtc_t rtc; rtc.hour = 0x10; // 10:40:20 am rtc.min = 0x40; rtc.sec = 0x00; rtc.date = 0x01; //1st Jan 2016 rtc.month = 0x01; rtc.year = 0x16; rtc.weekDay = 5; // Friday: 5th day of week considering monday as first day. RTC_SetDateTime(&rtc); // 10:40:20 am, 1st Jan 2016 Do projektu dodałem parę urządzeń, zaprogramowałem wyświetlacz. Schody zaczęły się gdy próbuję wyprowadzić stan zegara na ekran. Pojawia się takie coś: https://youtu.be/qWDivu2OPvA main.c : int main(void) { // tutaj inicjacja wyswietlacza, we/wy - nieistotne rtc_t time; lcd_led(0); char i; RTC_Init(); while(1){ RTC_GetDateTime(&time); // metoda do poboru danych z zegara lcd_gotoxy(0,0); // ustaw kursor na punkt 0 w zegarze i = (char)time.sec; // mapowanie zmiennej sekundowej do znaku - lcd_puts(&i); // metoda wyswietlajaca znaki na wyswietlaczu } } Clock.c : #include "twi.h" #include <avr/io.h> #include <util/delay.h> #define Clock_Read 0xD1 // bit odczytu #define Clock_Write 0xD0 // bit zapisu typedef struct { uint8_t sec; uint8_t min; uint8_t hour; uint8_t weekDay; uint8_t date; uint8_t month; uint8_t year; }rtc_t; void RTC_Init(void) { twi_init(); // Initialize the I2c module. twi_start(); // Start I2C communication twi_write(Clock_Write); // Connect to DS1307 by sending its ID on I2c Bus twi_write(0x07); // Select the Ds1307 ControlRegister to configure Ds1307 twi_write(0x00); // Write 0x00 to Control register to disable SQW-Out twi_stop(); // Stop I2C communication after initializing DS1307 } void RTC_SetDateTime(rtc_t *rtc) { twi_start(); // Start I2C communication twi_write(Clock_Write); // connect to DS1307 by sending its ID on I2c Bus twi_write(0x00); // Request sec RAM address at 00H twi_write(rtc->sec); // Write sec from RAM address 00H twi_write(rtc->min); // Write min from RAM address 01H twi_write(rtc->hour); // Write hour from RAM address 02H twi_write(rtc->weekDay); // Write weekDay on RAM address 03H twi_write(rtc->date); // Write date on RAM address 04H twi_write(rtc->month); // Write month on RAM address 05H twi_write(rtc->year); // Write year on RAM address 06h twi_stop(); // Stop I2C communication after Setting the Date } void RTC_GetDateTime(rtc_t *rtc) { twi_start(); // Start I2C communication twi_write(Clock_Read); // connect to DS1307 by sending its ID on I2c Bus twi_write(0x00); // Request Sec RAM address at 00H twi_stop(); // Stop I2C communication after selecting Sec Register twi_start(); // Start I2C communication twi_write(Clock_Read); // connect to DS1307(Read mode) by sending its ID rtc->sec = twi_read(1); // read second and return Positive ACK rtc->min = twi_read(1); // read minute and return Positive ACK rtc->hour= twi_read(1); // read hour and return Negative/No ACK rtc->weekDay = twi_read(1); // read weekDay and return Positive ACK rtc->date= twi_read(1); // read Date and return Positive ACK rtc->month=twi_read(1); // read Month and return Positive ACK rtc->year =twi_read(0); // read Year and return Negative/No ACK twi_stop(); // Stop I2C communication after reading the Date } twi.c : #include "twi.h" #include <avr/io.h> #include <util/delay.h> // procedura inicjalizacji TWI void twi_init(void) { /* initialize TWI clock: 100 kHz clock, TWPS = 0 => prescaler = 1 */ TWSR = 0; /* no prescaler */ TWBR = ((F_CPU/SCL_CLOCK)-16)/2; /* must be > 10 for stable operation */ }/* twi_init */ // procedura transmisji sygnału START void twi_start(void) { TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); while (!(TWCR & (1 << TWINT))); } // procedura transmisji sygnału STOP void twi_stop(void) { TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO); while ((TWCR & (1 << TWSTO))); } // procedura transmisji bajtu danych void twi_write(char data) { TWDR = data; TWCR = (1 << TWINT) | (1 << TWEN); while (!(TWCR & (1 << TWINT))); } //procedura odczytu bajtu danych char twi_read(char ack) { TWCR = ack ? ((1 << TWINT) | (1 << TWEN) | (1 << TWEA)) : ((1 << TWINT) | (1 << TWEN)); while (!(TWCR & (1 << TWINT))); return TWDR; } Gdy próbuję bezpośrednio wyświetlić zmienną time.sec kompilator ostrzega o niezgodności znaków. Gdy spróbowałem wyświetlić 'time.sec' na wyświetlacz pojawiły się dodatkowe 4 znaki z lewej strony - w sumie było ich 7, dwa ostatnie takie same jak na filmie a reszta kompletnie randomowa. Bit odczytu i zapisu wziąłem z dokumentacji urządzenia. Moje podejrzenie jest takie że zmienna którą wprowadzam do funkcji RTC_SetDateTime nie jest zmieniana przez tą funkcję. Próbowałem napisać podobną funkcję zwracającą całą strukturę, ale nie udało mi się to. Moja zmienna 'time' jest globalna i jak wrzucam ją do funkcji to moim zdaniem powinna być przez tą funkcję nadpisywana. Nie widzę sensu dodania tabeli int'ów do funkcji a potem jej wyprowadzenia bo czuje że to się skończy tak samo - mogę się mylić. Dajcie proszę jakąś wskazówkę dla mniej doświadczonego bo już nie wiem co mogę jeszcze zrobić. Doniczkav2.zip
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.