Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Atmega32 mulipleksowanie LED nakładające się symbole

qutrit 02 Jan 2011 18:33 2018 14
  • #1
    qutrit
    Level 20  
    Witam.
    Mam problem z wyświetlaniem cyfr przy użyciu atmegi32, która steruje trzema wyświetlaczami LED w trybie multipleksalnym.
    Otóż, gdy na wyświetlacz podaję te same znaki (cyfry) to wszystko jest dobrze. Natomiast, gdy wysyłam różne cyfry to pojawiają się błędy.
    Poniżej zamieszczam kod z przykładami.
    Ponieważ katody podłączone są do PORTC, więc żeby poprawnie działało multipleksowanie wyłączyłem za pomocą AVR OSP II interfejs JTAG.
    I tu mam pewne wątpliwości, czy czegoś przez przypadek w fusebitach nie poprzestawiałem.
    Program na poprzedniej atmedze32 (już jej nie mam) działał poprawnie.
    Dziękuję za wszelkie sugestie.
    Code:

    #define F_CPU 1000000L
    #include <avr/io.h>
    #include <util/delay.h>
    #include <stdlib.h>
    #include <avr/interrupt.h>
    #include <inttypes.h>
    //#include <wyswietlacze.h>

    #define DOFF PORTC &= ~((1 << 5) | (1 << 6) | (1 << 7)); //wylaczenie wyswietlaczy
    #define funkcja_ON PORTC |=(1<<5);  //wlaczenie odpowiedniego wyswietlacza
    #define dziesiatki_ON PORTC |=_BV(6);
    #define jednosci_ON PORTC |=_BV(7);

    volatile int znak[16] = {0x3F, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x73,0x7C, 0x77, 0x50,0x5C};
    volatile int (wysw);

    int main (void)
    {
    DDRD = 0xFF;//wyswietlacze
    DDRC = 0xFF;//wyswietlacze

    TCCR0 |= (1<<WGM01);
    TCCR0 |= ((0<<CS02)|(1<<CS01)|(1<<CS00));
    TIMSK |= (1<<OCIE0);//przerwanie wyswietlacze w trybie porownania
    OCR0 =110;
    sei();



    while(1) {}

    }

    ISR(TIMER0_COMP_vect)//przerwanie wyswietlacze
    {
       DOFF;//wylaczenie wyswietlaczy
       
       switch(wysw)
       {
       case 0:
       funkcja_ON;
       PORTD = (1<<0); //znak[1];
       wysw++;
       break;
       
       case 1:
       dziesiatki_ON;
       PORTD = (1<<1); //znak[2];
       wysw++;
       break;

       case 2:
       jednosci_ON;
       PORTD = (1<<2); //znak[1];
       wysw=0;
       break;
       }
    }

    Przykład dla próby wyświetlenia cyfr 1,2,1
    Atmega32 mulipleksowanie LED nakładające się symbole

    Przykład dla wyświetlenia PORTD = (1<<0) itd.

    Atmega32 mulipleksowanie LED nakładające się symbole
  • Helpful post
    #2
    Karol966
    Level 30  
    Wspomniałeś o JTAG'u - pamiętam, że przy m32 nie chciał mi działać LCD gdy nie wyłączyłem tego bitu w fusach - może tu masz ten sam problem. Nie wiem dokładnie czym to było spowodowane ale odznaczenie tego bitu w fusach pomagało.
  • Helpful post
    #3
    asembler
    Level 32  
    Spróbuj najpier wystawić informacje o znaku a potem dopiero właczyć wyświetlacz.
  • #4
    qutrit
    Level 20  
    :arrow: Karol966 - wspomniałem o tym o czym Ty piszesz tzn. wyłączyłem JTAG

    :arrow: asembler - spróbowałem, bez zmian :(

    Dodano po 7 [minuty]:

    :arrow: asembler - Problem w tym ze funkcja DOOF na poprzedniej atmedze działała. Jeśli DOOF miała by nie działać to dlaczego :?: Katody podłączyłem do PORTA i problem nadal istnieje.
  • Helpful post
    #5
    asembler
    Level 32  
    Najpierw właczasz wyświetlacz i on świeci z poprzednią zawartościa a potem dajesz nową wartość. I mimo zmiany nic sie nie zmieniło?
    Spróbuj puścic bardzo wolno odświezanie wtedy na oko stwierdzisz co sie dzieje.
    Nie zapomnij dac oporników zabezpieczających na anody bo prądy będą 3x większe.

    Dodano po 6 [minuty]:

    Podałeś przykłady wyświetlania ale nie podałeś co oryginalnie tam sie ma wyświetlac.
  • #6
    qutrit
    Level 20  
    :arrow: asembler
    Teraz jest tak :
    Code:

       case 0:
       funkcja_ON;
       PORTD = (1<<0); //znak[1];
       wysw++;
       break;
     

    Po zmianie na :
    Code:

       case 0:
        PORTD = (1<<0); //znak[1];
       funkcja_ON;
       wysw++;
       break;


    Bez zmian. Chyba ze Cię nie rozumiem :(
  • Helpful post
    #7
    asembler
    Level 32  
    No teraz wedlum mnie dobrze najpierw wpisujesz znak podczas gdy wyświetlacz jest wygaszony (teoretycznie) a potem zapalasz wysiwetlacz.

    Dodano po 1 [minuty]:

    A jaką masz czestotliwośc odświerzania? preskaler i te sprawy. Pytam o faktyczną a nie to co tam ustawiasz w programie.
  • #8
    qutrit
    Level 20  
    Znaki to cyfry. Na pierwszy i trzeci wyświetlacz podałem cyfrę 1 a na drugi wyświetlacz cyfrę 2.
    W drugim przykładzie na pierwszym wyświetlaczu włączyłem segment "a" na drugim wyśw. segment "b" na trzeci wyświetlacz segment "c" efekt wyświetlania jak na zdjęciu w pierwszym poście. Trochę to podejrzanie wygląda: na pierwszym wyśw. świeci się segment "b i c" na drugim "a i c" na trzecim "a i b" hm...
    Nad większym opóźnieniem muszę popracować bo dawno tego nie robiłem. Problem jest w tym ze timer0 jest tylko do 255, ale i tak widoczne jest migotanie wyświetlaczy.
  • Helpful post
    #9
    asembler
    Level 32  
    Zrób do testowania w programie głownym. Przekopiuj to co w przerwaniu zablokuj przerwania a w petli daj opoznienie 1-2 sek. 5 sek roboty:-)

    Dodano po 1 [minuty]:

    Sprawdz jak właczasz anody bo z obrazka wynika ze jak bys właczał przeciwnie to by wszystko grało. Chyba ze sie myle.

    Dodano po 8 [minuty]:

    #define funkcja_ON PORTC |=(1<<5); //wlaczenie odpowiedniego wyswietlacza
    #define dziesiatki_ON PORTC |=_BV(6);
    #define jednosci_ON PORTC |=_BV(7);
    ~

    tu cos masz źle

    Dodano po 1 [minuty]:

    Ten wyświetlacz to wspóln aanoda czy katoada?
    Kolejny raz program bez schematu rodzi wiecej pytań niż odpowiedzi.

    Dodano po 1 [minuty]:


    według mnie powinno byc
    #define funkcja_ON PORTC |=~(1<<5); //wlaczenie odpowiedniego #define dziesiatki_ON PORTC |=~(1<<6);
    #define jednosci_ON PORTC |=~(1<<7);

    Dodano po 1 [minuty]:

    A ten wyświetlacz to jest wspólna katoda.

    Dodano po 59 [sekundy]:

    Oczywiście to też trzeba zmienic
    #define DOFF PORTC &= ~((1 << 5) | (1 << 6) | (1 << 7)); //wylaczenie
    na

    #define DOFF PORTC &= ((1 << 5) | (1 << 6) | (1 << 7)); //wylaczenie
  • #10
    qutrit
    Level 20  
    Więc po wstawieniu "swich(wysw)" do "while(1)" i zakomentowaniu przerwania tzn.
    Code:

    while(1)
    {
       DOFF;//wylaczenie wyswietlaczy
       
       switch(wysw)
       {
       case 0:
       PORTD = znak[1]; //cyfra 1
       funkcja_ON;
       wysw++;
       break;
       
       case 1:
       PORTD = znak[2]; //cyfra 2
       dziesiatki_ON;
       wysw++;
       break;
       
       case 2:
       PORTD = znak[1]; //cyfra 1
       jednosci_ON;
       wysw=0;
       break;
       }
    _delay_ms(10);
    }

    spawa wygląda tak: Jeżeli delay jest poniżej 10ms, to wygląda to tak, jak na pierwszym zdjęciu w pierwszym poście. Gdy zwiększam delay (np 15ms) to sprawa wygląda jak na poniższym zdjęciu.
    Atmega32 mulipleksowanie LED nakładające się symbole
    dalsze zwiększanie delay powoduje świecenie tylko dwóch jedynek na 2 pierwszych wyświetlaczach. Kurcze, co to może być ?

    Dodano po 17 [minuty]:


    Wyświetlacz to BC56-12EWA czyli wspólna KATODA !!
  • Helpful post
    #11
    Jaca
    Level 31  
    Tak jak radził asembler - zrób w pętli głównej procedurę przemiatania tak, aby każdy z segmentów przełączał się co sekundę. Wtedy "na oko" stwierdzisz co jest nie tak.
  • #12
    qutrit
    Level 20  
    :arrow: Jaca - gdy zwiększam delay(>20ms) to świecą się tylko w sposób ciągły dwie jedynki na dwóch pierwszych wyświetlaczach.
  • Helpful post
    #13
    Jaca
    Level 31  
    To teraz ręcznie podawaj stan "0" na wybraną katodę (na pozostałe "1") i zobacz czy na wybranym wyświetlaczu wyświetli się odpowiednia cyfra.
  • #14
    qutrit
    Level 20  
    Więc tak. Kupiłem trzy wyświetlacze BC56-12EWA wspólna katoda. W poprzednim urządzeniu które zbudowałem zastosowałem jeden z tych wyświetlaczy ze współpracą z atmega32 i układ działał poprawnie. Teraz do innych celów zastosowałem drugi wyświetlacz i nową atmege32 i zaczęły się powyżej opisane problemy. Otóż okazuje się ze wyświetlacz poprawnie wyświetla cyfry wtedy, gdy pozmieniam operatory dokładnie, tak jak wyżej wspominał asembler.
    Wytłumaczenie widzę jedno. Sprzedawca sprzedał mi dwa wyśw. wspólna katoda i jeden wspólna anoda. I na pewno wyświetlacz ze wspólną anodą, (może kiedyś to sprawdzę) został zamontowany w urządzeniu. A ja nie zwróciłem na to uwagi.
    Dziękuję za pomoc i cierpliwość.
  • #15
    margas4542
    Level 16  
    Zobacz ten kod - jest to zegarek z wyświetlaniem czasu lokalnego , utc oraz daty..korzysta z PCF8583..multiplex na 6 cyfr..proc to atmega32 16mHz.
    Code:

    #include <stdint.h>
    #include <avr/io.h>
    #include <stdlib.h>
    #include <avr/interrupt.h>
    #include <avr/delay.h>
    //********** funcje obsługi TWI dla rtc
    #define zegar 0xA2             // A0 rtc do plusa
    #define ACK 1
    #define NOACK 0
    static void TWI_start(void)
    {
       TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
       while (!(TWCR & (1<<TWINT)));
    }
    static void TWI_stop(void)
    {
       TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
    }
    void TWI_write(unsigned char scalak,unsigned char adres_rejestru,unsigned char liczba)
    {
       TWCR =(1 << TWINT) | (1 << TWSTA) | ( 1 << TWEN );
       while(!(TWCR & (1 << TWINT)));   
       TWDR =scalak;   
       TWCR =(1 << TWINT) | (1 << TWEN);
       while(!(TWCR & (1 << TWINT)));   
       TWDR =adres_rejestru;   
       TWCR =(1 << TWINT) | (1 << TWEN);
       while(!(TWCR & (1 << TWINT)));   
       TWDR =liczba;   
       TWCR =(1 << TWINT) | (1 << TWEN);
       while(!(TWCR & (1 << TWINT)));   
       TWCR =(1 << TWINT) | (1<<TWEN) | (1<<TWSTO);
    }
    unsigned char TWI_read(unsigned char scalak,unsigned char adres_rejestru)
    {
       unsigned char odczyt;       
       TWCR =(1 << TWINT) | (1 << TWSTA) | ( 1 << TWEN );
       while(!(TWCR & (1 << TWINT)));   
       TWDR =scalak;   
       TWCR =(1 << TWINT) | (1 << TWEN);
       while(!(TWCR & (1 << TWINT)));   
       TWDR =adres_rejestru;   
       TWCR =(1 << TWINT) | (1 << TWEN);
       while(!(TWCR & (1 << TWINT)));   
       TWCR =(1 << TWINT) | (1 << TWSTA) | ( 1 << TWEN );
       while(!(TWCR & (1 << TWINT)));   
       TWDR =scalak | 0x01;   
       TWCR =(1 << TWINT) | (1 << TWEN);
       while(!(TWCR & (1 << TWINT)));   
       TWCR =(1 << TWINT) | (1 << TWEN);
       while(!(TWCR & (1 << TWINT)));   
       odczyt =TWDR;   
       TWCR =(1 << TWINT) | (1<<TWEN) | (1<<TWSTO);
       return(odczyt);
    }
    //********** funkcje konwersji   
    char dec_na_bcd(char num)   {return ((num/10 * 16) + (num % 10));}   //set = dec_na_bcd(set);     
    char bcd_na_dec(char num)   {return ((num/16 * 10) + (num % 16));}   //set = bcd_na_dec(set);
    //********** definicje zmiennych dla zegara
    unsigned char PCF_tmp;
    unsigned char PCF_dl,PCF_jl,PCF_dmc,PCF_jmc,PCF_ddni,PCF_jdni;         //odczyt daty
    unsigned char PCF_dg,PCF_jg,PCF_dm,PCF_jm,PCF_ds,PCF_js,PCF_dss,PCF_jss;//odczyt czasu
    unsigned char dutc,jutc,leddis1,leddis2,leddis3,leddis4,leddis5,leddis6;//czas i data po konwersji
    //********** definicje zmiennych dla menu
    unsigned char wyswietlacz,leddis,funkcja,tryb,enter;
    unsigned char set_h,set_hh,set_hhh,set_m,set_mm,set_mmm;
    //********** define segmentów wyświetlacza
    const unsigned char cyfra[12]={
                0xC0,/*cyfra 0        A             */
                0xF9,/*cyfra 1       ---            */
                0xA4,/*cyfra 2      |   |           */
                0xB0,/*cyfra 3    F |   | B         */
                0x99,/*cyfra 4      |   |           */
                0x92,/*cyfra 5    G  ---            */
                0x82,/*cyfra 6      |   |           */
                0xF8,/*cyfra 7    E |   | C         */
                0x80,/*cyfra 8      |   |           */
                0x90,/*cyfra 9       ---            */
                0x7F,/*kropka         D     #   H   */
             0xFF,/*segmenty wygaszone         */
                };
    //***** MAIN
    int main()
    {
     DDRA=0xFF;               //wyjścia - segmenty wyświetlaczy wyś_1 oraz wyś_2
     DDRB=0xFF;               //wyjścia - cyfry wyświetlacza czasu lokalnego
     DDRC=0xFC;               //wyjścia pomocnicze- wejścia - SCL SDA układu rtc8583
     PORTC=0x03;               //pull-up - dla SCL SDA INT1 układu rtc8583
     DDRD=0x00;               //wejścia - klawiatura
     PORTD=0xF8;               //pull-up - klawiatura
    //----- TWI init
     TWSR=0x00;     
     TWBR=0x48;               //preskaler I2C - ((F_CPU / 100000UL - 16)
     TCCR1B |= (1 << WGM12);   //ustawia timer1 w tryb CTC
     OCR1A = 5000;            //ustawia wartość 50Hz na segment wyświetlacza
     TCCR1B |= (1 << CS10);      //ustawia timer z preskalerem Fcpu/1
     TIMSK |= (1 << OCIE1A);   //zezwolenie na przerwania dla CTC
     sei();
    //********** pętla główna progranu
     while(1)
     {
       PCF_tmp=TWI_read(zegar,0x01);   PCF_dss=PCF_tmp >>4;      PCF_jss=PCF_tmp & 0x0F;   //odczyt setnych sekund
       if(PCF_jss==0)//jeżeli setne sekundy zero to odczyt z PCF-a
       {
          PCF_tmp=TWI_read(zegar,0x10);   PCF_dl=PCF_tmp >>4;      PCF_jl=PCF_tmp & 0x0F;   //odczyt lat
          PCF_tmp=TWI_read(zegar,0x06);   PCF_dmc=PCF_tmp >>4;   PCF_jmc=PCF_tmp & 0x0F;   //odczyt miesięcy
          PCF_tmp=TWI_read(zegar,0x05);   PCF_ddni=PCF_tmp >>4;   PCF_jdni=PCF_tmp & 0x0F;//odczyt dni
          PCF_tmp=TWI_read(zegar,0x04);   PCF_dg=PCF_tmp >>4;      PCF_jg=PCF_tmp & 0x0F;   //odczyt godzin
          PCF_tmp=TWI_read(zegar,0x03);   PCF_dm=PCF_tmp >>4;      PCF_jm=PCF_tmp & 0x0F;   //odczyt minut
          PCF_tmp=TWI_read(zegar,0x02);   PCF_ds=PCF_tmp >>4;      PCF_js=PCF_tmp & 0x0F;   //odczyt sekund
       }
    //********** obsługa klawiszy
       if(!(PIND & _BV(5)))   {   _delay_ms(50);   funkcja++;   while(!(PIND & _BV(5)))   _delay_ms(50);   }
       if(!(PIND & _BV(6)))
       {
          if((funkcja==1)||(funkcja==5))
          {
              _delay_ms(300);
             if(++set_hhh >= 24)   {   set_hhh = 0;   }
              if(++set_h >= 10)   {   set_hh++;   set_h = 0;   }
             if((set_hh>=2)&&(set_h>=4)){   set_h=0;   set_hh=0;   }//jeżeli 24 godziny to wyzeruj
          }
          if(funkcja==2)
          {
              _delay_ms(300);
             if(++set_hhh >= 60)   {   set_hhh = 0;   }
              if(++set_h >= 10)   {   set_hh++;   set_h = 0;   }
             if((set_hh>=6)&&(set_h>=0)){   set_h=0;   set_hh=0;   }//jeżeli 60 minut to wyzeruj
          }
          if(funkcja==3)
          {
              _delay_ms(300);
             if(++set_hhh >= 32)   {   set_hhh = 0;   }
              if(++set_h >= 10)   {   set_hh++;   set_h = 0;   }
             if((set_hh>=3)&&(set_h>=2)){   set_h=0;   set_hh=0;   }//jeżeli 32 dni to wyzeruj
          }
          if(funkcja==4)
          {
              _delay_ms(300);
             if(++set_hhh >= 32)   {   set_hhh = 0;   }
              if(++set_h >= 10)   {   set_hh++;   set_h = 0;   }
             if((set_hh>=1)&&(set_h>=2)){   set_h=0;   set_hh=0;   }//jeżeli 12 miesięcy to wyzeruj
          }
       }
       if(!(PIND & _BV(7)))   {   enter=1;   }
    //********** funkcje wyswietlania i programowania
       switch(funkcja)
       {
          case 0://********** czas lokalny gmt oraz data
          if(!(PIND & _BV(4)))   {   _delay_ms(50);   tryb++;   while(!(PIND & _BV(4)))   _delay_ms(50);   }
          if(tryb==0)//czas lokalny
          {
             leddis1=bcd_na_dec(PCF_dg);      leddis2=bcd_na_dec(PCF_jg);      //konwersja na dec godziny
             leddis3=bcd_na_dec(PCF_dm);      leddis4=bcd_na_dec(PCF_jm);      //konwersja na dec minuty
             leddis5=bcd_na_dec(PCF_ds);      leddis6=bcd_na_dec(PCF_js);      //konwersja na dec sekundy
          }
          if(tryb==1)//czas gmt
          {
             dutc=bcd_na_dec(PCF_dg);      jutc=bcd_na_dec(PCF_jg);      //konwersja na dec godziny
             if((dutc==0)&&(jutc==0))   {   leddis1=2;   leddis2=3;   }
             if((dutc==0)&&(jutc==1))   {   leddis1=0;   leddis1=0;   leddis2=2;   }
             if((dutc==0)&&(jutc==2))   {   leddis1=0;   leddis2=1;   }
             if((dutc==0)&&(jutc==3))   {   leddis1=0;   leddis2=2;   }
             if((dutc==0)&&(jutc==4))   {   leddis1=0;   leddis2=3;   }
             if((dutc==0)&&(jutc==5))   {   leddis1=0;   leddis2=4;   }
             if((dutc==0)&&(jutc==6))   {   leddis1=0;   leddis2=5;   }
             if((dutc==0)&&(jutc==7))   {   leddis1=0;   leddis2=6;   }
             if((dutc==0)&&(jutc==8))   {   leddis1=0;   leddis2=7;   }
             if((dutc==0)&&(jutc==9))   {   leddis1=0;   leddis2=8;   }
    //------------------------------------------------------
             if((dutc==1)&&(jutc==0))   {   leddis1=0;   leddis2=9;   }
             if((dutc==1)&&(jutc==1))   {   leddis1=1;   leddis2=0;   }
             if((dutc==1)&&(jutc==2))   {   leddis1=1;   leddis2=1;   }
             if((dutc==1)&&(jutc==3))   {   leddis1=1;   leddis2=2;   }
             if((dutc==1)&&(jutc==4))   {   leddis1=1;   leddis2=3;   }
             if((dutc==1)&&(jutc==5))   {   leddis1=1;   leddis2=4;   }
             if((dutc==1)&&(jutc==6))   {   leddis1=1;   leddis2=5;   }
             if((dutc==1)&&(jutc==7))   {   leddis1=1;   leddis2=6;   }
             if((dutc==1)&&(jutc==8))   {   leddis1=1;   leddis2=7;   }
             if((jutc==1)&&(jutc==9))   {   leddis2=1;   leddis1=8;   }
    //------------------------------------------
             if((dutc==2)&&(jutc==0))   {   leddis1=1;   leddis2=9;   }
             if((dutc==2)&&(jutc==1))   {   leddis1=2;   leddis2=0;   }
             if((dutc==2)&&(jutc==2))   {   leddis1=2;   leddis2=1;   }
             if((dutc==2)&&(jutc==3))   {   leddis2=2;   leddis1=2;   }

             leddis3=bcd_na_dec(PCF_dm);      leddis4=bcd_na_dec(PCF_jm);      //konwersja na dec minuty
             leddis5=bcd_na_dec(PCF_ds);      leddis6=bcd_na_dec(PCF_js);      //konwersja na dec sekundy
          }
          if(tryb==2)//data
          {
             leddis1=bcd_na_dec(PCF_dmc);   leddis2=bcd_na_dec(PCF_jmc);   //konwersja na dec miesięcy
             leddis3=bcd_na_dec(PCF_ddni);   leddis4=bcd_na_dec(PCF_jdni);   //konwersja na dec dni
             leddis5=bcd_na_dec(PCF_dl);      leddis6=bcd_na_dec(PCF_jl);      //konwersja na dec lat
             _delay_ms(2000);   tryb=0;
          }
          break;
          case 1://********** ustaw czas lokalny godziny
          leddis1=set_hh;   leddis2=set_h;   leddis3=11;   leddis4=10;   leddis5=11;   leddis6=10;//LED DISPALY
          if(enter==1)
           {
              TWI_write(zegar,0x04,dec_na_bcd(set_hhh));   
              _delay_ms(200);   set_h=0;   set_hh=0;   set_hhh=0;   enter=0;   funkcja=2;
             }
          break;
          case 2://********** ustaw czas lokalny minuty
          leddis1=11;   leddis2=10;   leddis3=set_hh;   leddis4=set_h;   leddis5=11;   leddis6=10;//LED DISPALY
          if(enter==1)
           {   
              TWI_write(zegar,0x03,dec_na_bcd(set_hhh));   _delay_ms(100);   
              _delay_ms(200);   set_h=0;   set_hh=0;   set_hhh=0;   enter=0;   funkcja=0;
             }
          break;
          case 3://********** ustaw date dni
          leddis1=set_hh;   leddis2=set_h;   leddis3=11;   leddis4=10;   leddis5=11;   leddis6=10;//LED DISPALY
          if(enter==1)
           {   
              TWI_write(zegar,0x05,dec_na_bcd(set_hhh));   _delay_ms(100);   
              _delay_ms(200);   set_h=0;   set_hh=0;   set_hhh=0;   enter=0;   funkcja=4;
             }
          break;
          case 4://********** ustaw date miesiące
          leddis1=11;   leddis2=10;   leddis3=set_hh;   leddis4=set_h;   leddis5=11;   leddis6=10;//LED DISPALY
          if(enter==1)
           {   
              TWI_write(zegar,0x06,dec_na_bcd(set_hhh));   _delay_ms(100);   
              _delay_ms(200);   set_h=0;   set_hh=0;   set_hhh=0;   enter=0;   funkcja=5;
             }
          break;
          case 5://********** ustaw date lata
          if(!(PIND & _BV(5)))   {   _delay_ms(50);   funkcja=8;   while(!(PIND & _BV(5)))   _delay_ms(50);   }
          leddis1=11;   leddis2=10;   leddis3=11;   leddis4=10;   leddis5=set_hh;   leddis6=set_h;//LED DISPALY
          if(enter==1)
           {   
              TWI_write(zegar,0x10,dec_na_bcd(set_hhh));   _delay_ms(100);   
              _delay_ms(200);   set_h=0;   set_hh=0;   set_hhh=0;   enter=0;   funkcja=0;
             }
          break;
          case 8:
          funkcja=0;
          break;
       }
    }
    return 0;
    }
    //********** wyswietlanie multipleksowane
    ISR(TIMER1_COMPA_vect)
    {
       switch(wyswietlacz)
       {
          case 0://------cyfra nr 1 port PB2
          PORTC=0xFC;
          PORTB = 0xFB;    PORTA = cyfra[leddis1];   wyswietlacz++;
          break;
          case 1://------cyfra nr 2 port PB3
          PORTB = 0xF7;    PORTA = cyfra[leddis2];   wyswietlacz++;
          break;
          case 2://------cyfra nr 3 port PB4
          PORTB = 0xEF;    PORTA = cyfra[leddis3];   wyswietlacz++;
          break;
          case 3://------cyfra nr 4 port PB5
          PORTB = 0xDF;    PORTA = cyfra[leddis4];   wyswietlacz++;
          break;
          case 4://------cyfra nr 5 port PB6
          PORTB = 0xBF;    PORTA = cyfra[leddis5];   wyswietlacz++;
          break;
          case 5://------cyfra nr 6 port PB7
          PORTB = 0x7F;    PORTA = cyfra[leddis6];   wyswietlacz++;
          break;//----------------------------------------------
          case 6:
          wyswietlacz=0;
          break;
       }
       if(tryb==0)//diody led informujace o trybie wyświetlania
       {
          PORTC &=~ _BV(5);//czerwona czas lokalny
       }
       if(tryb==1)
       {
          PORTC &=~ _BV(6);//zielona czas gmt
       }
       if(tryb==2)
       {
          PORTC |= _BV(5);//obie wygaszone
          PORTC |= _BV(6);
       }
    }