0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 87
|
|
1 | |
Поочерёдное включение нагрузки18.10.2012, 16:19. Показов 9911. Ответов 15
Метки нет (Все метки)
Ребят, нужна помощь в программировании msp430g22452 на ланчпаде. Сам в этом не силён, а готовых примеров в сети не нашёл.
В общем, есть 4 нагрузки, которые нужно включать последовательно одна за другой с разной задержкой по времени. Как это представить в программном виде?
0
|
18.10.2012, 16:19 | |
Ответы с готовыми решениями:
15
ATMEGA328P Поочередное включение светодиодов Перестало работать включение силовой нагрузки Включение нагрузки один раз за два дня Поочередное включение объектов на сцене поочередное включение num-caps |
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; } } UPD Путём научного тыка, а именно замены P1OUT^=BIT0; на P1OUT=BIT0; добился того, что горит красный, а мигает зелёный =)
0
|
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 300
|
|
19.10.2012, 23:21 | 6 |
Сообщение от dr_wop
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; }
0
|
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 300
|
|
20.10.2012, 00:01 | 8 |
Сообщение от яверт
{ ++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
0
|
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 87
|
|
20.10.2012, 00:22 | 10 |
Сообщение от яверт
{ ++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
Сообщение от dr_wop
0
|
0 / 0 / 0
Регистрация: 15.10.2012
Сообщений: 87
|
|
20.10.2012, 01:50 | 12 |
Сообщение от яверт
Сообщение от dr_wop
Неважно какое значение выставлено, светодиоды всё равно загораются моментально. Может быть в main допущена какая-то ошибка?
0
|
0 / 0 / 0
Регистрация: 15.06.2012
Сообщений: 3,097
|
|
20.10.2012, 03:51 | 13 |
Сообщение от dr_wop
Код
P1OUT&=BIT0; P1OUT&=BIT6;
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 | |
20.10.2012, 13:04 | |
Помогаю со студенческими работами здесь
16
Ток нагрузки и сопротивление нагрузки Включение пункта меню после включение чекбокса Пример нагрузки? Привести пример нагрузки асинхронного двигателя Включение компонента по кнопке(включение света) Поочерёдное соединение Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |