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

[Atmega64][C]ADC uszkodzony jeden kanał?

Co_pat 23 Sty 2010 13:42 1799 3
REKLAMA
  • #1 7578404
    Co_pat
    Poziom 15  
    Witam!

    Na początek kod:
    
    
    #define F_CPU 16000000UL
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
    #include "HD44780.h"
    
    #define Set(reg, bit) ((reg) |= (0x01 << (bit)))						// Ustawienie danego bitu w rejestrze
    #define Clr(reg, bit) ((reg) &= ~(0x01 << (bit)))						// Wyzerowanie danego bitu w rejestrze
    #define Flip(reg,bit) ((reg) ^= (0x01 << (bit)))							// Set(PORTD, PD7)	
    
    
    #define BitIsSet(reg, bit) ((reg) & (0x01 << bit))						// Sprawdzenie czy dany bit jest ustawiony
    #define BitIsClr(reg, bit) (((reg) & (0x01 << bit)) ^ (0x01 << bit))	// Sprawdzenie czy dany bit jest wyzerowany
    
    #define odswierzanie 1000
    
    void Init(void){
    	
    	DDRA=0xFF;												//port A,B,C jako wyjscie
    	DDRB=0xFF;
    	DDRC=0xFF;
    
    	DDRF=0x00;												//port F jako wejscie
    	PORTF=0x00;												//bez podciagniecia do Vcc
    
    	DDRD=0x00;												//Potr D jako wejścia
    	PORTD=0xFF;												//z podciagnieciem do Vcc
    }
    
    void InitADC()												// Inicjalizacja przetwornika A/C
    {
    ADMUX |=(1<<ADLAR); 										// Wybranie sposobu zapisu wyniku z wyrównaniem do lewej (osiem starszych bitów wyniku w rejestrze ADCH)
    ADCSRA|=(1<<ADEN);
    ADCSRA|=(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);					// Zezwolenie na konwersję ADEN, preskaler 128
    }
    
    int ReadADC(char channel)
    {
      ADMUX &= ~((1<<MUX2)|(1<<MUX1)|(1<<MUX0));				// Wyzerowanie numeru kanału
      ADMUX |= channel;											// Wybór żądanego kanału
      
      ADCSRA|= (1<<ADSC);										// Rozpoczęcie konwersjii
      while(BitIsClr(ADCSRA,ADIF));								// Oczekiwanie na zakończenie konwersji
      
      return ADCH;
    }
    
    int main(){
    int wynik,wynik2,lcd=0;
    
    
    	Init();
    	InitADC();
    	LCD_Initalize();      // Inicjalizacja wyswietlacza
    	LCD_Clear(); 
    	sei();										 //Włączenie obsługi przewań, wykonać po włączeniu zezwoleń 
    while(1){
    
    
    
    if(++lcd == odswierzanie)
    			{
    				lcd = 0;
    				LCD_Clear();						
    				LCD_GoTo(0,0);
    				LCD_WriteText(IntToText(wynik));
    				LCD_GoTo(0,1);  
    				LCD_WriteText(IntToText(wynik2));
    			}
    
    
    wynik2=ReadADC(2);
    wynik=ReadADC(7);
    
    
    }}
    
    



    Problem polega na tym, że odczyt z kanału 7 jest cały czas na stałym poziomie tzn. przy zmianie napięcia 1-3V odczyt cały czas jest ok 210 gdzie powinien wynosić max 160. Inne kanały działają prawidłowo. Spróbowałem podłączyć napięcie bezpośrednio pod nóżkę Atmegi aby wyeliminować błędy na płytce ale efekt jest ten sam. Czy jest możliwe, że ten kanał jest uszkodzony w Atmedze?
  • REKLAMA
  • #2 7581783
    OlekM
    Poziom 17  
    To może nie pomóc, ale proszę spróbować zmienić linię:
    while(BitIsClr(ADCSRA,ADIF));
    na:
    while(BitIsSet(ADCSRA,ADSC));

    Ponadto widzę, że bity REFS nie są ustawione w ADMUX, zatem rozumiem, że do pinu AREF jest dostarczone zewnętrzne napięcie odniesienia.
  • REKLAMA
  • #3 7581971
    Konto nie istnieje
    Konto nie istnieje  
  • #4 7582936
    Co_pat
    Poziom 15  
    Tak mam zewnętrzne napięcie referencyjne. Dokonałem zmiany na while(BitIsSet(ADCSRA,ADSC)); ale nic nie zmieniło. Dodatkowo zauważyłem taką zależność: gdy pod pin nie jest podłączone napięcie wynik jest równy 255 natomiast gdy podłącze napięcie wynik jest ok 210 bez różnicy na wysokość napięcia.
REKLAMA