|
|
  |
а покажите АЦП на иаре, пожалуйста |
|
|
|
Jun 3 2007, 13:06
|

Частый гость
 
Группа: Новичок
Сообщений: 91
Регистрация: 24-12-05
Из: г. Благовещенск
Пользователь №: 12 614

|
поиск только запутал сильнее покажите как оно инициализируется и тупо в переменную результат загнать что-то не нашел я примера, весь поиск перекопал - там всё сильно заумно : ( мне бы для старта пару строк мега и тини, всёравно --- раньше внешний по i2c пробовал, но там совсем всё по другому
--------------------
нет ничего невозможного, есть трудные пути... других не ищем
|
|
|
|
|
Jun 3 2007, 17:03
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата а покажите АЦП на иаре, пожалуйста да пожалуйста: АЦП ----- IAR если еще какие шарады нужно придумать, обращайтесь Цитата(defunct @ Jun 3 2007, 18:06)  ............................ 1. А зачем нужны 2 прерывания (и таймер и ADC)? 2. Почему первое преобразование начинается в прерывании таймера, а не в момент инициализации таймера ? 3. Почему при инициализации таймера не производится первое "длинное" преобразование ? А если выбранный частота преобразования будет легко вписываться в обычный цикл преобразования но не будет вписываться в "длинный" ?
|
|
|
|
|
Jun 3 2007, 22:10
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(singlskv @ Jun 3 2007, 20:03)  1. А зачем нужны 2 прерывания (и таймер и ADC)? одно соответствует моменту запуска АЦП, второе считывает и обрабатывает результат. Сделано так - чтобы покрыть общий случай, когда какие-то действия необходимо сделать до запуска преобразования, какие-то после. (Например, после преобразования может потребоваться переключить канал и выполнить запуск еще одного преобразования). Цитата 2. Почему первое преобразование начинается в прерывании таймера, а не в момент инициализации таймера ? Чтобы было меньше исключений. Т.к. меньше исключений - меньше кода - меньше потенциальных ошибок. Нет разницы в том откуда будет выполнен запуск первого преобразования. Цитата 3. Почему при инициализации таймера не производится первое "длинное" преобразование ? Потому что это делать нежелательно - чтобы не было конфликтов с запуском АЦП из разных потоков. Даже если исключить возможность конфликтов, то просто незачем добавлять дупликат кода. Цитата А если выбранный частота преобразования будет легко вписываться в обычный цикл преобразования но не будет вписываться в "длинный" ? Опять единичное исключение. Это не важно, т.к. длинное преобразование выполняется только один раз. Все остальные будут короткими. Но если для вас рез-тат первого преобразования важен, тогда вы можете уменьшить предделитель АЦП - чтобы время преобразования вписывалось в цикл перезапуска.
|
|
|
|
|
Aug 13 2007, 09:27
|
Участник

Группа: Новичок
Сообщений: 32
Регистрация: 13-08-07
Из: г. Челябинск
Пользователь №: 29 741

|
искал то же самое, сделал также - не работает. У меня кварц на 8 Мгц, выбран нужный вход, частота преобразования как в примере выше (от oran-be), контроллер АТмега8. все хорошо, пока не появляется в коде строка while( !(ADCSR & (1<<ADIF)) ); она означает конец преобразования, как я понял, так вот его похоже не происходит! конроллер сразу после прошивки вешается, отображает всякую белиберду, не опрашивает клавиатуру, не регагирует ни на что Подскажите пожалуйста, что бы это могло быть???
Сообщение отредактировал Andrеys - Aug 13 2007, 09:33
|
|
|
|
|
Aug 16 2007, 08:42
|
Участник

Группа: Новичок
Сообщений: 32
Регистрация: 13-08-07
Из: г. Челябинск
Пользователь №: 29 741

|
причина была найдена! мне кажется, кусок проги из текста выше нерабочий, и вот почему:
ADCSRA = (1 << ADEN)|(6 << ADPS0); //ADPS сооветствует 125кГц преобразование //при 8Мгц тактовой ADMUX = (3 << REFS0)|([номер канала] << MUX0); // Здесь уже все включено, можно еще, правда поотключать цифровые входы-выходы в случае с //мегой хх8 ADCSRA = (1 << ADIF)|(1 <<ADSC); // Запуск преобразования while(!(ADCSRA & (1 <<ADIF);
обратите внимание на красную строку, с регистром ADCSRA делают операцию присваивания, а не поразрядное ИЛИ с присваиванием, таким образом в регистр пишется 2 единички, а остальные - нули, один из которых ADEN, преобразование в итоге запрещено. правильно так ADCSRA |= (1 << ADIF)|(1 <<ADSC);
|
|
|
|
|
Sep 5 2007, 20:29
|

Местный
  
Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530

|
Цитата(Andrеys @ Aug 16 2007, 12:42)  причина была найдена! мне кажется, кусок проги из текста выше нерабочий, и вот почему:
[i]ADCSRA = (1 << ADEN)|(6 << ADPS0); //ADPS сооветствует 125кГц преобразование обратите внимание на красную строку, с регистром ADCSRA делают операцию присваивания, а не поразрядное ИЛИ с присваиванием, таким образом в регистр пишется 2 единички, а остальные - нули, один из которых ADEN, преобразование в итоге запрещено. правильно так ADCSRA |= (1 << ADIF)|(1 <<ADSC); разрешено, смотрите внимательно #define ADC_CONTROL (1 << ADEN)|(1 << ADIE)|(1 << ADPS2)|(1 << ADPS1) ADCSRA = ADC_CONTROL | (1 << ADSC); таким образом в регистре ADCSRA добавится один битик под номером ADSC которій определён в хедерном файле выбранного МК. Смотрите значение ADC_CONTROL.
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
|
Sep 7 2007, 08:32
|
Участник

Группа: Новичок
Сообщений: 32
Регистрация: 13-08-07
Из: г. Челябинск
Пользователь №: 29 741

|
sKWO: это вы у участника defunct посмотрели, у него правильно  , а я про прогу еще выше написанную говорил, которая от oran-be, там у него присвоить одну единичку и кучу нулей, вместо наложить маску для изменения только одного бита.  палочки такой | перед равно, короче, не хватает.
Сообщение отредактировал Andrеys - Sep 7 2007, 08:35
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|