Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/49: Рейтинг темы: голосов - 49, средняя оценка - 4.53
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 87
1

Поочерёдное включение нагрузки

18.10.2012, 16:19. Показов 9911. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ребят, нужна помощь в программировании msp430g22452 на ланчпаде. Сам в этом не силён, а готовых примеров в сети не нашёл.
В общем, есть 4 нагрузки, которые нужно включать последовательно одна за другой с разной задержкой по времени. Как это представить в программном виде?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.10.2012, 16:19
Ответы с готовыми решениями:

ATMEGA328P Поочередное включение светодиодов
Добрый день. На микроконтроллере ATMEGA328P в порты B и C последовательно подключены 12 светодиодов...

Перестало работать включение силовой нагрузки
Было сделано включение силовой нагрузки по типовой схеме. От контроллера использовался MOC3023,...

Включение нагрузки один раз за два дня
будет ли выполнятся //Drive On раз в 2 дня ? long onehour = 3600000; int i = 0; int timeon = 48;...

Поочередное включение объектов на сцене
Добрый вечер, возникла такая проблема, есть три объекта ( красные шары) (скриншот 1), при...

поочередное включение num-caps
Здравствуйте всем, нужна помощь, в этом языке вообще не силен, а дали лабу сделать... даже не знаю...

15
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 44
18.10.2012, 17:08 2
вот так можно, поочередно включает нагрузку на разные промежутки времени, по кругу
Код
#include  <msp430g2553.h>

volatile  int timer = 0;

void main(void) {
WDTCTL = WDT_MDLY_0_064;                     // Set Watchdog Timer interval to ~0.064ms
IE1 |= WDTIE;                             // Enable WDT interrupt
P1DIR |= BIT0;                            // Set P1.0 to output direction
P1DIR |= BIT6;                            // Set P1.6 to output direction
P1OUT |= BIT0;
_BIS_SR(LPM0_bits + GIE);                 // Enter LPM0 w/ interrupt
}
// Watchdog Timer interrupt service routine
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void)
{
++timer;
if (timer == 10000) {   // ~0,64 сек включена 1 нагрузка
P1OUT^=BIT0;
P1OUT|=BIT6;
}
if (timer == 30000) {   // ~1,92-0,64=1,28 сек включена 2 нагрузка
P1OUT^=BIT6;
P1OUT|=BIT0;
timer=0;
}

}
0
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 87
18.10.2012, 19:20 3
Немножко неточно описал то, чего хочется. Нужно, чтобы питание первой нагрузки не обрывалось при подачи питания на вторую. На примере лампочек: должна загораться первая, через какой-то промежуток времени вторая (первая продолжает гореть) и т.д. При этом в конце должны гореть все лампочки. Загораться должны с разной задержкой по времени (задержки заранее определены). Цикличность не нужна. То есть конечный результат - горят все лампочки. Вроде всё, как хотел описал :)
0
0 / 0 / 0
Регистрация: 06.10.2012
Сообщений: 21
18.10.2012, 22:53 4
просто пишите не
P1OUT^=BIT0;
P1OUT|=BIT6;
а сначала
P1OUT^=BIT0;
затем
P1OUT=BIT0+BIT6;
загорается две лампочки надо больше через промежуток времени пишите +еще такой бит на порт и так далее скоко надо
0
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 87
19.10.2012, 21:54 5
Код в итоге такой
Код
#include  <msp430g2553.h>

volatile  int timer = 0;

void main(void) {
WDTCTL = WDT_MDLY_0_064;                     // Set Watchdog Timer interval to ~0.064ms
IE1 |= WDTIE;                             // Enable WDT interrupt
P1DIR |= BIT0;                            // Set P1.0 to output direction
P1DIR |= BIT6;                            // Set P1.6 to output direction
P1OUT |= BIT0;
_BIS_SR(LPM0_bits + GIE);                 // Enter LPM0 w/ interrupt
}
// Watchdog Timer interrupt service routine
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void)
{
++timer;
if (timer == 10000) {   // ~0,64 сек включена 1 нагрузка
P1OUT^=BIT0;

}
if (timer == 30000) {   // ~1,92-0,64=1,28 сек включена 2 нагрузка
P1OUT=BIT0+BIT6;
timer=0;
}

}
Но тут почему-то постоянно горит зелёный светодиод (P1.6) и мигает красный (P1.0). А как сделать так, чтобы второй светодиод загорался, но далее не мигал. И как-то странно себя ведёт программа или я чего-то не понял: ведь по программе сначала должен загораться красный светодиод, а затем зеленый.

UPD
Путём научного тыка, а именно замены P1OUT^=BIT0; на P1OUT=BIT0; добился того, что горит красный, а мигает зелёный =)
0
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 300
19.10.2012, 23:21 6
Цитата Сообщение от dr_wop
Код в итоге такой
Код:
#include <msp430g2553.h>

volatile int timer = 0;

void main(void) {
WDTCTL = WDT_MDLY_0_064; // Set Watchdog Timer interval to ~0.064ms
IE1 |= WDTIE; // Enable WDT interrupt
P1DIR |= BIT0; // Set P1.0 to output direction
P1DIR |= BIT6; // Set P1.6 to output direction
P1OUT |= BIT0;
_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
}
// Watchdog Timer interrupt service routine
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void)
{
++timer;
if (timer == 10000) { // ~0,64 сек включена 1 нагрузка
P1OUT^=BIT0;

}
if (timer == 30000) { // ~1,92-0,64=1,28 сек включена 2 нагрузка
P1OUT=BIT0+BIT6;
timer=0;
}

}

Но тут почему-то постоянно горит зелёный светодиод (P1.6) и мигает красный (P1.0). А как сделать так, чтобы второй светодиод загорался, но далее не мигал. И как-то странно себя ведёт программа или я чего-то не понял: ведь по программе сначала должен загораться красный светодиод, а затем зеленый.

UPD
Путём научного тыка, а именно замены P1OUT^=BIT0; на P1OUT=BIT0; добился того, что горит красный, а мигает зелёный =)

Так и должно быть. У вас в программе идет постоянная обработка таймера.
Вы или просите/закажите написание всей программы, или datasheet на msp430 и книжки по программированию в зубы и изучайте :)
0
0 / 0 / 0
Регистрация: 15.06.2012
Сообщений: 3,097
19.10.2012, 23:52 7
Учитесь работать с маской и битовыми операциями

Код
__interrupt void watchdog_timer(void)
{
++timer;
if (timer == 10000)  P1OUT|=BIT0;
if (timer == 30000)  P1OUT|=BIT6;
}
и, да еще уберите P1OUT |= BIT0; из main, выход P1.0 при старте согласно ТЗ должен быть потушен.
0
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 300
20.10.2012, 00:01 8
Цитата Сообщение от яверт
Учитесь работать с маской и битовыми операциями

Код:
__interrupt void watchdog_timer(void)
{
++timer;
if (timer == 10000) P1OUT|=BIT0;
if (timer == 30000) P1OUT|=BIT6;
}

И все равно будет не правильно.
int в итоге переполнится и все пойдет по кругу, правда в данном случае не страшно конечно :)
0
0 / 0 / 0
Регистрация: 15.06.2012
Сообщений: 3,097
20.10.2012, 00:09 9
Цитата Сообщение от dykytdroyd
И все равно будет не правильно.
int в итоге переполнится и все пойдет по кругу, правда в данном случае не страшно конечно :)
Да знаю, правильно конечно выключить этот таймер, но с явной установкой битов вместо toggle будет и так работать.
0
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 87
20.10.2012, 00:22 10
Цитата Сообщение от яверт
Учитесь работать с маской и битовыми операциями

Код:
__interrupt void watchdog_timer(void)
{
++timer;
if (timer == 10000) P1OUT|=BIT0;
if (timer == 30000) P1OUT|=BIT6;
}

и, да еще уберите P1OUT |= BIT0; из main, выход P1.0 при старте согласно ТЗ должен быть потушен.

В таком случае оба светодиода просто горят. Никакой задержки во включении не происходит :(
0
0 / 0 / 0
Регистрация: 15.06.2012
Сообщений: 3,097
20.10.2012, 00:59 11
Цитата Сообщение от dr_wop
В таком случае оба светодиода просто горят
Это конечное состояние согласно ТЗ, хотите сбросить давите risit.

Цитата Сообщение от dr_wop
Никакой задержки во включении не происходит :(
Задержки довольно мелкие, наверное вы их просто не замечаете.
0
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 87
20.10.2012, 01:50 12
Цитата Сообщение от яверт
Цитата Сообщение от dr_wop
В таком случае оба светодиода просто горят
Это конечное состояние согласно ТЗ, хотите сбросить давите risit.

Цитата Сообщение от dr_wop
Никакой задержки во включении не происходит :(
Задержки довольно мелкие, наверное вы их просто не замечаете.

Неважно какое значение выставлено, светодиоды всё равно загораются моментально. Может быть в main допущена какая-то ошибка?
0
0 / 0 / 0
Регистрация: 15.06.2012
Сообщений: 3,097
20.10.2012, 03:51 13
Цитата Сообщение от dr_wop
Может быть в main допущена какая-то ошибка?
Попробуйте добавить эти две строчки перед P1DIR |= BIT0; в main
Код
P1OUT&=BIT0;
P1OUT&=BIT6;
Видимо инициализация портов при risit у msp430 с подтяжкой, надо DS посмотреть.
0
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 87
20.10.2012, 04:17 14
Теперь вроде заработало как положено. Но, когда выставляешь задержку больше 30000, светодиоды не зажигаются.
0
0 / 0 / 0
Регистрация: 15.06.2012
Сообщений: 3,097
20.10.2012, 04:46 15
Тип у счетной переменной int, для MSP430 это 16 битное целое, т.е. от -32768 до 32767, используйте long или unsykned long.
Код
volatile unsykned long timer = 0;
0
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 87
20.10.2012, 13:04 16
Всё заработало. Спасибо большое за помощь :)
0
20.10.2012, 13:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.10.2012, 13:04
Помогаю со студенческими работами здесь

Ток нагрузки и сопротивление нагрузки
Необходимо рассчитать ток нагрузки Iн и сопротивление нагрузки Rн в этой цепи

Включение пункта меню после включение чекбокса
Как правильно сделать, чтобы наличие галочки screenTimeOutTile пункта настроек включало неактивный...

Пример нагрузки? Привести пример нагрузки асинхронного двигателя
У меня шла речь о асинхронном двигателе, потом меня спросили &quot; привести два примера нагрузки?&quot; . Я...

Включение компонента по кнопке(включение света)
Возникла проблема с работой скрипта, делает совсем не то, что я запланировал Вот сам код: public...

Поочерёдное соединение
Подскажите Каким способом и методом нужно реализовывать данную схему. В первой картинке при нажатии...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru