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

Zegar RTC na mega16. Nie zmienia się czas na wyświetlaczu.

morswin 10 Paź 2006 13:57 2340 17
REKLAMA
  • #1 3103255
    morswin
    Poziom 11  
    Posty: 66
    Ocena: 2
    Witam!

    O ile dobrze rozumiem idee RTC (Real Time Clock) sluzy on do obliczania czasu. Czy jest normalnym zegarem w uP.

    Aby dzialal musi byc podlaczony oscylator 32768Hz.
    Fusebit CKSEL ustawiony na "8MHz internal".

    W BASICU
    Dane o czasie sa przechowywane w w zmiennej Time$ lub poszczegolne skladniki (godzina, minuta, sekunda) w _hour, _min, _sec.

    Tylko dlaczego czas mi sie nie zmiania gdy w petli wysylam na wyswietlacz:

    lcd time$

    Pozdrawiam
  • REKLAMA
  • #2 3103332
    lelekx
    Poziom 30  
    Posty: 1220
    Pomógł: 158
    Ocena: 90
    Jeśli się nie mylę, w przykładach do Bascoma AVR był plik demonstrujący użycie RTC. Przykłady są w podkatalogu Examples instalacji Bascoma AVR.
  • #3 3103368
    morswin
    Poziom 11  
    Posty: 66
    Ocena: 2
    Oczywiscie ze zaczolem od tych przykladow tym bardziej ze sa powiuelone w helpie.

    Wlasnie opierajac sie na tych przykladach stwierdzilem ze mi nie dziala.
    A np zadzialaoby w symulatorze programowym do bascoma. Mi nie dziala.
  • REKLAMA
  • #4 3103489
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    morswin napisał:
    Oczywiscie ze zacząłem od tych przykladow tym bardziej ze sa powiuelone w helpie.

    Wlasnie opierajac sie na tych przykladach stwierdzilem ze mi nie dziala.
    A np zadzialaoby w symulatorze programowym do bascoma. Mi nie dziala.

    Jak nie działa(w symulatorze) , jak działa ;)
    Zaptaszkowałeś opcję Sim Timers , zezwoliłeś w programie na przerwania :?:
    Ten kod działa w symulatorze:
    
    $regfile = "m16def.dat"
    $crystal = 8000000
    
    Config Lcd = 16 * 1
    Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portd.7
    Config Lcdpin = Pin , Db7 = Porta.7 , E = Portc.3 , Rs = Portc.2
    
    Config Clock = Soft
    Enable Interrupts
    
    Cls
    Time$ = "23:59:00"
    
    Do
       Home
       Lcd Time$
    Loop
    

    Wklej powyższe , skompiluj , uruchom symulator,kliknij ikonkę show hardware simulation , a potem Run program i nie zapomij o zezwoleniu na emulacje timerów :!:
    Ma się rozumieć , że symulowana sekunda , nie jest rzeczywistą sekundą :D

    Piotrek
  • REKLAMA
  • #5 3103587
    morswin
    Poziom 11  
    Posty: 66
    Ocena: 2
    Dzieki Tobie zrobilem ogromny postep od rana :)

    Ale jednak przy zwlokach czasowych

    Do
    Home
    Print Time$
    Lcd Time$
    Waitms 10000
    Loop


    mi nie dziala.
    Nie mowie o symulatorze tylko o rzeczywistym sprzecie. Co to za zegar. Moze zadziala (przeskoczy o 1s za godzine).

    Czy to jest normalne?

    Ale naprawde wielkie dzieki. Taki drobiazg Hmmmm

    Dodano po 2 [minuty]:

    A przy okazji pamietasz ze mi chodzilo o zegar asynchroniczny z zewnetrznym kwarcem podpietym pod konc. OSC1 i OSC2 portu C.
    Ten faktycznie zachowuje sie jak programowy (soft).
  • #6 3104417
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    morswin napisał:
    ...
    A przy okazji pamietasz ze mi chodzilo o zegar asynchroniczny z zewnetrznym kwarcem podpietym pod konc. OSC1 i OSC2 portu C.
    Ten faktycznie zachowuje sie jak programowy (soft).

    Oczywiście że pamiętam ;)
    Parametr soft przy Config clock oznacza , że kompilator użyje własnej procedury obsługi przerwania od Timer2.Uruchamiałem kiedyś taki zegarek na AT90S8535 i śmigał.Ostatecznie , by sprawdzić czy timer działa , można skorzystać z opcji Config clock = soft , Gosub = sectic , a w podprogramie sectic , przełączać stan jakiegoś wolnego pinu , z podłączoną diodą LED.
    
    
    $regfile = "m16def.dat"
    $crystal = 8000000
    
    Config Lcd = 16 * 1
    Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portd.7
    Config Lcdpin = Pin , Db7 = Porta.7 , E = Portc.3 , Rs = Portc.2
    
    Config Clock = Soft , Gosub = Sectic
    Config Portd.0 = Output
    Enable Interrupts
    
    Cls
    Time$ = "23:59:00"
    
    Do
       Home
       Lcd Time$
    Loop 
    
    Sectic:
    ' ****  co 1 sekundę zmieni stan pinu na przeciwny
    Toggle Portd.0
    Return
    

    Jeśli to nie zadziała , to znaczy że timer nie pracuje.
    Piotrek
  • #7 3106796
    morswin
    Poziom 11  
    Posty: 66
    Ocena: 2
    Sprawdzilem miga.

    Nawet czesciej niz co sekunde.

    Ale musze zprawdzic to doglebniej bo np dlaczego lcd dziala tak do bani.
    Przeciez czeka sie dluzej niz te 10000 ms na nowa wartosc na wyswietlaczu.

    Ja nie chce przerwan bo moj procesor ma do wykonania powazniejsza robote niz pomiar czasu.

    Musze wszystko sprawdzic wypowiem sie jeszcze w tej sprawie.

    Dzieki

    Dodano po 3 [minuty]:

    W tej chwili np spostrzeglem, ze po odlaczeniu kwarcu zegarowego.
    Dioda sobie nadal miga !!!
    To oznacza ze dziala takze bez kwarcu. Jak to rozumiec. Cos tu jest nie tak!!!

    Dodano po 11 [minuty]:

    Kolejna obserwacja:
    Po wykasowaniu waitms ...
    Pali sie ciagle.
  • #8 3107370
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    To pokaż kod , bo to o czym piszesz , to normalne "cuda na kiju" :D

    Piotrek
  • #9 3109462
    morswin
    Poziom 11  
    Posty: 66
    Ocena: 2
    $regfile = "m16def.dat"
    '$regfile = "8535def.dat"
    $crystal = 8000000
    $baud = 19200
    $hwstack = 80
    $swstack = 64
    $framesize = 64


    Config Lcdpin = Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
    Config Lcd = 16 * 2

    Config Portb.0 = Input
    Config Portb.1 = Input
    Config Portb.2 = Input
    Config Portb.3 = Input
    Config Portb.4 = Input


    S1 Alias Pinb.1
    S2 Alias Pinb.2
    S3 Alias Pinb.3
    S4 Alias Pinb.4
    Speaker Alias Portb.5

    Enable Interrupts

    Config Date = Mdy , Separator = / ' ANSI-Format
    Config Clock = Soft , Gosub = Sectic

    'Assr.3 = 1
    'Mcusr = &H80
    'Mcusr = &H80
    Ddrc.0 = 1

    Dim Seconde As Integer , Minute As Integer , Heure As Integer 'Czas

    Date$ = "11/11/00"

    Cls
    Time$ = "23:59:00"

    Do
    Home
    Print Time$
    Lcd Time$
    'Waitms 100
    Loop

    End


    Sectic:

    Toggle Portc.0

    Return
  • #10 3110051
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Ostatni test:
    
    $regfile = "m16def.dat"
    '$regfile = "m32def.dat"
    $crystal = 8000000
    $hwstack = 80
    $swstack = 64
    $framesize = 64
    Config Clock = Soft , Gosub = Sectic
    Ddrc.0=1
    Enable Interrupts
    
    Do : Loop
    
    
    Sectic:
    Toggle Portc.0
    Return
    

    Jeśli teraz dioda nie będzie "migała" co 1 s , tzn. że Twój oscylator nie pracuje :(

    Piotrek

    PS
    Na mojej M32 , ten programik działa.Po odłączeniu kwarca zegarkowego , dioda przestaje "migać".
  • #11 3110174
    morswin
    Poziom 11  
    Posty: 66
    Ocena: 2
    No dobrze moj kwarc nie pracuje.

    Ale dlaczego wczesniej migala?

    Mam ustawiony wewnetrzny oscylator 8MHz (chodzi o konc XTAL1 i XTAL2).

    Kwarc zegarkowy jest bez kondensatorow bo pisze ze nie sa potrzebne. Ty masz?
  • #12 3110184
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    morswin napisał:
    No dobrze moj kwarc nie pracuje.

    Ale dlaczego wczesniej migala?

    Mam ustawiony wewnetrzny oscylator 8MHz (chodzi o konc XTAL1 i XTAL2).

    Kwarc zegarkowy jest bez kondensatorow bo pisze ze nie sa potrzebne. Ty masz?

    Z przekory zapytam: pod które piny proca , podłączyłeś kwarc zegarkowy :?:

    Piotrek
  • #13 3110198
    morswin
    Poziom 11  
    Posty: 66
    Ocena: 2
    PC7 i PC6 Rozumiem, ze zmyliło Ciebie to ze pisze o XTAL.

    Pomyslalem ze sposob taktowania calosci ma znaczenie.
  • #14 3110247
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    morswin napisał:
    PC7 i PC6 Rozumiem, ze zmyliło Ciebie to ze pisze o XTAL.

    Pomyslalem ze sposob taktowania calosci ma znaczenie.


    Czyli wygląda na to , że Twój kwarc 32768Hz nie działa :(
    U mnie , kwarc zegarkowy jest bez kondensatorów.

    Piotrek
  • #15 3110270
    morswin
    Poziom 11  
    Posty: 66
    Ocena: 2
    Z 2 kwarcem takze nie dziala.
    To przeciez malo prawdopodobne aby wszystko mi sie psulo.
  • REKLAMA
  • #16 3110532
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    morswin napisał:
    Z 2 kwarcem takze nie dziala.
    To przeciez malo prawdopodobne aby wszystko mi sie psulo.

    Masz rację - mało prawdopodobne :(
    Przetestowałem M32(M16 jest jakoby mniejszą siostrą) z wewn. oscylatorem i zewnętrznym kwarcem na XTAL , a zegarek jak chodził tak chodzi , doputy na TOSC jest kwarc 32768.
    Przykro mi , ale wygląda na to , że moja wiedza w tym temacie się wyczerpała :(
    Może ktoś inny coś podpowie .
    Piotrek
  • #17 3110534
    morswin
    Poziom 11  
    Posty: 66
    Ocena: 2
    Ok to pytanie wprost.

    Da sie zrobic na m16 zegar taki jak na kostce PCF8583 przez I2C?

    Zanim zaczne sobie wyrywac wlosy usilujac cos takiego zrobic.
  • #18 3132257
    autoservice
    Poziom 20  
    Posty: 516
    Pomógł: 7
    Ocena: 16
    ...tia tylko ze ten RTC w atmedze to o kant glowy rozbic, jeden przypadkowy reset (a o taki nie trudno w avr ) i zegarek w krzakach :((( lipa...

Podsumowanie tematu

✨ Dyskusja dotyczy problemu z implementacją zegara RTC na mikrokontrolerze Atmega16, gdzie czas wyświetlany na LCD nie ulega zmianie. Użytkownik stosuje zewnętrzny kwarc 32768 Hz podłączony do pinów OSC1 i OSC2 oraz fusebit CKSEL ustawiony na 8 MHz wewnętrzny oscylator. Wykorzystuje Bascom AVR z konfiguracją zegara "Config Clock = Soft" i obsługą przerwań Timer2 do symulacji czasu. Testy w symulatorze działają poprawnie, jednak na rzeczywistym sprzęcie czas się nie aktualizuje, a dioda sygnalizująca przerwania miga z nieregularną częstotliwością nawet po odłączeniu kwarcu, co wskazuje na problemy z oscylatorem kwarcowym. Próby z dwoma kwarcami 32768 Hz nie przyniosły efektu, co sugeruje uszkodzenie lub błędne podłączenie kwarcu. Dyskusja podkreśla, że konfiguracja fusebitów i prawidłowe działanie oscylatora są kluczowe dla poprawnej pracy RTC. Pojawiła się także sugestia, że wbudowany RTC w Atmedze jest zawodny i łatwo ulega resetom, co może powodować utratę pomiaru czasu. Na koniec pojawiło się pytanie o możliwość zastąpienia RTC Atmegi zewnętrznym układem PCF8583 komunikującym się przez I2C.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA