Технический форум по робототехнике.
boez » 30 мар 2011, 12:30
к561ЛА7 писал(а):выбираем 1й канал опорное 2.56 сдвиг вправо читаем хай
выбираем 4й канал опорное 2.56 сдвиг вправо читаем хай
Право и лево не перепутаны? Если сдвиг вправо, то в high будет всего 2 полезных бита...
к561ЛА7 » 30 мар 2011, 14:48
Сделал так:
- Код: Выделить всё • Развернуть
выбираем 1й канал опорное 2.56 сдвиг вправо -ждем завершения АЦп прелобразования - читаем лоу ,читаем хай
выбираем 2й канал опорное питаие сдвиг влево - ждем- читаем лоу, читаем хай
выбираем 3й канал опорное питаие сдвиг влево -ждем- читаем лоу, читаем хай
выбираем 4й канал опорное 2.56 сдвиг вправо -ждем-читаем лоу ,читаем хай
но ничего не изменилось
1 канал читает правильно
2 - правильно
3- правильно
а 4й врет, причем математически неописуемо врет.
Последний раз редактировалось
к561ЛА7 30 мар 2011, 15:15, всего редактировалось 1 раз.
dccharacter » 30 мар 2011, 15:11
1. Поменяй местами датчики 1 и 4-й.
2. Попробую делать по два замера на каждом канале.
3. Как ты ждешь окончания ADC-преобразования?
Добавлено спустя 56 секунд:
А, ну можно не менять датчики, а замерить напряжение на них
к561ЛА7 » 30 мар 2011, 15:13
датчики менял, они исправные
по 2 замера делал, правда на врущем канале
жду вот так:
- Код: Выделить всё • Развернуть
ADMUX=0b11100100; //канал 4
ADCSRA.6=1;
while(ADCSRA.4==0);
s_reg4_L=ADCL; //
s_reg4=ADCH;
dccharacter » 30 мар 2011, 15:37
1. Bits 3:0 – MUX3:0: Analog Channel Selection Bits
The value of these bits selects which analog inputs are connected to the ADC. See Table 22-3
for details. If these bits are changed during a conversion, the change will not go in effect until this
conversion is complete (ADIF in ADCSRA is set) - перед сменой канала вставь еще одну проверку окончанию преобразования
2. Замерь напряжение на датчике прямо в работающей схеме, может быть все-таки что-то коротит или еще что...
3. У тебя выравнивание по левой стороне стоит - так и задумано? (ADLAR = 1)
Добавлено спустя 3 минуты 33 секунды:
In Free Running mode, a new conversion will be started immediately after the conversion completes,
while ADSC remains high. For a summary of conversion times, see Table 22-1.
У тебя отключен Free Running Mode?
Добавлено спустя 13 минут 20 секунд:
И по всему похоже у тебя какой-то баг в коде чтения третьего канала. Из бредовых, которые замыленным глазом не ловятся. Типа ADMUX = 0x11100100;
к561ЛА7 » 30 мар 2011, 15:41
1. проверку не вставил, но перенес этот кусок в конец обработчика прерывания
2. напряжение замерял- одинаковое
3. АДЛАР 1, выравнивание в регистр хай, из него читаем
4 Free Running mode как отключать не знаю, но думаю что этот режим может быть только когда один канал оцифровывается
Последний раз редактировалось
к561ЛА7 30 мар 2011, 15:45, всего редактировалось 1 раз.
dccharacter » 30 мар 2011, 15:44
Еще из бредового - проверь, что в третьем канале ты точно читаешь хай.
к561ЛА7 » 30 мар 2011, 15:47
dccharacter писал(а):Еще из бредового - проверь, что в третьем канале ты точно читаешь хай.
в третьем канале читаю и ло и хай, канал меряет правильно.
dccharacter » 30 мар 2011, 15:51
что-то у тебя происходит после третьего канала, а что - непонятно. попробуй читать четвертый канал сразу после первого - поиграйся с порядком, посмотри что и после чего вылетать начинает... переведи 4-й канал на пятный. полностью переинициализируй и промерь 4-й канал несколько раз - не просто с запуском преобразования а с ожиданием окончания преобразования, конфигурацией, запуском и чтением...
к561ЛА7 » 30 мар 2011, 15:59
да вообще чудеса происходят, если его отключить (не измерять), то врать начинает 1й
, а если поменять частоту преобразования АЦП, то измерения не меняются, но начинает врать математика - (я этот канал прибавляю к другому - измеряет 37, а прибавляет 41.
dccharacter » 30 мар 2011, 16:10
Если ты это делаешь в прерывании, то у тебя кто-то меняет значение переменной вне прерывания.
רגוזין רומאן » 30 мар 2011, 16:14
- Код: Выделить всё • Развернуть
uint16_t ADC_Value[5];
uint8_t j = 0;
// 62,5kHz
void init_adc (void)
{
ADCSRA = 0x00;
ADCSRA |= _BV(ADEN) | _BV(ADIE) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0);
SFIOR = 0x00;
}
void start_computation (uint8_t channel)
{
ADMUX = ADMUX & 0xE0;
switch (channel)
{
case 0:{break;}
case 1:{ADMUX |= _BV(MUX0);break;}
case 2:{ADMUX |= _BV(MUX1);break;}
case 3:{ADMUX |= _BV(MUX1) | _BV(MUX0);break;}
case 4:{ADMUX |= _BV(MUX2);break;}
case 5:{ADMUX |= _BV(MUX2) | _BV(MUX0);break;}
case 6:{ADMUX |= _BV(MUX2) | _BV(MUX1);break;}
case 7:{ADMUX |= _BV(MUX2) | _BV(MUX1) | _BV(MUX0);break;}
default:{break;}
}
ADCSRA |= _BV(ADATE) | _BV(ADSC);
}
ISR (ADC_vect)
{
if (j<5)
{
ADC_Value[j] = ADCL; //Read 8 low bits first (important)
ADC_Value[j] |= (int)ADCH << 8; //read 2 high bits and shift into top byte
j++;
}
else
{
ADCSRA |= !_BV(ADATE)
|= !_BV(ADSC);
distance_calculation ();
}
}
к561ЛА7 » 31 мар 2011, 13:34
я учился по курсу АРВ123 и такий стиль програмирования к сожалению не понимаю
ПРишел к выводу что это глюки самой микросхемы - отсоединил все, и все равно ошибка преобразования + ошибка в вичислени. да еще и программа сбивается.