Easyelectronics.ru

Электроника для всех
Текущее время: 25 май 2017, 17:32

Часовой пояс: UTC + 5 часов



    • Изготовление печатных плат. Примерные цены: 10 штук 2-слоя 100*100mm 8.21$ или около ~470 рублей
    • Создание принципиальных схем и проектирование печатных плат
    • Симуляция работы на spice моделях
    • Просмотр GERBER файлов

Начать новую тему Ответить на тему  [ Сообщений: 17 ] 
Автор Сообщение
 Заголовок сообщения: Данные с двух каналов АЦП по очередно.[Решено]
СообщениеДобавлено: 11 янв 2017, 00:35 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2011, 12:53
Сообщения: 246
Всем привет.
Столкнулся с непоняткой, чип stm8s003f на время теста подцепил два переменных резистора на 100к и 68к на пины PD3 и PD2
код чтения ацп для канала 3 для канал 4 такой же
Show


в программе сначала читаю 3 канал сохраняю в переменную, затем читаю 4 канал и сохраняю в другую переменную и по очиредно вывожу эти переменные в порт РС.
МК виснет.
Если опрашивать только один канал не важно 3 или 4 все работает.
НО на stm8s003k3 этот код работает как задумано.
Вопрос: я что то упустил/не правильно сделал в программе или я не учел каких то особенностей 003f3 ?


Последний раз редактировалось sanek 14 янв 2017, 00:51, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Данные с двух каналов АЦП по очередно.
СообщениеДобавлено: 11 янв 2017, 13:47 
Старожил
Аватара пользователя

Зарегистрирован: 11 авг 2016, 20:52
Сообщения: 448
Откуда: GMT+6
А если на stm8s003k3 опрашивать существующие каналы, например 2 и 3, то работает?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Данные с двух каналов АЦП по очередно.
СообщениеДобавлено: 11 янв 2017, 14:18 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 1546
Откуда: КЧР, поселок Нижний Архыз
А если еще и вот так сделать после считывания:
Код:
ADC_CSR &= 0x3f; // clear EOC & AWD flags

?
Кстати, а что делает функция ADC_TDRL_DIS(0); ?
Скажем, у меня конфигурация третьего канала такова:
Код:
    // select PD2[AIN3] & enable interrupt for EOC
    ADC_CSR = 0x23;
    ADC_TDRL = 0x08; // disable Schmitt triger for AIN3
    // right alignment
    ADC_CR2 = 0x08; // don't forget: first read ADC_DRL!
    // f_{ADC} = f/18 & continuous non-buffered conversion & wake it up
    ADC_CR1 = 0x73;
    ADC_CR1 = 0x73; // turn on ADC (this needs second write operation)


И почему у вас младший регистр АЦП не считывается?

_________________
Поттеринг, умри!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Данные с двух каналов АЦП по очередно.
СообщениеДобавлено: 11 янв 2017, 23:56 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2011, 12:53
Сообщения: 246
Kelvin писал(а):
А если на stm8s003k3 опрашивать существующие каналы, например 2 и 3, то работает?


С stm8s003k3 ошибся, я проверял на 0 и 1 каналах - работает, если 2 и 3 то данные выводит только с 3 канала.
Eddy_Em писал(а):
А если еще и вот так сделать после считывания:
Код:
ADC_CSR &= 0x3f; // clear EOC & AWD flags

?

не чего не меняется

Eddy_Em писал(а):
Кстати, а что делает функция ADC_TDRL_DIS(0); ?

ADC_TDRL_DIS(номер канала)-->#define ADC_TDRL_DIS(bit) ADC_TDRL|=(1<<bit)
Eddy_Em писал(а):
И почему у вас младший регистр АЦП не считывается?

У меня выравнивание по левому краю, в регистре ADC_DRL остаются "моргающие биты"
или считывание ADC_DRL обязательно?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Данные с двух каналов АЦП по очередно.
СообщениеДобавлено: 13 янв 2017, 01:17 
Старожил
Аватара пользователя

Зарегистрирован: 30 янв 2014, 18:09
Сообщения: 555
Откуда: Киев
Обязательно!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Данные с двух каналов АЦП по очередно.
СообщениеДобавлено: 13 янв 2017, 19:12 
Свой человек

Зарегистрирован: 16 окт 2012, 19:18
Сообщения: 84
Откуда: РК г. Павлодар
Причем в строго определенном порядке, в зависимости от выравнивания.

_________________
Не ошибается тот, кто ни чего не делает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Данные с двух каналов АЦП по очередно.
СообщениеДобавлено: 14 янв 2017, 00:10 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2011, 12:53
Сообщения: 246
Проблема решена.
Причина: невнимательность(в принципе как всегда)
#define ADC_CSR_CH3 ADC_CSR|=(1<<1)|(1<<0) тут устанавливается 1 в нулевой бит
#define ADC_CSR_CH2 ADC_CSR|=(1<<1) а тут этот бит не сбрасывается и получается всегда выбран 3 канал

Спасибо ребята, ваши советы учтены, код подправлен.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Данные с двух каналов АЦП по очередно.[Решено]
СообщениеДобавлено: 14 янв 2017, 01:22 
Старожил
Аватара пользователя

Зарегистрирован: 05 фев 2010, 16:57
Сообщения: 2060
Откуда: Нальчик
Скинь пожалуйста последний вариант, сохраню себе чтобы потом долго не разбираться...
С одним каналом я давно разобрался, а вот с несколькими - вдруг там нюансы какие...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Данные с двух каналов АЦП по очередно.[Решено]
СообщениеДобавлено: 14 янв 2017, 01:31 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 1546
Откуда: КЧР, поселок Нижний Архыз
Не нужно magick numbers использовать. Лучше все в заголовочном файле определить!!

_________________
Поттеринг, умри!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Данные с двух каналов АЦП по очередно.[Решено]
СообщениеДобавлено: 14 янв 2017, 23:45 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2011, 12:53
Сообщения: 246
Вот код, ни чего специфического если внимательно)
Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Данные с двух каналов АЦП по очередно.[Решено]
СообщениеДобавлено: 15 янв 2017, 00:01 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 1546
Откуда: КЧР, поселок Нижний Архыз
АЦП можно обрабатывать в прерываниях, например, вот так.

_________________
Поттеринг, умри!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Данные с двух каналов АЦП по очередно.[Решено]
СообщениеДобавлено: 15 янв 2017, 05:02 
Старожил
Аватара пользователя

Зарегистрирован: 05 фев 2010, 16:57
Сообщения: 2060
Откуда: Нальчик
Код:
   ADC_CR1|=(1<<6);         //Делитель на 18           
   ADC_TDRH|=(1<<5);       //Отключаем тригер Шмидта для канала 5
   ADC_TDRH|=(1<<6);       //Отключаем тригер Шмидта для канала 6
   ADC_CR2&=~(1<<3);      //Выравнивание по левому краю
   ADC_CR1|=(1<<0);         //Первый запуск ADC

Почему так сделал?

у меня сделано так:

Код:
   //настройка ADC
   ADC_CR1_bit.ADON = 1;               //включить ADC                  
   ADC_CSR_bit.CH = 0x03;               //номер канала
   ADC_CR1_bit.SPSEL = 0x07;            //делитель скорости
   ADC_CR2_bit.ALIGN = 0;               //выровнять влево
   ADC_CR1_bit.ADON = 1;               //включить ADC                  

Или твой вариант (битовые операции) меньше кода занимает?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Данные с двух каналов АЦП по очередно.
СообщениеДобавлено: 15 янв 2017, 05:07 
Старожил
Аватара пользователя

Зарегистрирован: 05 фев 2010, 16:57
Сообщения: 2060
Откуда: Нальчик
Eddy_Em писал(а):
И почему у вас младший регистр АЦП не считывается?

У меня вроде тоже не читается младший регистр, и все работает.
Код:
   if (ADC_DRH < ADC_MARK_VAL)      PWR_ODR_bit = 1;   //шунтируется балласт и питание увеличивается
   else                     PWR_ODR_bit = 0;   //добавляется балласт и питание уменьшается
   ADC_CR1_bit.ADON = 1;                        //старт ADC      

А какая может быть проблема, если не читать младший разряд?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Данные с двух каналов АЦП по очередно.
СообщениеДобавлено: 15 янв 2017, 11:52 
Старожил
Аватара пользователя

Зарегистрирован: 30 янв 2014, 18:09
Сообщения: 555
Откуда: Киев
ShadS писал(а):
А какая может быть проблема, если не читать младший разряд?

Потом замахаешься искать, почему код то работает, то нет. АЦП устроен так, что при считывании первого байта второй считывается в промежуточный буфер. Если не считать второй, нарушается логика работы АЦП. В даташите картинки нарисованы.

У меня инит АЦП сделан так:
Show

Использую сканирование сразу семи каналов.
Запускаю из прерывания таймера:
Show

И получаю результаты:
Show

Кстати, при использовании буфера отпадает необходимость считывать два байта результата.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Данные с двух каналов АЦП по очередно.[Решено]
СообщениеДобавлено: 15 янв 2017, 16:56 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2011, 12:53
Сообщения: 246
ShadS писал(а):
Код:
   ADC_CR1|=(1<<6);         //Делитель на 18           
   ADC_TDRH|=(1<<5);       //Отключаем тригер Шмидта для канала 5
   ADC_TDRH|=(1<<6);       //Отключаем тригер Шмидта для канала 6
   ADC_CR2&=~(1<<3);      //Выравнивание по левому краю
   ADC_CR1|=(1<<0);         //Первый запуск ADC

Почему так сделал?

у меня сделано так:

Код:
   //настройка ADC
   ADC_CR1_bit.ADON = 1;               //включить ADC                  
   ADC_CSR_bit.CH = 0x03;               //номер канала
   ADC_CR1_bit.SPSEL = 0x07;            //делитель скорости
   ADC_CR2_bit.ALIGN = 0;               //выровнять влево
   ADC_CR1_bit.ADON = 1;               //включить ADC                  

Или твой вариант (битовые операции) меньше кода занимает?


нет, я пользуюсь SDCC, там нет библиотек, а свою пока не написал.

ShadS писал(а):
У меня вроде тоже не читается младший регистр, и все работает.
Код:
if (ADC_DRH < ADC_MARK_VAL) PWR_ODR_bit = 1; //шунтируется балласт и питание увеличивается
else PWR_ODR_bit = 0; //добавляется балласт и питание уменьшается
ADC_CR1_bit.ADON = 1; //старт ADC

А какая может быть проблема, если не читать младший разряд?


у меня тоже работает без чтения младшего регистра, насколько я понял из мануала очистка этих регистров происходит автоматически после их прочтения. как и где это используется я пока не знаю.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Данные с двух каналов АЦП по очередно.[Решено]
СообщениеДобавлено: 15 янв 2017, 17:02 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 1546
Откуда: КЧР, поселок Нижний Архыз
У меня тоже как раз под sdcc писано: https://sourceforge.net/projects/stm8samples/
Правда, сейчас больше в сторону STM32F0 смотрю. Интересней они. Хотя, конечно, можно и с STM8 что-нибудь интересное сделать. Заказал "про запас" на работе десяток STM8S003 — их можно хоть даже как "умные регистры/триггеры" использовать.

_________________
Поттеринг, умри!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Данные с двух каналов АЦП по очередно.[Решено]
СообщениеДобавлено: 16 янв 2017, 02:53 
Старожил
Аватара пользователя

Зарегистрирован: 05 фев 2010, 16:57
Сообщения: 2060
Откуда: Нальчик
Eddy_Em писал(а):
И почему у вас младший регистр АЦП не считывается?
SOVA писал(а):
Потом замахаешься искать, почему код то работает, то нет. АЦП устроен так, что при считывании первого байта второй считывается в промежуточный буфер. Если не считать второй, нарушается логика работы АЦП.
sanek писал(а):
у меня тоже работает без чтения младшего регистра, насколько я понял из мануала очистка этих регистров происходит автоматически после их прочтения. как и где это используется я пока не знаю.
Заинтересовало меня это...

Почитал DS, и вроде - правильное чтение двух регистров важно только в случае использования 10 бит значения... иначе, при чтении 8 бит - нет необходимости в чтении второго регистра...
так что в нашем случае - чтение только ADC_DRH - это нормально...


Еще у меня не выключались триггеры шмидта на задействованных ADC входах, я смотрю все их выключают, я сначала подумал что это как то влияет на результаты замеров ADC, но опять же из DS следует что это нужно только для уменьшения энергопотребления, и как я понял - никак не влияет на результаты замеров, так что тоже не критично...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 17 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB