По Вашей просьбе написал код для двух каналов ADC для ATMega8. Чтобы не возиться с написанием кода программы, программа создана при помощи генератора кодов CV_AVR. Программа промоделирована в Proteus’e. Программа снабжена подробными комментариями. Файлы программы и рисунки генератора кодов во вложении.
siamds писал(а):По Вашей просьбе написал код для двух каналов ADC для ATMega8. Чтобы не возиться с написанием кода программы, программа создана при помощи генератора кодов CV_AVR. Программа промоделирована в Proteus’e. Программа снабжена подробными комментариями. Файлы программы и рисунки генератора кодов во вложении.
вечерком посмотрю
Мастер на все руки, кручу, кручу, кручу и матерюсь Повелитель паяльной станции, лома, и пинцета!!!
shurikss123 писал(а):ниче не пойму не работает хоть убей
Давайте разбираться почему не работает. Каким компилятором Вы пользуетесь, и какой симулятор установлен на Вашем компьютере? Программу скачали 11 наших коллег – обратиться к ним работает ли программа у них?
Вот если найдется тут такой человек, который подскажет ему, что для поиска "глюка" нужно выложить полностью секретный проект, тогда это действительно поможет.....
C@at писал(а):Вот если найдется тут такой человек, который подскажет ему, что для поиска "глюка" нужно выложить полностью секретный проект, тогда это действительно поможет.....
Jack_A как вы узнали что все сопрут? Уже все стырено в личное пользование ...... и спрятано здесь. Спасибо siamds за труд, весьма простой наглядный пример + коментарии!
Для ICCAVR есть готовое решение. Несложно портировать в WinAVR, CodeVisionAVR etc. Привожу сразу с функциями УАРТА, так как применяется отсылка строк из Флеша и РАМа. Проверял на ATMega8 и 32 (никакой разницы).
Главная функция в проекте для чтения АЦП и отправки по УАРТУ - ADC_transmitValue(). Остаётся в функции main вписать её в нужном вместе. Ну и инициализауию АЦП и УАРТа - ADC_init() и uart0_init() PS - В функции ADC_transmitValue() надо поставить необх. кол-во каналов. Спойлер
// Do a Analog to Digital Conversion ********************************************** int ADC_read(void) { char i; int ADC_temp, ADCH_temp; int ADC_var = 0;
ADC_ENABLE;
ADC_START_CONVERSION; //первый раз вычитываем всякий мусор из АЦП
while(!(ADCSRA & 0x10)); //Ждём, флага окончания преобразования. ADIF flag active ADCSRA|=(1<<ADIF);
for(i=0;i<8;i++) //Считывание 8 раз для усреднения и повышения точности (потом поделим на 8) { ADC_START_CONVERSION; while(!(ADCSRA & 0x10)); // wait for conversion done, ADIF flag active ADCSRA|=(1<<ADIF);
ADC_temp = ADCL; // read out ADCL register ADCH_temp = ADCH; // read out ADCH register ADC_temp +=(ADCH_temp << 8); ADC_var += ADC_temp; // accumulate result (8 samples) for later averaging }
ADC_var = ADC_var >> 3; //усредняем выборку из 8 преобразований
ADC_DISABLE;
return ADC_var; }
//To calculate Voltage ************************************************* float ADC_calculateValue(int inputValue) { float actualValue; actualValue=(inputValue * Vref/1024.0); //calculates the voltage present return actualValue; }
//To update the valueDisplay string based on the latest voltage read ************************ unsigned char* updateDisplay(float actualValue) {
int temp; unsigned char c; temp=(int)(actualValue*100.0); //to include decimal point for display
//to transmit the voltage values at 8 ADC channels ******************************* void ADC_transmitValue(void) { int value; float value1; unsigned char i;
for(i=0; i<8; i++) // вместо 8 устанавливаем необходимое кол-во или выбранные номера каналов АЦП !!! { ADMUX &= 0xe0; ADMUX |= i; //ВЫБИРАЕМ КАНАЛ value = ADC_read(); value1 = ADC_calculateValue(value);
//following three functions are part of the UART routines, sending the //voltage values to serial port. UART must be initialized before //calling them
//Function to receive a single byte ********************** unsigned char receiveByte( void ) { unsigned char data, status;
while(!(UCSRA & (1<<RXC))); // Wait for incomming data
status = UCSRA; data = UDR;
return(data); }
//Function to transmit a single byte ************************* void transmitByte( unsigned char data ) { while ( !(UCSRA & (1<<UDRE)) ) ; //Wait for empty transmit buffer UDR = data; //Start transmition }
//Function to transmit a string stored in Flash ***************** void transmitString_F(const unsigned char* string) { while (*string) transmitByte(*string++); }
//Function to transmit a string from RAM //*************************************************** void transmitString(unsigned char* string) { while (*string) transmitByte(*string++); }
shurikss123 писал(а):ниче не пойму не работает хоть убей
Давайте разбираться почему не работает. Каким компилятором Вы пользуетесь, и какой симулятор установлен на Вашем компьютере? Программу скачали 11 наших коллег – обратиться к ним работает ли программа у них?