Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: 1 апреля толи от keil толи от F042
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > Keil
RadiatoR
Имеется F042k6u6
К нему подключеан аналоговый мультиплексор HEF4051B. Он мультиплексирует аналоговые сигналы с 6 (на схеме есть 7 - не юзаю) ножек на 1 в ADC контроллера. (Схема старая, поэтому грязь и ужас, не обращайте внимания)


Частота смены 333Hz, что более чем норм.
Код следующий:
Опрос ADC 333Hz просто в таймере:
Код
if(ADC1->ISR&ADC_ISR_ADRDY)ADC_start;


Вот обработчик прерывания:
Код
void ADC1_IRQHandler(void)
   {
       static byte ADCChan=0;
       //static byte last;
       if(ADC1->ISR&ADC_ISR_EOC)
       {
           ADCVal[ADCChan++]=ADC1->DR;
           if(ADCChan>5)
           {
               ADCChan=0;
               ADC_ready=true;
           }
           GPIOB->BRR=7;
           GPIOB->BSRR=ADCChan;
       }
   }


Вот осциллограмма:


Зеленый - аналоговый сигнал
Желтый - бит 1
Голубой - бит 2
Фиолетовый - бит 3

Смотрите - я при каждом прерырвании инкрементирую канал и выставляю его, но у меня выставляются следующие значения канала:
0
1
0
1
2
3
4
5
Почему я так и не смог понять. Проблема решилась очень странно - я добавил в функцию переменную last (я хотел через нее было тестить, но обнаружил что с ней работает норм). В итоге если она закомменчена - не работает, а если присутствует, то работает. Хотя сам компилятор ее оптимизирует и хекс остается одинаковым - проверен побайтно через STlink utility.

Как это понимать? Первоапрельский розыгрыш?

ps. причем last должен обязательно быть static, иначе не работает
Obam
"налоговый мультиплексор" да 1 апр. действительно.
Требую налоговых послаблений (:
RadiatoR
действительно :D
Obam
А всякий раз по входу в ADC1_IRQHandler
static byte ADCChan=0; - не смущает?
scifi
Цитата(Obam @ Apr 1 2016, 11:35) *
А всякий раз по входу в ADC1_IRQHandler
static byte ADCChan=0; - не смущает?

А вас смущает? Если да, советую почитать учебник.
Кстати, "byte" вместо "int" на АРМе - это мощно. Наводит на мысль о тяжёлом наследии 8051 biggrin.gif
Obam
Цитата(scifi @ Apr 1 2016, 12:44) *
А вас смущает?


Ох стыд-то какой ):
RadiatoR
Цитата(scifi @ Apr 1 2016, 11:44) *
А вас смущает? Если да, советую почитать учебник.
Кстати, "byte" вместо "int" на АРМе - это мощно. Наводит на мысль о тяжёлом наследии 8051 biggrin.gif


Ну я большую часть практики писал под AVR, да и сейчас 32кб арм не такая роскошь, хотя занято получается около 12 кб. Но все равно я остаюсь экономным - по крайней мере это не мешает.
adnega
Цитата(ЯadiatoR @ Apr 1 2016, 11:13) *
Как это понимать?

Посмотрите map файл, какая переменная выше ADCChan.
Скорее всего там какой-нить массив, и вы вышли за его границы.
Использовать byte вместо int на F042 себе дороже, ибо доступ к невыровненным данным чреват ловлей исключения.
А может компилятор собирает невыровненный int где-то...
scifi
Цитата(ЯadiatoR @ Apr 1 2016, 12:01) *
Но все равно я остаюсь экономным - по крайней мере это не мешает.

Какая же это экономия? "byte" - 4 буквы, а "int" - три biggrin.gif
Бросайте эту пустую экономию. Экономить надо начинать, когда байты кончились. Это не значит, что нужно взять и выделить себе массив на 100500 байт просто для прикола. Но вот так крохоборствовать по поводу этих байтиков - себе дороже выйдет.
RadiatoR
Что-то идет непонятное

Код
ddiv_reciptbl      0x08003836   Data         128  ddiv.o(.constdata)
.constdata         0x080038b6   Section       64  fdiv.o(.constdata)
fdiv_tab           0x080038b6   Data          64  fdiv.o(.constdata)
.data              0x20000000   Section        9  adc.o(.data)
ADCChan            0x20000007   Data           1  adc.o(.data)
last               0x20000008   Data           1  adc.o(.data)
.data              0x2000000c   Section       18  ans-3.o(.data)


Как раз получается последняя идет на 9 байт

Попробовал изменить byte на uint и закомментил ласт - вообще после первого цикла перестает работать.
Вернулся на byte и last
adnega
Цитата(ЯadiatoR @ Apr 1 2016, 12:32) *
Что-то идет непонятное
Вернулся на byte и last

А что лежит от 0x2000_0000 до 0x2000_0006?
По какому адресу располагается ADCVal, каков его тип и размер.
Заменить ADCVal[ADCChan++] на
ADCVal[ADCChan] =
+
ADCChan++;
пробовали?
scifi
Цитата(ЯadiatoR @ Apr 1 2016, 12:32) *
Попробовал изменить byte на uint и закомментил ласт - вообще после первого цикла перестает работать.
Вернулся на byte и last

Какие-то танцы с бубном. Внутрисхемного отладчика нет что ли?
RadiatoR
Цитата(adnega @ Apr 1 2016, 12:52) *
Заменить ADCVal[ADCChan++] на
ADCVal[ADCChan] =
+
ADCChan++;
пробовали?

Пробовал - нее помогало.

Цитата(scifi @ Apr 1 2016, 13:07) *
Какие-то танцы с бубном. Внутрисхемного отладчика нет что ли?

Конечно есть - толку было не много...

ps. Я не мог остановиться на мысли, что производители мк и кейла дураки, а я такой самый умный. И пошел копать в глубину проекта.
И в одном из исходников я обнаружил как думаете что? Верно - переход за индекс массива. Что-то становилось не так и все ломалось к чертям. Поправил это дело и все стало работать нормально.
Все таки не дураки там сидят, хотя помню копался с NSS у SPI на чипе - вот я задолбался, а оказалось он в еррата описан и на кристалле не работал...

Оффтпик:
как вставлять сразу несколько цитат?
adnega
Цитата(ЯadiatoR @ Apr 1 2016, 13:24) *
И пошел копать в глубину проекта. И в одном из исходников я обнаружил как думаете что?

Прежде чем глубоко копать нужно посмотреть map-файл - площадь раскопок сократиться.
RadiatoR
так то да, но в mapах я не силен - да и я ничего особенного там не нашел
adnega
Цитата(ЯadiatoR @ Apr 1 2016, 14:25) *
так то да, но в mapах я не силен - да и я ничего особенного там не нашел

А там сила и не нужна. Можете скинуть map-файл?
RadiatoR
map не дал скинуть

за пределы выходил массив AngleBuf
adnega
Цитата(ЯadiatoR @ Apr 1 2016, 14:50) *
за пределы выходил массив AngleBuf

Отрицательный индекс что ли?
RadiatoR
ага, с предыдущего похожего проекта остался код, я его портировал, немного изменился формат посылки и привет)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.