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

Atmega128 i przetwornik ADC

piwcci 17 Wrz 2009 20:32 1963 5
REKLAMA
  • #1 7029224
    piwcci
    Poziom 12  
    Witm serdecznie,
    mam kilka pytan dotyczących mojego programu. Na poczatek kod:
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <stdlib.h>
    
    #define F_CPU 14.7456E6
    
    #define BAUD 9600
    #define MYUBRR F_CPU/16/BAUD-1
    
    void USART_Init( unsigned int baud ) { 
    		UBRR0H = (unsigned char)(baud>>8); 
    		UBRR0L = (unsigned char)baud;  
    		UCSR0A = 0;
    		UCSR0B = 0; 
    		UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
    }
    
    void ADC_Init(){
    	ADMUX = 0x40;		// VREF=01 | DLAR=0 | MUX=00000
    	ADCSRA = 0xEF;		// ADEN=1 | ADSC=1 | ADFR=1 | ADIE=1 | ADPS=111
    }
    
    void transmit0(char * text){
    
    	while(*text){									
    		while ( !( UCSR0A & (1<<UDRE0)) );
    			UDR0 = *text;							
    			text++;								
    	}
    
    }
    
    void trans_char(char x){
    	
    		while ( !( UCSR0A & (1<<UDRE0)) );
    		UDR0 = x;	
    }
    
    char adh, adl;
    
    SIGNAL(SIG_ADC){
    	adh = ADCH;
    	adl = ADCL;
    
    	trans_char(adh);
    	trans_char(adl);
    	trans_char(',');
    }
    
    int main(){
    
    USART_Init(MYUBRR);
    UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);
    ADC_Init();
    sei();
    
    while(1){
    
    }
    
    return 0;
    }
    


    Zadaniem programu jest dokonywanie pomiarów na wejściu ADC0 (i tylko ten pin jest uzywany) oraz bezpośrednie wysyłanie wyników na port szeregowy. Zastosowany kwarc to 14.7456 MHz. Przetwornik AD pracuje w trybie Free Run Mode a odczyt wartości został zrealizowany na przerwaniu. Teraz pytania:
    1. Czy jeżeli korzystam tylko z ADCO to co z reszta wejśc(ADC1 - ADC7) mogą zostać niepodpięte czy połączyc z masą???
    2. Jako źródło napięcia odniesienia wybrałem AVCC, co w takim wypadku zrobic z pinem VREF???? Podpiąć przez kondensator do masy????
    3. Zastanawia mnie czy dobrze, że wysyłanie danych odbywa sie w przerwaniu. Pomiar zajmuje przetwornikowi okolo 13 taktów. Dla zastosowanej wartości kwarcu i przeskalowaniu jej przez 128 jeden pomiar zajmuje okolo 112,8us, natomiast wysłanie dwóch bajtów z prędkościa 9600 to około 2ms.(mam nadzieje ze nie popełniłem błędu w obliczeniach). Z tego wynika, że zanim zakończy sie wysyłanie tych dwóch bajtów to wynik z następnego pomiaru jest juz gotowy. W takim wypadku uruchamiane jest kolejne przerwanie zanim zakonczy sie to poprzednie czy nadchodzące przerwanie oczekuje na zakonczenie poprzedniego????

    z góry bardzo dziekuję za pomoc
    Pozdrawiam
  • REKLAMA
  • Pomocny post
    #2 7029978
    maciek_slon
    Poziom 29  
    3) Generalnie na początku makra SIGNAL wyłączane są przerwania (funkcja cli), a na końcu są odblokowywane (sei), tak więc nie ma zagnieżdżenia przerwań, po prostu niektóre pomiary gubisz.

    2) wg noty katalogowej do masy przez kondensator

    1) jeśli ich nie używasz, to należy je ustawić jako WYJŚCIE, i można na nich ustawić stan 0. Nie powinny wisieć w powietrzu jako wejścia.
  • REKLAMA
  • #3 7030129
    piwcci
    Poziom 12  
    A czy te moje obliczenia sie zgadzaja???? Generalnie chodzi o to czy predkosc 9600 oznacza bps czy ilosc symboli(bajtów) na sekunde????
  • REKLAMA
  • #4 7030302
    simbo_
    Poziom 11  
    9600 bps oznacza "bit per second" czyli bitów na sekundę.

    Generalnie nie powinieneś wysyłać w przerwaniu od ADC, należałoby napisać drugie przerwanie od wysyłania po UART.

    Jeżeli używasz SIGNAL to i tak automatycznie masz blokowane przerwania inne, zalecane jest używanie ISR().

    Pozostałe wejscia ADC1-7 nie mają wpływu na pomiary na ADC0 - wewnętrzny multiplekser do przetwornika ADC je odcina.
  • REKLAMA
  • #5 7030362
    _Robak_
    Poziom 33  
    9600 nie tyczy bits per second tylko baud per second ! Roznica jest taka ze liczysz do tego znaki stopu, startu i parzystosci. I fakt, jesli masz 9600 to jeden bajt zajmuje nieco ponad 1ms, mozesz liczyc spokojnie 1.1ms.
  • #6 7030977
    kwesoly
    Poziom 15  
    simbo_ napisał:

    Jeżeli używasz SIGNAL to i tak automatycznie masz blokowane przerwania inne, zalecane jest używanie ISR().


    Niezależnie czego używa w AVR-GCC inne przerwania są hardware'owo blokowane do czasu instrukcji reti, więc o ile faktycznie zaleca sie używanie ISR, o tyle bez dodatkowyh paramatetrów niczym się te dwie wersje funkcjonalnie nie różnią.
REKLAMA