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

Atmega 32 problem z przerwaniem timer0

lordadam 30 Maj 2009 21:22 2686 2
REKLAMA
  • #1 6595828
    lordadam
    Poziom 10  
    Witam ,napisałem sobie następujący program który ma pełnić funkcję prowizorycznego zegarka. W obsłudze przerwania timer inkrementuję sobie sekundy , ale gdy chce wyświetlić je w main ciągle wyświetla zero na led. Natomiast gdy ostatnią linijkę kodu zamieszczę w obsłudze przerwania działa ok . W związku z tym moje pytanie jak zrobić, żeby przekazywać sekunde do main . Zamieszczam ponizej kod:

    #include <avr\io.h>
    #include <avr\interrupt.h>
    #include <avr\signal.h>
    #include <avr\delay.h>
    
    #define tau0 6;	//stała czasowa timera0
    
    
    //********************  zmienne globalne  *******************
    int licznik;	//Licznik rewersyjny, którego stan jest
    	//wyświetlany na linijce LED-ów
    int sekunda=0;
    int dsekunda = 0;
    int minuta = 0;
    int dminuta = 0;
    int kolumna=1;
    
    int convertion(int dana)
    {
    	int zwracana=0;
    	switch(dana)
    	{
    		case 0:
    			zwracana = 3;
    		break;
    
    		case 1:
    			zwracana = 159;
    		break;
    
    		case 2:
    			zwracana = 37;
    		break;
    
    		case 3:
    			zwracana = 13;
    		break;
    
    		case 4:
    			zwracana = 153;
    		break;
    
    		case 5:
    			zwracana = 73;
    		break;
    
    		case 6:
    			zwracana = 65;
    		break;
    
    		case 7:
    			zwracana = 31;
    		break;
    
    		case 8:
    			zwracana = 1;
    		break;
    
    		case 9:
    			zwracana = 9;
    		break;
    	}
    	return zwracana;
    }			
    
    int ktorakolumna(int k)
    {
    	int zwrkolumna=0;
    	switch(k)
    	{
    		case 1:
    			zwrkolumna = 7;
    		break;
    
    		case 2:
    			zwrkolumna = 11;
    		break;
    
    		case 3:
    			zwrkolumna = 13;
    		break;					
    
    		case 4:
    			zwrkolumna = 14;
    		break;
    	}
    	return zwrkolumna;
    }
    
    
    SIGNAL (SIG_OVERFLOW0)	//obsługa przerwania 
    	//od przepełnienia timera0
    {
     TCNT0=tau0;           
     		if(--licznik == 0)
    		{
    			PORTA^=0x01;
    			licznik = 4000;
    			sekunda ++;
    			if (sekunda>=10)
    			{
    				sekunda = 0;
    				dsekunda++;
    				if(dsekunda>=7)
    				{
    					dsekunda=0;
    					minuta++;
    					if(minuta>=10)
    					{
    						minuta=0;
    						dminuta++;
    						if(dminuta>=7)
    						{
    							dminuta++;
    						}
    					}
    				}
    			}
    
    
    		}
    }
    
    
    
    int main(void)
    {
     licznik=4000;
     //sekunda=0;
     //kolumna=1;
    
     DDRA = 0xFF;
     DDRB = 0xFF;
     DDRD = 0xFF;
     TIMSK=1<<TOIE0;
     TCNT0=tau0;           
     TCCR0=1;            
    	
     sei();                
      
     while(1)
     {
    	PORTD = ktorakolumna(kolumna);
    	kolumna++;
    	_delay_us(100);
    	if (kolumna==5)
    	{
    		kolumna =1;
    	}
    
    			PORTB = convertion(sekunda);
    	
     }
    }
    
    


    Za odpowiedź z góry dziękuję.
  • REKLAMA
  • #3 6595964
    lordadam
    Poziom 10  
    Dzięki podziałało
REKLAMA