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

Atmega32 mulipleksowanie LED nakładające się symbole

qutrit 02 Sty 2011 18:33 2123 14
REKLAMA
  • #1 8948252
    qutrit
    Poziom 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.
    
    #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
  • REKLAMA
  • Pomocny post
    #2 8948310
    Karol966
    Poziom 31  
    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.
  • Pomocny post
    #3 8948386
    asembler
    Poziom 32  
    Spróbuj najpier wystawić informacje o znaku a potem dopiero właczyć wyświetlacz.
  • #4 8948408
    qutrit
    Poziom 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.
  • REKLAMA
  • Pomocny post
    #5 8948461
    asembler
    Poziom 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 8948553
    qutrit
    Poziom 20  
    :arrow: asembler
    Teraz jest tak :
    
       case 0:
       funkcja_ON;
       PORTD = (1<<0); //znak[1];
       wysw++;
       break;
     

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


    Bez zmian. Chyba ze Cię nie rozumiem :(
  • Pomocny post
    #7 8948566
    asembler
    Poziom 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.
  • REKLAMA
  • #8 8948654
    qutrit
    Poziom 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.
  • Pomocny post
    #9 8948970
    asembler
    Poziom 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 8949240
    qutrit
    Poziom 20  
    Więc po wstawieniu "swich(wysw)" do "while(1)" i zakomentowaniu przerwania tzn.
    
    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 !!
  • Pomocny post
    #11 8949350
    Jaca
    Poziom 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.
  • REKLAMA
  • #12 8949400
    qutrit
    Poziom 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.
  • Pomocny post
    #13 8949426
    Jaca
    Poziom 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 8950101
    qutrit
    Poziom 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 8954297
    margas4542
    Poziom 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.
    
    #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);
    	}
    }
    
REKLAMA