Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2019-фев-21 02:11

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




Начать новую тему Ответить на тему  [ Сообщений: 39 ]  На страницу Пред.  1, 2, 3
Автор Сообщение
СообщениеДобавлено: 2019-янв-19 22:15 
Не в сети

Зарегистрирован: 2018-янв-05 23:41
Сообщения: 41
У меня вопросы по коду:
1. uint32_t flag = 1; - стоит добавить квалификатор volatile.
2. MDR_PORTB -> FUNC |= (0 << 8*2) | (0 << 9*2) | (2 << 10*2); - вы уверены в выделенном жирным значении? Такое значение сконфигурирует вывод PB10, как nSIROUT1. Это вроде-как совсем не то, чего вы хотите.
3. Устанавливать биты регистров в нули через операцию побитового логического ИЛИ - принципиально не верно.
Например: MDR_PORTB -> FUNC |= (0 << 8*2) | (0 << 9*2); - как это изменит значения битов в регистре?
Может всё-таки единицы стоит устанавливать через операцию ИЛИ, а нули через И? А как тогда правильно установить новое значение битового поля, состоящего из нескольких бит, где могут присутствовать и 0 и 1 в разных комбинациях? Задумайтесь над этим вопросом. И исправьте инициализацию регистров порта.

А теперь по существу
Открыть Попробуйте такой код:
Код:
// Задаём МК для проекта и конфигурируем под него библиотеки
#define USE_MDR1986VE9x         //
#include <MDR32F9Qx_config.h>
#include "MDR32F9Qx_rst_clk.h"

// Зелёный светодиод
#define GREEN_LED_POS 8
#define GREEN_LED (1<<GREEN_LED_POS)

// Красный светодиод
#define RED_LED_POS 9
#define RED_LED (1<<RED_LED)

// Кнопка
#define USER_BTN_POS 10
#define USER_BTN (1<<USER_BTN_POS)

void EXT_INT2_IRQHandler(void) {
    // Кнопка отпущена (не нажата)
    NVIC_DisableIRQ(EXT_INT2_IRQn);
    // Тушим GREEN_LED
    MDR_PORTB -> RXTX &= ~GREEN_LED;
}


int main(void)
{
    // Настройка выводов GREEN_LED, USER_BTN
    // Здесь вписать исправленную версию инициализации выводов порта
   
    NVIC_EnableIRQ(EXT_INT2_IRQn);
    while(1) {       
        // Проверяем нажата ли кнопка
        if ((MDR_PORTB -> RXTX)&USER_BTN == 0) {
            // Кнопка нажата - зажигаем GREEN_LED
            MDR_PORTB -> RXTX |= GREEN_LED;
            NVIC_EnableIRQ(EXT_INT2_IRQn);
        }       
    }
    return 0;
}
Закрыть

Здесь не нажатое (отпущенное) состояние кнопки обрабатывается в прерывании. Запрос на прерывание приходит при не нажатом состоянии кнопки. В основном цикле же отрабатывается только нажатое состояние.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2019-янв-20 10:23 
Не в сети

Зарегистрирован: 2019-янв-17 21:29
Сообщения: 21
Такое значение сконфигурирует вывод на EXT_INT2, вы где-то не там смотрите.
Очень надеялся что ваша идея сработает, но нет, все тоже - мигает зелёный и МК не обнаруживается компьютером. Это всё из-за EXT_INT2_IRQHandler, даже правильный код из методичек с Timer Handler тоже не работает. Мне кажется, он не понимает что эта функция делает или тип того. Мб проблема в startup файле, мб он его не обнаруживает или типо того, хз.
Открыть
Код:
#include "main.h"
#include <stdlib.h>
#include "MDR32Fx.h"

// ??????? ?????????
#define GREEN_LED_POS 8
#define GREEN_LED (1<<GREEN_LED_POS)

// ??????? ?????????
#define RED_LED_POS 9
#define RED_LED (1<<RED_LED_POS)

// ??????
#define USER_BTN_POS 10
#define USER_BTN (1<<USER_BTN_POS)

void EXT_INT2_IRQHandler(void) {
    // ?????? ???????? (?? ??????)
    NVIC_DisableIRQ(EXT_INT2_IRQn);
    // ????? GREEN_LED
    MDR_PORTB -> RXTX &= ~GREEN_LED;
}

int main(void)
{
    // ????????? ??????? GREEN_LED, USER_BTN
    // ????? ??????? ???????????? ?????? ????????????? ??????? ?????
    MDR_RST_CLK -> PER_CLOCK |= 0x40000;
    MDR_PORTB -> OE |= 0x300;
    MDR_PORTB -> FUNC |= (2 << 10*2);
    MDR_PORTB -> ANALOG |= 0x700;
    MDR_PORTB -> PULL |= 0x400;
    MDR_PORTB -> PD |= (1 << 10) << 16;
    MDR_PORTB -> PWR |= 0x150000;
    MDR_PORTB -> GFEN |= 0x400;
    NVIC_EnableIRQ(EXT_INT2_IRQn);
    while(1) {       
        // ????????? ?????? ?? ??????
        if ((MDR_PORTB -> RXTX) & (USER_BTN == 0)) {
            // ?????? ?????? - ???????? GREEN_LED
            MDR_PORTB -> RXTX |= GREEN_LED;
            NVIC_EnableIRQ(EXT_INT2_IRQn);
        }       
    }
    return 0;
}
Закрыть

Professor Chaos писал(а):
У меня вопросы по коду:
1. uint32_t flag = 1; - стоит добавить квалификатор volatile.
2. MDR_PORTB -> FUNC |= (0 << 8*2) | (0 << 9*2) | (2 << 10*2); - вы уверены в выделенном жирным значении? Такое значение сконфигурирует вывод PB10, как nSIROUT1. Это вроде-как совсем не то, чего вы хотите.
3. Устанавливать биты регистров в нули через операцию побитового логического ИЛИ - принципиально не верно.
Например: MDR_PORTB -> FUNC |= (0 << 8*2) | (0 << 9*2); - как это изменит значения битов в регистре?
Может всё-таки единицы стоит устанавливать через операцию ИЛИ, а нули через И? А как тогда правильно установить новое значение битового поля, состоящего из нескольких бит, где могут присутствовать и 0 и 1 в разных комбинациях? Задумайтесь над этим вопросом. И исправьте инициализацию регистров порта.

А теперь по существу
Открыть Попробуйте такой код:
Код:
// Задаём МК для проекта и конфигурируем под него библиотеки
#define USE_MDR1986VE9x         //
#include <MDR32F9Qx_config.h>
#include "MDR32F9Qx_rst_clk.h"

// Зелёный светодиод
#define GREEN_LED_POS 8
#define GREEN_LED (1<<GREEN_LED_POS)

// Красный светодиод
#define RED_LED_POS 9
#define RED_LED (1<<RED_LED)

// Кнопка
#define USER_BTN_POS 10
#define USER_BTN (1<<USER_BTN_POS)

void EXT_INT2_IRQHandler(void) {
    // Кнопка отпущена (не нажата)
    NVIC_DisableIRQ(EXT_INT2_IRQn);
    // Тушим GREEN_LED
    MDR_PORTB -> RXTX &= ~GREEN_LED;
}


int main(void)
{
    // Настройка выводов GREEN_LED, USER_BTN
    // Здесь вписать исправленную версию инициализации выводов порта
   
    NVIC_EnableIRQ(EXT_INT2_IRQn);
    while(1) {       
        // Проверяем нажата ли кнопка
        if ((MDR_PORTB -> RXTX)&USER_BTN == 0) {
            // Кнопка нажата - зажигаем GREEN_LED
            MDR_PORTB -> RXTX |= GREEN_LED;
            NVIC_EnableIRQ(EXT_INT2_IRQn);
        }       
    }
    return 0;
}
Закрыть

Здесь не нажатое (отпущенное) состояние кнопки обрабатывается в прерывании. Запрос на прерывание приходит при не нажатом состоянии кнопки. В основном цикле же отрабатывается только нажатое состояние.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2019-янв-20 13:27 
Не в сети

Зарегистрирован: 2018-янв-05 23:41
Сообщения: 41
Да, перепутал, в соседний столбец посмотрел.
Проверьте что:
1. Стартап файл добавлен в проект и видится в исходных файлах проекта.
2. Имя функции - обработчика прерывания строго соответствует её имени в стартапе. Лучше скопировать её имя из стартапа.
3. Попробйте закомментировать строчку с разрешением прерывания и посмотрите, будет ли теряться связь.
4. Попробуйте оставить строчку с разрешением прерывания, но закомментируйте все строки внутри обработчика, чтобы он был пустой. Снова посмотрите, теряется ли связь с платой.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2019-янв-20 14:12 
Не в сети

Зарегистрирован: 2019-янв-17 21:29
Сообщения: 21
1. Добавлен
2. +
3. Связь НЕ теряется.
4. Связь теряется.
Добавлю ещё что код пишу в NetBeans
Professor Chaos писал(а):
Да, перепутал, в соседний столбец посмотрел.
Проверьте что:
1. Стартап файл добавлен в проект и видится в исходных файлах проекта.
2. Имя функции - обработчика прерывания строго соответствует её имени в стартапе. Лучше скопировать её имя из стартапа.
3. Попробйте закомментировать строчку с разрешением прерывания и посмотрите, будет ли теряться связь.
4. Попробуйте оставить строчку с разрешением прерывания, но закомментируйте все строки внутри обработчика, чтобы он был пустой. Снова посмотрите, теряется ли связь с платой.


Вложения:
this.png
this.png [ 101.8 КБ | Просмотров: 287 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2019-янв-21 09:25 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 249
Откуда: ПКК "Миландр"
Alex_Dushechkin писал(а):
Попробовал различные примеры, понял что у меня ломает МК каждый код, где есть функции с IRQHandler. Может в настройках какая проблема?


Что наверное ожидаемо, поскольку:
- Если PB10 к земле не притянут, то исполнение зациклено в обработчике EXT_INT2_IRQHandler. Поэтому, все остальное, что делает МК видимым в РС отваливается или отрабатывает не должным образом.
- При запрете прерывания все это "коммуникационное прочее" начинает работать.

Хорошо было бы понять, через какой интерфейс происходит подключение к РС и программирование МК. Прошивку в МК можно залить либо через JTAG, либо через UART. Если доступна отладка - то это определенно JTAG.

А если связь по Jtag, и это именно JtagA, то при записи PORTB->RXTX &= ~GREEN_LED в прерывании отладчик ожидаемо отваливается, и МК перестает видеться в РС.

_________________
Отдел технической поддержки support@milandr.ru


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2019-янв-21 10:38 
Не в сети

Зарегистрирован: 2019-янв-17 21:29
Сообщения: 21
Vasiliy писал(а):
Alex_Dushechkin писал(а):
Попробовал различные примеры, понял что у меня ломает МК каждый код, где есть функции с IRQHandler. Может в настройках какая проблема?


Что наверное ожидаемо, поскольку:
- Если PB10 к земле не притянут, то исполнение зациклено в обработчике EXT_INT2_IRQHandler. Поэтому, все остальное, что делает МК видимым в РС отваливается или отрабатывает не должным образом.
- При запрете прерывания все это "коммуникационное прочее" начинает работать.

Хорошо было бы понять, через какой интерфейс происходит подключение к РС и программирование МК. Прошивку в МК можно залить либо через JTAG, либо через UART. Если доступна отладка - то это определенно JTAG.

А если связь по Jtag, и это именно JtagA, то при записи PORTB->RXTX &= ~GREEN_LED в прерывании отладчик ожидаемо отваливается, и МК перестает видеться в РС.

PB10 притянут к земле, это же видно в коде. Насчёт интерфейса используемого был бы рад, если вы подскажете. Потому что я использую microusb, к jtag у меня не подключено ничего.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2019-янв-21 20:25 
Не в сети

Зарегистрирован: 2018-янв-05 23:41
Сообщения: 41
Alex_Dushechkin писал(а):
PB10 притянут к земле, это же видно в коде.

В каком? Который написали люди, не видевшие схему платы? Лично я писал, предполагая, что РВ10 подключается к GND при нажатии на кнопку, а при не нажатой он подтягивается к питанию через резистор. Но это всего лишь догадки, предположения.
У этого МК 2 JTAG. Один из них выведен на разъём IDC20 на плате. А второй, вполне вероятно, через микросхему - адаптер USB-JTAG подключена к USB разъёму платы.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2019-янв-21 20:58 
Не в сети

Зарегистрирован: 2019-янв-17 21:29
Сообщения: 21
Professor Chaos писал(а):
Alex_Dushechkin писал(а):
PB10 притянут к земле, это же видно в коде.

В каком? Который написали люди, не видевшие схему платы? Лично я писал, предполагая, что РВ10 подключается к GND при нажатии на кнопку, а при не нажатой он подтягивается к питанию через резистор. Но это всего лишь догадки, предположения.
У этого МК 2 JTAG. Один из них выведен на разъём IDC20 на плате. А второй, вполне вероятно, через микросхему - адаптер USB-JTAG подключена к USB разъёму платы.

В моем, который я писал.
Код:
MDR_PORTB -> PULL |= (1<<10)
- это подтягивает кнопку к нулю через резистор 50 кОм
Появились мысли что дело в адресации векторов и код просто не видит стартап или типо того.
Код:
SCB -> VTOR
- вот с ней наверное надо разобраться


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2019-янв-22 19:27 
Не в сети

Зарегистрирован: 2019-янв-17 21:29
Сообщения: 21
Так, проблема наконец-то решилась.
Два вывода:
1. На кнопке всегда висит единица, поэтому прерывания работают задом наперед
2. Библиотеки платы конфликтуют с startup файлом, поэтому для решения этого сделали так: переименовали функцию обработчика прерывания в startup и main и добавили в main extern "c":
Код:
extern "C" void my_EXT_INT2_IRQHandler()
.
Всё, тема закрыта, спасибо всем)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 39 ]  На страницу Пред.  1, 2, 3

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


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

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


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

Найти:
Перейти:  
cron
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB