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

Korzystanie z przetwornika ADC w ATMega8

nelik1987 25 Paź 2009 16:23 2542 7
REKLAMA
  • #1 7173546
    nelik1987
    Poziom 31  
    Witam pisze program do procesora atmega8 i mam problem bo chciałem skorzystać z 4 przetworników ADC a kolejne piny ADC czyli tak gdzie jest ADC4 i dalej chciałem wykorzystać jako wejścia, problem polega na tym, że jak uruchomię przetwornik odczytam dane z rejestru przetwornika i wyłączę go to potem w dalszej części programu nie mogę odczytać nic na pozostałych pinach tego portu, (nie odczytuje czy stan jest wysoki czy niski) dlaczego tak się dzieje czy trzeba coś jeszcze w rejestrach wyłączyć po odczytaniu stanu przetworników żeby móc korzystać z pozostałych pinów tego rejestru, dokładnie jest to rejestr C
  • REKLAMA
  • #2 7173626
    michalko12
    Specjalista - Mikrokontrolery
    Napisz po polsku o co Ci chodzi!
  • REKLAMA
  • REKLAMA
  • #4 7173925
    dawid512
    Poziom 32  
    W takim razie pokaż kod.
  • #5 7173974
    nelik1987
    Poziom 31  
    while(1)  // Program główny
    {
    
    /////////////////SPRAWDZANIE PRZYCISKÓW /////////////////////
    
    if(TCNT1>=1250) 	// jeżeli mineło 10 ms - sprawdz przyciski
    	{
    	
    	// Sprawdzanie przycisku 0 //
    	if(bit_is_clear(PINC,0)) //jeżeli przycisk 1 wciśnięty
    		{
    		sw0=1;
    
    		}
    	else
    		{
    		sw0=0;
    		}
    	
    	
    	// Sprawdzanie przycisku 1 //
    		if(bit_is_clear(PINC,1)) //jeżeli przycisk 1 wciśnięty
    		{
    		sw1=1;
    
    		}
    	else
    		{
    		sw1=0;
    		}
    	
    	
    	if(sw0==1 && sw1==1) // zapobieganie wcisnięciu 2 klawiszy na raz
    		{
    		sw0=0;
    		sw1=0;
    		}
    	
    	
    /////////////////////// PRZETWORNIK ADC	
    	
    
    ADCSR = _BV(ADEN)|_BV(ADIE)|_BV(ADFR)|_BV(ADSC)|_BV(ADPS0)|_BV(ADPS1); //ustawienia przetwornika ADC	
    	
    	
    		// lewo prawo - prawy joystick
    		ADMUX = 3;    		// wybierz kanał 0 przetwornika ADC
    		value = ADCW;
    		if(value<=zakres)
    			{
    			LCD_GoTo(10,1);	
    			LCD_WriteData(2);
    			sw0=1;
    			}
    		else
    			{
    			if(value>=1023-zakres)
    				{
    				LCD_GoTo(10,1);	
    				LCD_WriteData(3);
    				sw1=1;
    				}
    			else
    				{
    				LCD_GoTo(10,1);	
    				LCD_WriteText(" ");
    				sw0=0;
    				sw1=0;
    				}
    			}
    		LCD_GoTo(11,1);	
    		LCD_WriteText("    ");	//czyszczenie zbędnych znaków		
    		LCD_GoTo(11,1);	  	//(kolumny, wiersze)
    		itoa(value,buf,10);
    		LCD_WriteText(buf);		
    
    ADCSR = ~_BV(ADEN)|~_BV(ADIE)|~_BV(ADFR)|~_BV(ADSC)|~_BV(ADPS0)|~_BV(ADPS1);
    	
    //ADCSR = 0x00; //wyłączenie przetwornika ADC		
    	
    
    	
    //////////////////////////// KONIEC PRZETWORNIKA ADC	
    
    	
    	TCNT1=0; 	
    	}
    
    
    /////////////////// ODLICZANIE CZASU ///////////////////////
    
    if(TCNT0>=100) 		// jeżeli mineło ok 100 us
    {
    	a1++;
    	if(a1>=k1)
    		{
    		pozowlenie1=1;
    		a1=0;
    		}
    
    }
    
    
    /////////////// WYKONYWANIE PRZEŁĄCZEŃ /////////////////////
    
    if(pozowlenie1==1 && sw0==1)
    		{
    		y++;
    		if(y==5)
    		y=1;
    		pozowlenie1=0;
    		//sw0=0;
    		}
    
    if(pozowlenie1==1 && sw1==1)
    		{
    		y--;
    		if(y==0)
    		y=4;
    		pozowlenie1=0;
    		//sw1=0;
    		}
    
    
    
    switch(y)
    	{
    	case 1 :
    	TRA0_ON;
    	TRA1_OFF;
    	TRA2_OFF;
    	TRA3_OFF;
    	break;
    	
    	case 2 :
    	TRA0_OFF;
    	TRA1_OFF;
    	TRA2_ON;
    	TRA3_OFF;
    	break;
    	
    	case 3 :
    	TRA0_OFF;
    	TRA1_ON;
    	TRA2_OFF;
    	TRA3_OFF;
    	break;		
    	
    	case 4 :
    	TRA0_OFF;
    	TRA1_OFF;
    	TRA2_OFF;
    	TRA3_ON;
    	break;	
    	}
    
    
    
    }
    }
    
  • #6 7174039
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Pomijając fakt, że twój odczyt ADC nie ma prawa działać (słyszałeś o rozpoczęciu konwersji PO ustawieniu kanału? oczekiwaniu na jej koniec? w ogóle ciekawe od kiedy 0 w ADMUX odpowiada kanałowi 3...) to chciałbym tylko napisać, że wynikiem czegoś takiego:

    ~_BV(ADEN)|~_BV(ADIE)|~_BV(ADFR)|~_BV(ADSC)|~_BV(ADPS0)|~_BV(ADPS1);

    Jest na 99% 0xFF (ewentualnie może przypadkiem mieć jakiś bit wyczyszczony).

    0b1110 | 0b1101 | 0b1011 | 0b01111 = 0b1111

    Jak chcesz wyłączyć przetwornik, to po prostu wpisz do ADCSR wartość 0.

    4\/3!!
  • REKLAMA
  • #7 7174645
    Konto nie istnieje
    Poziom 1  
  • #8 7174691
    nelik1987
    Poziom 31  
    to akurat było zakomentowane, ale odkomentowałem to bo coś tam zmieniałem, sprawdzałem stan z PC4 i PC5 i właśnie mi nie działało, postaram się jutro to sprawdzić, bo dzisiaj nie mam procka
REKLAMA