|
|
 |
Ответов
|
Feb 18 2014, 07:19
|
Участник

Группа: Участник
Сообщений: 70
Регистрация: 30-11-10
Пользователь №: 61 275

|
Переделал код попроще, без прерываний. Со схемой проблемы, могу только сказать, что точно на входе Канала 1 осциллографом наблюдается 0, а выводится такое же напряжение, как у 1 канала, только меньше на вольт. По коду всё нормально? CODE #include "main.h"
volatile unsigned int send_flag = 0;
void init(){
// Порт A DDRA &= ~(1<<DDA0 | 1<<DDA1 | 1<<DDA2 | 1<<DDA3); PORTA &= ~(1<<PA0 | 1<<PA1 | 1<<PA2 | 1<<PA3); // Порт B DDRB |= (1<<DDB0) | (1<<DDB1); // Порт D DDRD &= ~(1<<DDD0); DDRD |= (1<<DDD1) | (1<<DDD2) | (1<<DDD7); // ????? 7 - ???????? //ADCSRA |= 1<<ADEN | 1<<ADIE | 1<<ADSC | 1<<ADPS0 | 1<<ADPS1 | 1<<ADPS2; // ?????????? ?????? ? ????????? ??????????????, ????????? ??????? (????????) ???
// UART UBRRH = 0; UBRRL = 15; // 57600 UCSRB |= (1<<RXEN) | (1<<RXCIE) | (1<<TXEN); // ????????? ?????????? ?? ?????? ? ???????? // ADC ADCSRA |= 1<<ADEN | /*1<<ADIE |*/ 1<<ADPS0 | 1<<ADPS1 | 1<<ADPS2; ADMUX |= (1<<REFS0); request[0] = 0; // ???????: 0x3A 0x01 0x00 0x3B request[1] = 0; request[2] = 0; request[3] = 0; // Dir_1 // Dir_1 // Dir_1 // Dir_1 // Dir_2 // Dir_2 // Dir_2 // Ain_0 // Ain_1 // Ain_2 // Ain_3 // Ain_0 // Ain_1 // Ain_2 //answer = {REQUEST_START, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
answer[0] = REQUEST_START; // Dir_1 Ain_0 answer[1] = 0; answer[2] = 0; answer[3] = 0; answer[4] = 0; // Dir_1 Ain_1 answer[5] = 0; answer[6] = 0; answer[7] = 0; answer[8] = 0; // Dir_1 Ain_2 answer[9] = 0; answer[10] = 0; answer[11] = 0; answer[12] = 0; // Dir_1 Ain_3 answer[13] = 0; answer[14] = 0; answer[15] = 0; answer[16] = 0; // Dir_2 Ain_0 answer[17] = 0; answer[18] = 0; answer[19] = 0; answer[20] = 0; // Dir_2 Ain_1 answer[21] = 0; answer[22] = 0; answer[23] = 0; answer[24] = 0; // Dir_2 Ain_2 answer[25] = 0; answer[26] = 0; answer[27] = 0; answer[28] = 0;
//flags.send_answer = 0;
rx_stage = 0; flag_Dir__Ain = 0; //flags.ADC_converts = 0; // Разрешили все прерывания: SREG |= 0b10000000; // ??? _delay_us(500); }
ISR(USART_RX_vect){ /* unsigned char a = UDR; if (rx_stage == 2) { PORTD = 1<<PD7; } rx_stage++; */ switch (rx_stage){ case WAITING_START: if (UDR == REQUEST_START){ request[rx_stage] = UDR; rx_stage++; } break;
case WAITING_COMMAND: request[rx_stage] = UDR; rx_stage++; break;
case WAITING_LRC_HIGH: request_lrc.byte.high = UDR; rx_stage++; break;
case WAITING_LRC_LOW: request_lrc.byte.low = UDR; rx_stage = 0; //flags.send_answer = 1; send_flag = 1; break; //default: // rx_stage = 0; //break; } }
ISR(ADC_vect) {
}
int main (void){
init(); while (1){ // Зондирование Dir_1, измерение Ain_0 flag_Dir__Ain = Dir_1__Ain0; set__in0_in1_in2_in3(OUTPUT_HIGH); form_impulse(DIR_1); set__in0_in1_in2_in3(INPUT); _delay_us(16); get_ADC_value(AIN_0); //DDRA |= (1<<DDA0 | 1<<DDA1 | 1<<DDA2 | 1<<DDA3); //PORTA &= ~(1<<PA0 | 1<<PA1 | 1<<PA2 | 1<<PA3); _delay_ms(10); flag_Dir__Ain = Dir_1__Ain1; set__in0_in1_in2_in3(OUTPUT_HIGH); form_impulse(DIR_1); set__in0_in1_in2_in3(INPUT); _delay_us(16); get_ADC_value(AIN_1); //DDRA |= (1<<DDA0 | 1<<DDA1 | 1<<DDA2 | 1<<DDA3); //PORTA &= ~(1<<PA0 | 1<<PA1 | 1<<PA2 | 1<<PA3); _delay_ms(10);
if (send_flag == 1){ PORTD |= 1<<PD2; // En = 1 _delay_ms(1); send_answer(); _delay_ms(1); PORTD &= ~(1<<PD2); // En = 0 flags.send_answer = 0; send_flag = 0; } } }
void set__in0_in1_in2_in3(unsigned char level) { if (level == INPUT) { DDRC &= ~(1<<DDC0 | 1<<DDC1 | 1<<DDC2 | 1<<DDC3); PORTC &= ~(1<<PC0 | 1<<PC1 | 1<<PC2 | 1<<PC3); } else if (level == OUTPUT_HIGH) { DDRC |= (1<<DDC0) | (1<<DDC1) | (1<<DDC2) | (1<<DDC3); PORTC &= ~(1<<PC0) | (1<<PC1) | (1<<PC2) | (1<<PC3); } }
void get_ADC_value(unsigned char line) { //ADCSRA |= 1<<ADEN; //flags.ADC_converts = 1; if (line == AIN_0) { ADMUX &= ~(1<<MUX0 | 1<<MUX1 | 1<<MUX2 | 1<<MUX3 | 1<<MUX4); } else if (line == AIN_1) { ADMUX |= 1<<MUX0; ADMUX &= ~(1<<MUX1 | 1<<MUX2 | 1<<MUX3 | 1<<MUX4); //ADMUX &= 0b11100001; } else if (line == AIN_2) { ADMUX |= 1<<MUX1; ADMUX &= ~(1<<MUX0 | 1<<MUX2 | 1<<MUX3 | 1<<MUX4); } else if (line == AIN_3) { ADMUX |= 1<<MUX1 | 1<<MUX0; ADMUX &= ~(1<<MUX2 | 1<<MUX3 | 1<<MUX4); } _delay_us(10); //ADCSRA |= 1<<ADEN | 1<<ADIE | 1<<ADSC | 1<<ADPS0 | 1<<ADPS1 | 1<<ADPS2; ADCSRA |= 1<<ADSC; //_delay_ms(10); while (!(ADCSRA & (1<<ADIF))); unsigned char byte_ADCL = ADCL; unsigned char byte_ADCH = ADCH; unsigned int uint_adch = (byte_ADCH << 8) | byte_ADCL; v_in.as_float = ((float)(VREF * uint_adch))/1024; if (flag_Dir__Ain == Dir_1__Ain0) { answer[1] = v_in.byte.first_high; answer[2] = v_in.byte.second; answer[3] = v_in.byte.third; answer[4] = v_in.byte.fourth_low; } else if (flag_Dir__Ain == Dir_1__Ain1) { PORTD = 1<<PD7; answer[5] = v_in.byte.first_high; answer[6] = v_in.byte.second; answer[7] = v_in.byte.third; answer[8] = v_in.byte.fourth_low; } else if (flag_Dir__Ain == Dir_1__Ain2) { answer[9] = v_in.byte.first_high; answer[10] = v_in.byte.second; answer[11] = v_in.byte.third; answer[12] = v_in.byte.fourth_low; } //ADCL = 0; //ADCH = 0; //ADCSRA &= ~(1<<ADEN); }
void send_byte(unsigned char data){ while(!(UCSRA & (1<<UDRE))); UDR = data; while(!(UCSRA & (1<<UDRE))); }
void send_answer() { for (unsigned char j = 0; j < 31; j++){ while(!(UCSRA & (1<<UDRE))); UDR = answer[j]; while(!(UCSRA & (1<<UDRE))); } }
void form_impulse(unsigned char line){ if (line == DIR_1) { PORTB |= (1<<PB0); _delay_us(10); PORTB &= ~(1<<PB0); } else if (line == DIR_2) { PORTB |= (1<<PB1); _delay_us(10); PORTB &= ~(1<<PB1); } }
void debug(){ PORTC |= 1<<PC4; for (unsigned long k = 0; k < 100000; k++){ asm("nop"); } PORTC &= ~(1<<PC4); }
Сообщение отредактировал IgorKossak - Feb 18 2014, 08:59
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
Feb 18 2014, 10:20
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(OlegALL @ Feb 18 2014, 09:19)  могу только сказать, что точно на входе Канала 1 осциллографом наблюдается 0, а выводится такое же напряжение, как у 1 канала, только меньше на вольт Осциллограф не показатель. Вы на нем можете и не заметить выбросы в момент заряда емкости УВХ, если не будете специально искать. Откуда берется сигнал на вход канала 1? Если совсем в лоб: какое выходное сопротивление у источника сигнала канала 1? Какая емкость висит на входе AREF? Цитата(OlegALL @ Feb 18 2014, 09:19)  По коду всё нормально? Вот зачем вы делаете так? Код ADCSRA |= 1<<ADEN | /*1<<ADIE |*/ 1<<ADPS0 | 1<<ADPS1 | 1<<ADPS2; Что вам мешает написать тут просто '='? Вы сэкономите команду, такт и будете точно уверены, что в остальных битах окажется ноль. А не то, что оставила там предыдущая часть программы.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Feb 18 2014, 16:13
|
Участник

Группа: Участник
Сообщений: 70
Регистрация: 30-11-10
Пользователь №: 61 275

|
Цитата(Сергей Борщ @ Feb 18 2014, 13:20)  Осциллограф не показатель. Вы на нем можете и не заметить выбросы в момент заряда емкости УВХ, если не будете специально искать. Откуда берется сигнал на вход канала 1? Если совсем в лоб: какое выходное сопротивление у источника сигнала канала 1? Какая емкость висит на входе AREF? Вот зачем вы делаете так? Код ADCSRA |= 1<<ADEN | /*1<<ADIE |*/ 1<<ADPS0 | 1<<ADPS1 | 1<<ADPS2; Что вам мешает написать тут просто '='? Вы сэкономите команду, такт и будете точно уверены, что в остальных битах окажется ноль. А не то, что оставила там предыдущая часть программы. На вопросы по схемотехнике ответов не знаю, плохо разбираюсь, завтра спрошу. Пока схема: http://yadi.sk/d/SKpjyairJ8nVfОчень жду помощи, если за завтра не сделаю, будет мне очень плохо. Сейчас политинформация: опрашиваю каналы АЦП раз в секунду, ситуация получше но тоже есть вроде влияние каналов. Завтра напишу точнее
Сообщение отредактировал IgorKossak - Feb 21 2014, 08:31
Причина редактирования: удаление схемы по просьбе пользователя
|
|
|
|
|
Feb 19 2014, 07:04
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(OlegALL @ Feb 18 2014, 18:13)  Пока схема: Ой. Ну вот смотрите сами: Допустим у вас на Ain0 будет 1 вольт. Конденсатор УВХ зарядится до этого самого 1 вольта. Потом вы переключаете на Ain1, на выходе DA4 у вас ноль вольт. И каким образом конденсатор УВХ должен разрядиться, током утечки диода D7? Повесьте с катодов D6, D7 на землю резисторы 1...10К. Не зря же в даташите пишут - максимальное выходное сопротивление источника сигнала для АЦП - не более 10К. У вас же для вытекающего тока сопротивление почти бесконечно, отсюда все проблемы. P.S. А чтобы не смотреть на подобные вещи как на чудеса, найдите в гугле и прочитайте от начала и до конца книгу Уолта Кестера "Аналого-Цифровое преобразование". Найдете там очень много интересного и полезного. Читается легко буквально за пару вечеров.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
OlegALL Не переключаются каналы АЦП, AtMega8535 Feb 17 2014, 19:45 coolbassnik Думаю тут кроме кода еще и схему нужно видеть Feb 17 2014, 20:31 OlegALL RE: Не переключаются каналы АЦП, AtMega8535 Feb 18 2014, 04:17 smalcom КодISR(ADC_vect)
{
cli();
в запрещ... Feb 18 2014, 06:16 smalcom Забавно, поисковики не знают, что это за ОУ - 432У... Feb 18 2014, 21:39 OlegALL Спасибо. Хотите сказать, между Ain0...Ain4 и земл... Feb 19 2014, 09:13 Сергей Борщ Цитата(OlegALL @ Feb 19 2014, 11:13) Спас... Feb 19 2014, 10:57 OlegALL Что-то схемотехник поделал с платой и ситуация ста... Feb 19 2014, 11:04 Сергей Борщ Цитата(OlegALL @ Feb 19 2014, 13:04) Что-... Feb 19 2014, 11:30 OlegALL Спасибо! Между какими 2-мя точками на схеме мн... Feb 20 2014, 06:04 Сергей Борщ Цитата(OlegALL @ Feb 20 2014, 08:04) Спас... Feb 20 2014, 08:30 OlegALL Очень прошу модераторов удалить эту ветку, я выста... Feb 21 2014, 05:24 IgorKossak Цитата(OlegALL @ Feb 21 2014, 07:24) Очен... Feb 21 2014, 08:32 Сергей Борщ Вы можете нажать кнопку "Жалоба" на сооб... Feb 21 2014, 08:04
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|