Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
26.10.2007, 14:22
|
|
Прописка
Регистрация: 20.02.2006
Сообщений: 284
Сказал спасибо: 9
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Сообщение от urry
|
Чуток скорректировал
|
Спасибо
Есть еще одна проблема написал цикл который по коду приходящему с терминала устанавливает с какой ножки adc0-adc7 снимать напряжение но ножка не устанавливается.
чтобы посылать команды включите в всплывающем меню терминала Echo Typed Chartes (смотрите картинку)
Далее если послать команду например клавишей 0 ее код 0x30 это значение будет уменьшено до нуля командой UDR-0x30=0х00 и отправлено в ADMUX. Но такое ощущение что команда не доходит или еще что, контроллер отвечает на запросы нулями.
Код:
|
while(1){
// Ждем когда придет команда
while(!(UCSRA&(1‹‹7)));
// устанавливаем ножку с которой будем снимать напряжение
// 0x30='0'-adc0 0x31='1'-adc1 и т.д.
// устанавливаем значение от 0x00 до 0x07
ADMUX=(UDR-0x30);
ADCSRA|=0x40; // запустили измерение
while(!ADCSRA&0x40); // ждем окончания измерения
USART_Send(ADCH);
USART_Send(ADCL);
} |
При всем при этом если убрать код который ждет команды и делать например два замера подряд друг за другом
Код:
|
while(1){
ADMUX=0x00;
ADCSRA|=0x40; // запустили измерение
while(!ADCSRA&0x40); // ждем окончания измерения
USART_Send(ADCH);
USART_Send(ADCL);
ADMUX=0x01;
ADCSRA|=0x40; // запустили измерение
while(!ADCSRA&0x40); // ждем окончания измерения
USART_Send(ADCH);
USART_Send(ADCL);
} |
то все работает правильно, может я неправильно считываю данные с USART?
Исходник приложен
‹center›
-- Прилагается рисунок: --
‹IFRAME src = "nuke/users_images/26102007/2469957.jpg" frameborder="0" name="fr6390006" scrolling="yes" width="470" height="551" align="bottom"›[img]nuke/users_images/26102007/2469957.jpg[/img]
‹font color=red›Рисунок не умещается на странице и поэтому сжат!‹/font›
Для того, чтобы просмотреть его полностью, щелкните здесь.
‹/IFRAME›
‹/center›
Прикрепленный файл: 9733149.rar
|
|
|
|
26.10.2007, 15:24
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
я уже постил - используй прерывание по приему.
|
|
|
|
26.10.2007, 23:18
|
|
Прописка
Регистрация: 20.02.2006
Сообщений: 284
Сказал спасибо: 9
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Сообщение от urry
|
я уже постил - используй прерывание по приему.
|
Да не дело не в этом с USART можно спокойно работать без прерываний, тем более я их намернно отключил.
UCSRB=0x18;
Дело было в том, что регистры ADCL и ADCH нужно считывать правильно. Почитал документацию, там:
Цитата:
|
Once ADCL is read, ADC access to data registers is blocked. This means that if ADCL has been read, and a conversion completes before ADCH is read, neither register is updated and the result from the conversion is lost. When ADCH is read, ADC access to the ADCH and ADCL Registers is re-enabled.
|
Цитата:
|
Как только выполнено чтение ADCL блокируется доступ к регистрам данных со стороны АЦП. Это означает, что если считан ADCL и преобразование завершается перед чтением регистра ADCH, то ни один из регистров не может модифицироваться и результат преобразования теряется. После чтения ADCH доступ к регистрам ADCH и ADCL со стороны АЦП снова разрешается.
|
А у меня было наоборот
USART_Send(ADCH);
USART_Send(ADCL);
поменял как надо
USART_Send(ADCL);
USART_Send(ADCH);
И все работает, про эту ошибку узнал из лога proteus.
Единственное проблемка что результат с нужного канала читает только со второго раза, в первый раз читает с пред идущего adc канала. Тут наверно есть загвоздка с ADMUX.
Исходник
Прикрепленный файл: 6045024.rar
|
|
|
|
27.10.2007, 00:22
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.01.2007
Сообщений: 1,747
Сказал спасибо: 2
Сказали Спасибо 46 раз(а) в 35 сообщении(ях)
|
Цитата:
|
я уже постил - используй прерывание по приему.
|
Если используеться только передача, зачем использзовать INT по приему?
Цитата:
|
Да не дело не в этом с USART можно спокойно работать без прерываний, тем более я их намернно отключил.
|
А вот, для приема без прерывания не
обоитись(если не использовать модемные "готовности") пока прогр. цикл дойдет до считывания буфера UART некоторое количество принятой информации может "потеряться"(передатчик без готовностей ждать не будет), да и прерваться по Уарту может придеться раз в год(зачем занимать ресурсы на циклический опрос ).
EXIS, откровенно рад Вашим успехам, хотя судя по Вашим предыдущим постам, другого и не ожидал
Теперь пощупайте ручками каждый битик в МК(не так их и много)ИМХО, много вопросов "отвалиться" сами по себе.
Удачи!
__________________
Я, думаю, нужно подумать...
|
|
|
|
27.10.2007, 13:05
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Если вопрос ко мне - зачем я использовал инт - то прогу на 675 пик я писал под обмен с ком портом на вижуал, исходник которой я приводил выше. Перед приемом информации комп выдает на контроллер синхронизирующий импульс - (код FF), который поступает на инт вход пика - В 675 пике нет арта, и передача формируется программно.
|
|
|
|
27.10.2007, 13:20
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.01.2007
Сообщений: 1,747
Сказал спасибо: 2
Сказали Спасибо 46 раз(а) в 35 сообщении(ях)
|
Сообщение от urry
|
Если вопрос ко мне - зачем я использовал инт - то прогу на 675 пик я писал под обмен (.....), и передача формируется программно.
|
Если под обмен(извините упустил из виду...), тогда вопросов нет
Удачи!
__________________
Я, думаю, нужно подумать...
|
|
|
|
27.10.2007, 13:44
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.01.2007
Сообщений: 1,747
Сказал спасибо: 2
Сказали Спасибо 46 раз(а) в 35 сообщении(ях)
|
Сообщение от EXIS
|
А от встроенного rc с какой частотой максимально можно работать? (.....)UART полюбому нужен для rs-232. Вы правы я пересмотрел весь список доступных мне МК AVR. Скорее всего перейду на ATmega16 сейчас pdf c описанием изучаю.
|
При работе с УАРТ(асинхронный режим) о RC-генере забудьте(только кварц,если хотите,что-бы работало в "железе"), о временнЫх допусках, кто-то здесь(на форуме) спрашивал....
Удачи!
__________________
Я, думаю, нужно подумать...
|
|
|
|
29.10.2007, 01:27
|
|
Прописка
Регистрация: 20.02.2006
Сообщений: 284
Сказал спасибо: 9
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Насчет потерь данных при приеме с USART это не особо важно. Насчет правильных показаний АЦП. Нужно было просто включить задержку после запуска измерения.
Код:
|
while(1){
// Ждем когда придет команда
while(!(UCSRA&(1‹‹7)));
// устанавливаем ножку с которой будем снимать напряжение
// 0x30='0'-adc0 0x31='1'-adc1 и т.д.
// если ножка та же тогда не меняем ADMUX и сразу запускаем АЦП
if(data!=UDR){
data=UDR;
ADMUX=(data-0x30);
ADCSRA|=0x40; // запустили измерение
delay_ms(1); // после смены канала нужно подождать некоторое
// время после запуска АЦП
} else {
ADCSRA|=0x40; // запустили измерение
}
while(ADCSRA&0x40==1); // ждем окончания измерения
USART_Send(ADCL);
USART_Send(ADCH);
} |
Выкладываю финальный проект (может кто тоже захочет собрать). Закупил уже почти все детали приступаю к сборке
Огромное человеческое спасибо всем людям которые мне помогли сделать этот проект.
Прикрепленный файл: 8224704.rar
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:18.
|
|