Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 26.10.2007, 14:22  
EXIS
Прописка
 
Регистрация: 20.02.2006
Сообщений: 284
Сказал спасибо: 9
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
EXIS на пути к лучшему
По умолчанию

Сообщение от 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
Реклама:
EXIS вне форума  
Непрочитано 26.10.2007, 15:24  
urry
Почётный гражданин KAZUS.RU
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию

я уже постил - используй прерывание по приему.
urry вне форума  
Непрочитано 26.10.2007, 23:18  
EXIS
Прописка
 
Регистрация: 20.02.2006
Сообщений: 284
Сказал спасибо: 9
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
EXIS на пути к лучшему
По умолчанию

Сообщение от 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
EXIS вне форума  
Непрочитано 27.10.2007, 00:22  
sanitar249
Почётный гражданин KAZUS.RU
 
Аватар для sanitar249
 
Регистрация: 19.01.2007
Сообщений: 1,747
Сказал спасибо: 2
Сказали Спасибо 46 раз(а) в 35 сообщении(ях)
sanitar249 на пути к лучшему
По умолчанию

Цитата:
я уже постил - используй прерывание по приему.
Если используеться только передача, зачем использзовать INT по приему?
Цитата:
Да не дело не в этом с USART можно спокойно работать без прерываний, тем более я их намернно отключил.
А вот, для приема без прерывания не
обоитись(если не использовать модемные "готовности") пока прогр. цикл дойдет до считывания буфера UART некоторое количество принятой информации может "потеряться"(передатчик без готовностей ждать не будет), да и прерваться по Уарту может придеться раз в год(зачем занимать ресурсы на циклический опрос ).
EXIS, откровенно рад Вашим успехам, хотя судя по Вашим предыдущим постам, другого и не ожидал
Теперь пощупайте ручками каждый битик в МК(не так их и много)ИМХО, много вопросов "отвалиться" сами по себе.
Удачи!
__________________
Я, думаю, нужно подумать...
sanitar249 вне форума  
Непрочитано 27.10.2007, 13:05  
urry
Почётный гражданин KAZUS.RU
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию

Если вопрос ко мне - зачем я использовал инт - то прогу на 675 пик я писал под обмен с ком портом на вижуал, исходник которой я приводил выше. Перед приемом информации комп выдает на контроллер синхронизирующий импульс - (код FF), который поступает на инт вход пика - В 675 пике нет арта, и передача формируется программно.
urry вне форума  
Непрочитано 27.10.2007, 13:20  
sanitar249
Почётный гражданин KAZUS.RU
 
Аватар для sanitar249
 
Регистрация: 19.01.2007
Сообщений: 1,747
Сказал спасибо: 2
Сказали Спасибо 46 раз(а) в 35 сообщении(ях)
sanitar249 на пути к лучшему
По умолчанию

Сообщение от urry
Если вопрос ко мне - зачем я использовал инт - то прогу на 675 пик я писал под обмен (.....), и передача формируется программно.
Если под обмен(извините упустил из виду...), тогда вопросов нет
Удачи!
__________________
Я, думаю, нужно подумать...
sanitar249 вне форума  
Непрочитано 27.10.2007, 13:44  
sanitar249
Почётный гражданин KAZUS.RU
 
Аватар для sanitar249
 
Регистрация: 19.01.2007
Сообщений: 1,747
Сказал спасибо: 2
Сказали Спасибо 46 раз(а) в 35 сообщении(ях)
sanitar249 на пути к лучшему
По умолчанию

Сообщение от EXIS
А от встроенного rc с какой частотой максимально можно работать? (.....)UART полюбому нужен для rs-232. Вы правы я пересмотрел весь список доступных мне МК AVR. Скорее всего перейду на ATmega16 сейчас pdf c описанием изучаю.
При работе с УАРТ(асинхронный режим) о RC-генере забудьте(только кварц,если хотите,что-бы работало в "железе"), о временнЫх допусках, кто-то здесь(на форуме) спрашивал....
Удачи!
__________________
Я, думаю, нужно подумать...
sanitar249 вне форума  
Непрочитано 29.10.2007, 01:27  
EXIS
Прописка
 
Регистрация: 20.02.2006
Сообщений: 284
Сказал спасибо: 9
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
EXIS на пути к лучшему
По умолчанию

Насчет потерь данных при приеме с 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
EXIS вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AVR Butterfly evaluation kit - передача данных по СОМ порту ramilkazus Микроконтроллеры, АЦП, память и т.д 5 27.06.2009 23:15
Подключение 2х устройств к одному Ethernet порту Beduin Делимся опытом 16 19.03.2008 09:55
Связь с датчиком по COM порту proxorov Микроконтроллеры, АЦП, память и т.д 5 06.04.2007 22:46
Как создать подключаемый файл из блока данных? zelanez Микроконтроллеры, АЦП, память и т.д 26 05.07.2006 05:15


Часовой пояс GMT +4, время: 19:18.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot