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



Teraz jest 10 lip 2026, o 17:16


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 22 gru 2015, o 00:35 
Offline
Nowy

Dołączył(a): 01 lis 2015
Posty: 3
Pomógł: 0

Witam, chciałem stworzyć, zegar na atmega16, z wykorzystaniem LCD. Procesor podpięty pod kwarc 16 MHz, do odliczania czasu wykorzystuję Timer0, biblioteki do lcd za strony radzio.dxp.pl. Zegar działa ale patrząc na kod wydaje mi się że coś by się tu przydało zoptymalizować.
poniżej fragment kodu odpowiadający za wyświetlanie, warunków typu if(sec<10 & min<10) wyszło by mi 8, jeśli ich nie stosuje, w momencie przejścia sekund z 9 na 10 na wyświetlaczu się mi wszystko rozjeżdża. Proszę o jakąś wskazówkę jak to poprawić;), w razie jakichś niejasności kodu, proszę pytać;)
Kod:
ISR(TIMER0_OVF_vect)
{
    LCD_GoTo(4,0);
    TCNT0=6;
    msec++;
   if(min==60)
   {
      min=0;
      sec=0;
      msec=0;
      god++;      
   }
   if(sec==60)
   {
      sec=0;
      msec=0;      
      min++;      
   }      
    if(msec==1000)
    {
       msec=0;
      
      if(sec<10 & min<10)
      {
       sprintf(bufor, "0%d:0%d:0%d",god,min,sec);
       LCD_WriteText(bufor);
      }
      else if(sec<10 & min>=10)
      {
         sprintf(bufor, "0%d:%d:0%d",god,min,sec);
         LCD_WriteText(bufor);   
      }
      else if(sec>=10 & min<10)
      {
         sprintf(bufor, "0%d:0%d:%d",god,min,sec);
         LCD_WriteText(bufor);
      }
      else
      {
         sprintf(bufor, "0%d:%d:%d",god,min,sec);
         LCD_WriteText(bufor);
      }               
      sec++;               
    }   
}



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 gru 2015, o 01:44 
Offline
Użytkownik

Dołączył(a): 22 gru 2012
Posty: 256
Lokalizacja: Rumia
Pomógł: 22

Obsługa LCD w przerwaniu to chyba nie najlepszy pomysł. Możesz więc zacząć optymalizację od przeniesienia obsługi LCD do pętli głównej.
A tak w ogóle to zegar ten chyba za dokładny nie będzie.

_________________
http://www.marcingibas.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 gru 2015, o 01:53 
Offline
Nowy

Dołączył(a): 01 lis 2015
Posty: 3
Pomógł: 0

Ok, jutro to jakoś przemyślę, zarys całości jest taki, że ma to być taki jakby ekran główny, za pomocą przycisków będą opcje zmiany daty, godziny etc. A dlaczego niedokładny? Jak więc osiągnąć dokładną wartość, jeśli nie dzięki zastosowaniu rezonatora?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 gru 2015, o 02:49 
Offline
Użytkownik

Dołączył(a): 27 lis 2015
Posty: 36
Zbananowany użytkownik

Pomógł: 5

Chciałeś sugestii:
1. Usuń z przerwania operacje związane z obsługą LCD oraz sprintf(). One zajmują wiele czasu i całość nie będzie Ci działała poprawnie.
2. Zgromadź zmienne związane z czasem (sek, min, msec, god) w strukturze i usuń ją z przerwania. Opatrz zmienne te klasą pamięci volatile.
3. W przerwaniu pozostanie Ci jedynie "inkrementowanie" i obsługa "rozbijania na części" czasu.
4. W obsługi dostępu do atrybutów czasu (struktura którą sugerowałem), z main(), blokuj przerwania poprzez ATOMIC_BLOCK
5. Ja bym przemyślał przechowywanie czasu które Ty masz. Lepiej jest mieć 1 liczbę z ilością msec i w trakcie wyświetlania "rozbijać ją" na części związane z czasem.

To tak na początek.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 gru 2015, o 07:21 
Offline
Użytkownik

Dołączył(a): 22 lut 2014
Posty: 205
Lokalizacja: Poznań
Pomógł: 22

W warunkach zastosuj podwójny ampersand (&).

------------------------ [ Dodano po: 2 minutach ]

np. if(sec<10 & min<10) zmień na if(sec<10 && min<10)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 gru 2015, o 09:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 sty 2014
Posty: 336
Lokalizacja: Grodzisk Mazowiecki
Pomógł: 13

Użyj przynajmniej kwarc zegarkowy. Zostaw go na dobę aby pochodził. Zobaczysz wtedy ile się późni czy spieszy i można wtedy raz ma dobę zrobić programowo korektę.
Kiedyś udało mi się coś takiego spłodzić i działało. Oczywiście to taka proteza dedykowanego RTC. Wszystko zależy od potrzeb i oczekiwań.

_________________
"Nie programuj w święta - bug się rodzi"



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 gru 2015, o 09:29 
Offline
Nowy

Dołączył(a): 01 lis 2015
Posty: 3
Pomógł: 0

Dzięki panowie, zastosuje wasze porady, i dam znać o efektach. Co do dokładności, to wiem że zegar powinien być dokładny, ale całość ma zostać złóżona na płytce, i przedstawiona jako projekt na zaliczenie, poza tym głównie chodzi mi o ćwiczenie pisania kodu, niż super użyteczość urządzenia. Pozdrawiam.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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