Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

zegarek RTC i termometr na LCD w bascom

06 Sie 2006 21:59 8317 33
  • Poziom 29  
    Takie moze glupie pytania ale zaryzykuje i napisze. Jestem poczatkujacym w uC wiec pytam.

    Po pierwsze chcialbym zeby mi ktos wytlumaczyl jak obliczac czas z generatora i ile przerwan itd i jak ustawic procka. Mozna od razu na 12MHz generatorze.

    Po drugie jak obslugiwac LCD zeby wyswietlal mi czas. Czy pisze sie osobny pod program do minut i godz gdzie jest jakis warunek ktory dodaje ciagle jeden az do 59 i 23 dla godz i pozniej wyswielic to w danym miejscu LCD czy jakos inaczej.

    Po trzecie czytalem dokumentacje i Atmega8 ma RTC. Podobno ten system jest najbardziej dokladny. Dolacza sie kwarc zegarkowy tylko. Jak uaktywnic to w BASCOM`ie i pozniej jak to wyswietlic.

    Narazie tyle. Licze na pomoc ;)
  • Pomocny post
    Poziom 26  
    Po pierwsze jakie czasy chcesz obliczać i jakie przerwania po co ??? To jest bascom nie assembler, deklarujesz na wstępie programu prędkość kwarcu a kompilator troszczy się o resztę tj. dajesz deklarację
    $regfile = "m8def.dat"
    $crystal = 12000000

    Po drugie, procedura obsługi wyświetlaczy LCD (mowa tu o alfanumerycznych HD44780) jest w BASCOM zaimplementowana i bardzo uproszczona.
    Prezentację wyniku czasu wywołuje się komendą Lcd zmienna i tyle :)

    Tak, atmega8 może obsługiwać RTC, podłącza się wtedy kwarc zegarkowy 32768 pod wejścia XTAL, natomiast program goni się z wewnętrznego generatora taktującego RC. Sposobów na zrobienie zegarka jest wiele.

    W prezencie podsyłam przykładowy program na atmega8 zegarka wykorzystujący timer1 od przepełnienia...

    pozdr KN
  • Poziom 29  
    Hmmm..Moze i myle asembler bo pisalem kilka prostych programow na 8051 ale wydaje mi sie ze trzeba obliczyc cos przeciez. Przeciez timer i jegoprescale, zlicza do ilus tam i jest przerwanie. Iles przerwan daje nam sek jak chcemy. Itd... Przynajmniej mi sie tak wydaje.

    Co do RTC to fajnie ze mozna ale jak to uruchomic w BASCOM`ie. No i jak z tym liczeniem minut i godz.
  • Poziom 26  
    A jeżeli chodzi o obliczenia to zobacz jak jest w przykładzie z timerem1 w pierwszym programie, preskaler ustalony wraz z wpisem do rejestru timera by zgłaszał przerwanie co 1s

    Napisałem szybki soft do RTC w atmega8, oczywiście timer2 taktowany asynchronicznie z XTAL reonatorem zegarkowym 32768

    Nie będę opisywał co jest z czego, sprawdz w help bascoma co oznaczają i jak konfiguruje się komendy, jezeli coś nie jasne pytaj :)

    $regfile = "m8def.dat"
    $crystal = 12000000


    Config Lcd = 16 * 2

    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5

    Config Clock = Soft
    Config Date = Mdy , Separator = /

    Enable Interrupts

    Date$ = "08/06/06"
    Time$ = "20:29:01"

    Do

    Cls

    Lcd Time$

    Lowerline

    Lcd Date$

    Waitms 200

    Loop

    End

    pozdr KN
  • Poziom 29  
    Hmmmm...nawet ciekawy.

    Czyli jak ustalasz godz wyzej to pozniej sam juz sobie dolicza itd ??

    I pytanko o LCD i ISP. Zrobilem sobie programatorek na bazie STK200 z jakies stronki i mam pytanko. Chcialem podlaczyc wyswietlacz do portu B, czyli akurat tam gdzie sa piny do programatora. Czy to nie koliduje ze soba itd ??

    EDIT.

    Po probie kompilacji wyskakuja bledy ze nieznany paramert "separator" i "time" Obydwa w lini zaczynajacej sie "Config date..."
  • Poziom 26  
    Tak, od tego co wpiszesz, program będzie leciał dalej z czasem i datą :)

    Apropo LCD jezeli na PB3 PB4 i PB5 atmegi przypadną wejścia danych Dx LCD to nie powinno być problemów ze względu na duża impedancję wejścia, choć może się okazać, ża na czas programowania może być konieczne odłączenie tychże pinów od LCD... rozumiem, że LCD w pracy 4 bitowej ?

    pozdr KN

    Dodano po 3 [minuty]:

    Sprawdz poprawność programu, czy dobrze skopiowany... u mnie działa :)

    Jakiego kompliatora używasz, w której wersji ?

    pozdr KN
  • Poziom 29  
    Tak w pracy 4-bitowej.

    A jak zrobic gdy chce wpisac np. przyciskami date i czas bo przeciez jak zrobie cos takiego to trzeba go pozniej ustawic :) Sadze ze program wtedysie troche rozrosnie i trzeba by uzyc min 2 przyciskow.
  • Poziom 26  
    Procedura kompilatora time$ czy date$ używa wewnętrznych zmiennych bajtowych zdeklarowanych jako: _day , _month, _year , _sec, _hour, _min

    Jeżeli przypiszesz jednej z tych zmiennych odpowiednią wartość taka będzie uwzględniona. Przypisanie odbywa się typowo np.

    _min = 15

    i tak podobnie dla pozostałych, tyle podpowiem :) Natomiast podprogram przypisujący odpowiednim zmiennym porządane wartości pozostawiam twojej inwencji twórczej :)

    pozdr KN
  • Poziom 29  
    Wkoncu jutro bede mial chwilke czasu by sie pobawic i mam nastepne pytania :)

    Czy kazdy zegarek mial ten kwarc zegarkowy ?? Bo wyprulem z jednego starego zegareczka i sie zastnawiam czy bedzie dzialal.

    Jak mozna napisac w bascomie procedure taka ze przy przycisnieciu przycisku przz 2 sek przechodzi gdzies itd.
  • Pomocny post
    Poziom 26  
    Wszystko zależy jak rozwiązano w danym przypadku sposób liczenia interwałów taktowania zegara, ale typowo w elektronicznych układach odmierzających czas są montowane te typowe kwarce 32768 kHz w cylindrycznej oprawce. Owe kwarce znajdziesz w zegarkach czy to wskazówkowych kwarcowych z budzikiem czy też w płytach głównych PC :)

    Jeżeli przycisk masz na jednym z portów procesora to możesz wykorzystać instrukcję Debounce np

    Debounce Pind.1 , 0 , etykieta, Sub

    czyli gdy pind.1 ma stan 0 to skocz do podprogramu etykieta

    Instrukcja debounce wykorzystuje dwukrotne sprawdzenie warunku (tu sprawdzenie stanu portu czy 1 czy 0) w odstępach 25ms. Czas ten możemy zmienić wydłużyć odpowiednio konfigurując np:

    Config debounce = 50 dla 50ms odstepu

    Poczytaj w pomocy bascom o tych instrukcjach DEBOUNCE oraz Config DEBOUNCE, to proste i nie ma co tu opisywać :)

    pozdr KN
  • Poziom 29  
    Jestem ponownie. Projeckt mam prawie ukonczony i mam jeszcze pytanka.

    To jest kod do termomertu na DS18B20 i zegarka.
    I teraz mam taki problem. Odczyt temp jest bardzo niestabilny. Cyfry po przecinku skacza tak o 2-3 jednostki. Raz jest 22.4 za sek 22.7 a za nastepna 22. 5 itp itp.

    Mam inny kod z forum ktory nie obsluguje temp ujemnych dla proby i tam odczyt jest stabilny. Co poprawic w moim zeby takze tak bylo.

    Po drugie czy da sie jakos ustawic wyswietlanie na LCD z wieksza czestotliwoscia bo teraz wyswietla co sek i tak glupio miga caly ekran co sek.

    I po trzecie jak wstawic procedure ustawiania godz aby nie czekac tej calej sek zanim program ponownie sie zapetli ?? Bo teraz trzymajac przycisk ustawiania min np. Co sek przestawia mi sie wartosc a chcialbym szybciej.

    Code:
    $regfile = "m8def.DAT"
    

    Config 1wire = Portd.2
    Config Pind.1 = Input
    Config Pind.4 = Input
                                                             
    Config Lcdpin = Pin , Db7 = Portb.0 , Db6 = Portb.1 , Db5 = Portb.2 , Db4 = Portb.3 , E = Portb.4 , Rs = Portb.5
    Config Lcd = 20 * 2
    Cursor Off                                               
    Deflcdchar 1 , 4 , 10 , 4 , 32 , 32 , 32 , 32 , 32

    Config Clock = Soft
    Enable Interrupts
    Time$ = "00:00:01"

    Dim T1 As Single
    Dim T2 As Single
    Dim B1 As Byte , B2 As Byte , R As Byte
    Dim Tmp As String * 6
    Dim Znak As String * 1
    R = &HFF
    Declare Sub 1wr                                             'podprogram resetujacy magistrale 1w
    Cursor Off
    Cls

    Do
    1wr                                                         'podprogram 1wr
    1wwrite &HCC                                                'komenda skip ROM
    1wwrite &H44                                                'komenda convert T
    Waitms 250
    Waitms 250
    1wr                                                         'podprogram 1wr
    1wwrite &HCC                                                'komenda skip ROM
    1wwrite &HBE                                                'komenda read

    B1 = 1wread()                                               'odczyt z termometru
    B2 = 1wread()

    1wr                                                         'podprogram 1wr

    If B2 >= 248 Then                                           'w przypadku temperatur ujemnych
    B1 = R - B1                                                 'Od 255 Odejmujemy B1
    B2 = R - B2                                                 'od 255 odejmujemy B2
    Znak = "-"
    Else
    Znak = "+"
    End If
    T1 = B1 / 16                                                'Przesuniecie w pawo o 4 bajty
    T2 = B2 * 16                                                'przesuniecie w lewo o 4 bajty
    T1 = T1 + T2

    Tmp = Fusing(t1 , "###.#")

    Cls
    Lcd Time$
    Lowerline
    Lcd Znak ; Tmp ; Chr(1) ; "C "

    If Pind.1 = 1 Then
    Incr _min
    If _min = 60 Then
    _min = 0
    End If
    End If

    If Pind.4 = 1 Then
    Incr _hour
    If _hour = 24 Then
    _hour = 0
    End If
    End If

    Waitms 500

    Loop

    Sub 1wr                                                     'podprogram resetujacy magistrale
    1wreset
    End Sub
  • Poziom 26  
    Soft nie jest napisany optymalnie, ale wiem że to ten co krąży po necie :) Oczywiście należało by go odchudzić o Single czy Fusing i te niepotrzebne podprogramy....

    Po pierwsze jak masz ustawione fusebit odnośnie taktowania wewnętrznego RC ??? W programie nie zdefiniowałeś jaki dajesz crystal i idzie domyslnie na wpisie z zakładki conf Complier>chip... sprawdz ! Miganie może wynikać z faktu, że procek idzie na domyślnym 1MHz, a soft inaczej !

    Nie wnikając w soft i jego optymalizację, ew miganie możesz usunąć stosując przed Lcd Time$ komendę Home zamiast Cls.

    Apropo ustawiania godzin, możesz zagniezdzić w procedurze dodatkową instrukcję lub podprogram który w chwili wykrycia przytrzymania dłuższego przycisku będzie dodawał do np 5 lub 10 pozycji np

    If pind.1 = 1 then
    wait 3
    If pind.1 = 1 then
    _min = _min + 5

    endif
    endif

    Pamietaj też, by pin atmega przycisku był domyślnie ustawiony w stan niski (podciagnięcie do masy), to ważne gdyż ew stany nieustalone (nawet indukcja napiecia w przewodach przycisku) itp będą same przestawiały czas :)

    pozdr KN
  • Poziom 29  
    Z tym dodawaniem po 5 to mi jakos nie pasuje. Ciezko bedzie dobrze ustawic godz.

    Kawalek kodu do termometru jest z elektrody z dzialu download. Miganie moim zdaniem wynika z tego ze w petli programu jest duzo postojow i w sumie wychodzi na 1 sek jak podliczy sie wszystkie Wait`y

    Procesor ustawilem na 4MHz wewnetrzny. Czy w programie wtedy tez trzeba to ustawiac ??
  • Pomocny post
    Poziom 26  
    Jeżeli atmega idzie na 4MHz to naturalnie że soft trzeba o tym powiadomić

    $crystal = 4000000

    A postoje nie mają wpływu na miganie gdyż LCD w tym czasie powinien wyświetlać to co przed pętlą do chwili ponownego zapisu.. ustaw najpierw odpowiednie taktowanie, potem ew Home zamiadt cls i będzie ok

    A jeżeli chodzi o te + 5 to możesz dodać tę część programu do tego co już masz, i będzie tak że gdy nacisniesz raz przycisk to twoja część będzie dodawała po 1 a gdy przytrzymasz powyżej 3 sek to doda co 5

    pozdr KN
  • Poziom 29  
    knmp napisał:
    Jeżeli atmega idzie na 4MHz to naturalnie że soft trzeba o tym powiadomić

    $crystal = 4000000

    A postoje nie mają wpływu na miganie gdyż LCD w tym czasie powinien wyświetlać to co przed pętlą do chwili ponownego zapisu.. ustaw najpierw odpowiednie taktowanie, potem ew Home zamiadt cls i będzie ok

    pozdr KN


    Oki, zrobione.
    Myslalem ze w programie kwarc deklaruje sie w przypadku tylko zewnetrznego.

    Polecenie Home takze rozwiazalo problem i wyswietlacz juz nie miga.
    Odczyt temp tez jest jakby stabilniejszy ale to nie jest jeszcze to. Przeskakuje teraz np. 21.3 na 21.5 potem na 21.4 ti tak skacze co okolo sek lub 2. Nie wydaje mi sie ze temp tak skacze :|

    Noi jeszcze ustawianie tej godz. Moze na jakis przerwaniach mozna by to bylo zrobic by dzialalo to bez opoznien ??
  • Pomocny post
    Poziom 21  
    odnosnie zegarka to ja bym to zrobil na timer1 - 16 bitowy licznik, i uzaleznil to od przepelnienia tylko nalezy ustawic preskaler na 256
    wpisac poczatkowa counter=conter+34286
    oczywiscie przy rezonatorze 8 MHz
    8000000/256/(65536-34286) = 1 sekunda
    pozniej tylko zliczanie
    a i jeszcze jedna sprawa nalezalo by zmienic wartosc dwojkowa na kod BCD :)
  • Poziom 29  
    Zegarek chodzi bardzo dobrze na RTC. 3 linijki kodu i zegarek z glowy.

    Co do tego skakania termometru to chyba jest wina zaokraglania ktore jest tam wstawione. Sam juz nie wiem.

    A jak z tymi przyciskami ?? Bo bede chcial tam jeszcze date wstawic czyli juz 4 przyciski beda potrzebne. Chyba ze ktos zna sposob na sterowanie za pomoca 2 przyciskow.

    I jeszcze jedno pytanko. Nie chce wyswietlac sekund bo mi sie nie zmiesci na 16 znakowym LCD data i czas w jednej lini. Jak chce wyswielic same zmienne _min i _hour to gdy godz jest 09:04 wyswietla sie 9:4 , jak zrobic zeby z tym zerem sie wyswietlalo. Moze jakies formatowanie ??
  • Poziom 29  
    fantasta napisał:
    I jeszcze jedno pytanko. Nie chce wyswietlac sekund bo mi sie nie zmiesci na 16 znakowym LCD data i czas w jednej lini. Jak chce wyswielic same zmienne _min i _hour to gdy godz jest 09:04 wyswietla sie 9:4 , jak zrobic zeby z tym zerem sie wyswietlalo. Moze jakies formatowanie ??


    I nikt nie wie jak to zrobic :( ??
  • Pomocny post
    Poziom 39  
    fantasta napisał:
    ...I nikt nie wie jak to zrobic :( ??

    Tak źle to nie jest , tylko pewnie nikomu nie chce się odpisywać , na tak proste zagadnienie ;)
    Spróbuj np.
    Code:

    1)Ustaw kursor na dziesiątki godzin
    2) Jeśli _hour jest mniejszy od 10 , to wyświetl "0";
    3) Wyświetl _hour; Wyświetl dwukropek;
    Powtórz kroki 2 i 3 dla minut , ale bez dwukropka

    Możesz użyć funkcji Format , ale to przerost formy nad treścią :D

    Piotrek
  • Poziom 29  
    Heh, to to chyba wlasnie za duzo pisania skoro mozna uzyc funcji format. Tylko z ta funkcja mam problemy.

    Wyskakuje mi blad ze cos ze zmiennymi jest nie tak. Wydaje mi sie ze nie wyda formatowac bezposrednio tych zmiennych (sa one jako Byte) i tylko dziala z typu String ale tu trzeba by bylo konwertowac.

    Wiec moze dasz cynk jak jej uzyc w tym przypadku??
  • Poziom 39  
    fantasta napisał:
    ...Wiec moze dasz cynk jak jej uzyc w tym przypadku??

    Wybierz tę , która Ci pasuje ;)
    Code:


    Const Formatuj = 0
    'dla 0 z If-ami , dla 1 z Format i sprawdź zajętość flash-a ;)

    Cls
    #if Formatuj = 0

    Dim I As Byte , J As Byte , S_time As String * 5
    For I = 0 To 23
       For J = 0 To 59
          Locate 1 , 1
          S_time = ""
          If I < 10 Then S_time = "0"
          S_time = S_time + Str(i) + ":"
          If J < 10 Then S_time = S_time + "0"
          S_time = S_time + Str(j)
          Lcd S_time;
       Next
    Next

    #else

    Dim I As Byte , J As Byte
    Dim S_format As String * 2 , S_time As String * 5
    For I = 0 To 23
       For J = 0 To 59
          Locate 1 , 1
          S_format = Str(i)
          S_format = Format(s_format , "00")
          S_time = S_format + ":"
          S_format = Str(j)
          S_format = Format(s_format , "00")
          S_time = S_time + S_format
          Lcd S_time
       Next
    Next

    #endif




    Piotrek
  • Poziom 14  
    Witam.
    Mam pytanie.
    Ja mam kwarc 12 MHz i jak wyliczyć te liczby i czy coś zmieniać w prescale.
    Dziękuję za odpowiedz i pozdrawiam.
  • Poziom 29  
    Michał~88 napisał:
    Witam.
    Mam pytanie.
    Ja mam kwarc 12 MHz i jak wyliczyć te liczby i czy coś zmieniać w prescale.
    Dziękuję za odpowiedz i pozdrawiam.


    Code:
    $crystal = 12000000

    i oczywiscie zmiana sposobu taktowania i czestotliwosci w FuseBitach jezeli masz ATmege.
  • Poziom 14  
    A można by było rozpisać to szerzej
    Cytat:
    zmiana sposobu taktowania i czestotliwosci w FuseBitach jezeli masz ATmege

    Jestem początkujący.
  • Poziom 29  
    Michał~88 napisał:
    A można by było rozpisać to szerzej
    Cytat:
    zmiana sposobu taktowania i czestotliwosci w FuseBitach jezeli masz ATmege

    Jestem początkujący.


    Jezeli jestes poczatkujacy to zapraszam do tematu https://www.elektroda.pl/rtvforum/topic560687.html
    Zapoznania sie z HELPem Bacoma, dokumentacja swojego ukladu oraz przejzenia forum gdyz jest to najczestrze pytanie w tym dziale. Musisz takze wiedziec jaki masz uC aby wiedziec czego szukasz.
  • Poziom 10  
    Witam
    Mam zapytanie apropo tego tematu.............otóż mam zbudowany podobny zegar tylko na ATMEGA8535 taktowany zew. 4MHz i do pinów tosc mam podpięty kwarc 32kHz. Zegar fajnie leci tylko jest problem że juz po godzinie opóźnil mi sie o prawie minute.............Z tego co czytalem z pdf-ie to nie trzeba żadnych kondensatorów podlączać. Wyszukalem 3 przyczyny ale nie sprawdzone jeszcze:1. podpiąć obudowe kwarca zegarkowego do masy; 2. obniżyć zasilanie do 4 V; 3.do nóżek owefo kwarca zegarkowego połączyć 2 kondensatory rzędu 33p lub więcej ......... pozdrawiam
  • Poziom 29  
    Po pierwsze musi to byc kwarc zegarkowy czyli 32768 Hz. Mam nadzieje ze taki masz i pisales na szybko.
    Drugie, pisza nie pisza daj kondensatory. Zawsze powinno sie dawac. Istnieje mozliwosc ze kwarc nie dosc sie wzbudza.

    Nie obnizaj napiec, nic nie masuj. Poprostu. Daj kondy. Napisz prosty prog, wyswietl na LCD i zrob kolejny pomiar. Zakladam ze bedzie ok.

    Moj juz chodzi sporo czasu i gdyby nie odpiecie kiedys klemy od aku nie musialbym go ani przestawiac ani nic robic.
  • Poziom 20  
    ...a co jeśli procek wykona nieoczekiwany reset z powodu zakłóceń? Zegarak ustawiany od nowa??
    Pzdr.
  • Poziom 29  
    Heh, no od nowa, chyba ze bedziesz zapisaywal co jakis czas stan zegara.

    Ale nieoczekiwany reset od zaklucen ?? Hmmm...Z niczym takim sie nigdy nie spotkalem.