Witm serdecznie,
mam kilka pytan dotyczących mojego programu. Na poczatek kod:
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
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