0 / 0 / 0
Регистрация: 29.02.2012
Сообщений: 54
1

Бегущий светодиодный огонь

29.01.2013, 20:09. Показов 8737. Ответов 13
Метки нет (Все метки)

Здравствуйте! Раньше занимался AVR-ками но решил попробовать себя и в ARM.
Пытаюсь сделать простой пример со светодиодами но ничего не получается. Облазил весть интернет но так и не нашёл того что мне нужно.
Извините если данная тема уже появлялась.
Рассказываю: есть 8 светодиодов подключённых к разным GPIO. Хочется чтобы один светодиод пробегал по этой «дорожке» с интервалам переключения светодиода на следующий диод 1секунда. Для этого я решил использовать заодно и таймер.
Проблема №1 Как мне записать включение тактирования каждого порта. При такой записи выдаёт ошибки. И не понимаю как их исправить. (пробовал записывать конфигурацию битов «вручную»-всё работает но это не удобно)
Проблема №2 Как реализовать переключение светодиодов если они расположенных на разных GPIO?

Пользуюсь программой CooCox

Код
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"

int main(void) {

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitTypeDef gpio;
GPIO_StructInit(&gpio);
gpio.GPIO_Mode = GPIO_Mode_Out_PP;
gpio.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_7;
gpio.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC, &gpio);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef gpio;
GPIO_StructInit(&gpio);
gpio.GPIO_Mode = GPIO_Mode_Out_PP;
gpio.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_12 | GPIO_Pin_10 | GPIO_Pin_8;
gpio.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &gpio);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef gpio;
GPIO_StructInit(&gpio);
gpio.GPIO_Mode = GPIO_Mode_Out_PP;
gpio.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_5;
gpio.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB, &gpio);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);
TIM6->PSC = 24000 - 1; // Настраиваем делитель что таймер тикал 1000 раз в секунду
TIM6->ARR = 1000 ; // Чтоб прерывание случалось раз в секунду
TIM6->DIER |= TIM_DIER_UIE; //разрешаем прерывание от таймера
TIM6->CR1 |= TIM_CR1_CEN; // Начать отсчёт!
NVIC_EnableIRQ(TIM6_DAC_IRQn); //Разрешение TIM6_DAC_IRQn прерывания

while(1)
{
//Программа ничего не делает в пустом цикле
}

}
void TIM6_DAC_IRQHomdler(void)
{
TIM6->SR &= ~TIM_SR_UIF; //Сбрасываем флаг UIF
GPIOB->ODR^=(GPIO_Pin_6 | GPIO_Pin_5); //Инвертируем состояние светодиодов
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.01.2013, 20:09
Ответы с готовыми решениями:

Бегущий огонь по таймеру переполнения stm32
Добрый вечерок)) Можете подсказать как сделать а-ля бегущий огонёк по таймеру переполнения....

Лабораторная работа . Бегущий огонь
Задание на лабораторную работу Система команд микроконтроллеров Microchip PIC16F84....

Программа "Бегущий огонь" на PIC16f84a
написать программу бегущий огонь на PIC контролере по алгоритму кнопками нажата огонь бежит слева...

Бегущий огонь на ОМК-51
Составить программу «Бегущая огонь» на линиях порта 3 ОМК-51. * Выходные данные: частота «бегущей...

13
0 / 0 / 0
Регистрация: 01.02.2011
Сообщений: 302
29.01.2013, 20:47 2
А какой у Вас процессор?
У Вас повторяется обьявление структуры gpio.
GPIO_InitTypeDef gpio;
нельзя.
Назовите их по разному, например:
GPIO_InitTypeDef gpioC; и т.д.
то есть
Код
  GPIO_InitTypeDef gpioC;
GPIO_StructInit(&gpioC);
gpioC.GPIO_Mode = GPIO_Mode_Out_PP;
gpioC.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_7;
gpioC.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC, &gpioC);
0
0 / 0 / 0
Регистрация: 01.02.2011
Сообщений: 302
29.01.2013, 20:55 3
Цитата Сообщение от TIVVORRR
Проблема №2 Как реализовать переключение светодиодов если они расположенных на разных GPIO?
А как Вы реализовали бы переключение светодиодов, если бы они были расположенны на одном GPIO?
0
0 / 0 / 0
Регистрация: 29.02.2012
Сообщений: 54
29.01.2013, 21:45 4
Решил начать с малого
Записал так
Код
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"

int main(void) {

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitTypeDef gpioC;
GPIO_StructInit(&gpioC);
gpio.GPIO_Mode = GPIO_Mode_Out_PP;     //ошибка  error: gpio undeclared (first use in this function)
gpio.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_7;
gpio.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC, &gpioC);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef gpioA;
GPIO_StructInit(&gpioA);
gpio.GPIO_Mode = GPIO_Mode_Out_PP;
gpio.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_12 | GPIO_Pin_10 | GPIO_Pin_8;
gpio.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &gpioA);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef gpioB;
GPIO_StructInit(&gpioB);
gpio.GPIO_Mode = GPIO_Mode_Out_PP;
gpio.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_5;
gpio.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB, &gpioB);

GPIO_SetByts(GPIOB, GPIO_Pin_6 | GPIO_Pin_5);

while(1)
{
//Программа ничего не делает в пустом цикле
}

}
Ругается на ошибку (в комментариях)
Если изменить gpioC на gpio то ошибка не появляется и всё компилируется.
Но самое главное
GPIO_SetByts(GPIOB, GPIO_Pin_6 | GPIO_Pin_5); не работает вообще. Светодиоды не загораются! Хотя они исправны и правильно установлены.

По поводу алгоритма: Хотел сделать так:
1)Все пины на которых весят светодиоды записать в массив
2)При срабатывании прерывания по таймеру устанавливается единица на пине из массива
3)i++

Ps плата STM32VLDyscovery чип 32F100RB
0
0 / 0 / 0
Регистрация: 16.01.2013
Сообщений: 38
29.01.2013, 22:28 5
Код
gpio.GPIO_Mode = GPIO_Mode_Out_PP;     //ошибка  error: gpio undeclared (first use in this function)
gpio.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_7;
gpio.GPIO_Speed = GPIO_Speed_2MHz;
вместо gpio надо везде ставить gpioC (gpioC.GPIO_Pin итд), аналогично в других местах
0
0 / 0 / 0
Регистрация: 29.02.2012
Сообщений: 54
29.01.2013, 22:36 6
Ура!!!! Всё заработало!!!!
Только остался вопрос по алгоритму….
Оффтоп В цело мне очень понравилась плата и её возможности но программирование это просто жесть какая-то)))пока так и не удалось найти описание всех специальных слов и функций
0
0 / 0 / 0
Регистрация: 16.01.2013
Сообщений: 38
29.01.2013, 22:39 7
Цитата Сообщение от TIVVORRR
Ура!!!! Всё заработало!!!!
Только остался вопрос по алгоритму….
Оффтоп В цело мне очень понравилась плата и её возможности но программирование это просто жесть какая-то)))пока так и не удалось найти описание всех специальных слов и функций
алгоритм советую такой:
1. Зажег первый диод
2. подождал сколько надо
3. погасил первый зажег второй
4. подождал
5. погасил второй зажег третий
так все диоды, потом возвращение на шаг 1
0
0 / 0 / 0
Регистрация: 29.02.2012
Сообщений: 54
29.01.2013, 22:52 8
Я с вами полностью согласен! Но если подходить к этому так то получится много писанного кода! Если удастся как то обеднить GPIO и номер пина и всё это записать в массив то алгоритм будет намного проще.
Я так считаю но могу ошибаться.

что то типа int g[]={gpioB.GPIO_Pin6,gpioB.GPIO_Pin5}; НО это ошибка!
0
0 / 0 / 0
Регистрация: 29.02.2012
Сообщений: 54
30.01.2013, 20:33 9
Получается какая то чушь и ГовноКод. И почему-то не горит светодиод на пине РА14.
Где можно более подробно почитать по программированию STM? Про типы данных например.
Код
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_tim.h"
#include "misc.h"

int pin[]={GPIO_Pin_6,GPIO_Pin_5,GPIO_Pin_12,GPIO_Pin_10,GPIO_Pin_14,GPIO_Pin_12,GPIO_Pin_10,GPIO_Pin_8};
int gp[]={GPIOB,GPIOB,GPIOC,GPIOC,GPIOA,GPIOA,GPIOA,GPIOA};

int  i=0;

int main(void) {

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitTypeDef gpioC;
GPIO_StructInit(&gpioC);
gpioC.GPIO_Mode = GPIO_Mode_Out_PP;     //ошибка  error: gpio undeclared (first use in this function)
gpioC.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_10;
gpioC.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC, &gpioC);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef gpioA;
GPIO_StructInit(&gpioA);
gpioA.GPIO_Mode = GPIO_Mode_Out_PP;
gpioA.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_12 | GPIO_Pin_10 | GPIO_Pin_8;
gpioA.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &gpioA);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef gpioB;
GPIO_StructInit(&gpioB);
gpioB.GPIO_Mode = GPIO_Mode_Out_PP;
gpioB.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_5;
gpioB.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB, &gpioB);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
TIM_TimeBaseInitTypeDef base_timer;
TIM_TimeBaseStructInit(&base_timer);
base_timer.TIM_Pressotir = 24000 - 1;
base_timer.TIM_Period = 500;
TIM_TimeBaseInit(TIM6, &base_timer);
TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM6, ENABLE);
NVIC_EnableIRQ(TIM6_DAC_IRQn);

while(1)
{
//Программа ничего не делает в пустом цикле
}

}

void TIM6_DAC_IRQHomdler()
{
if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESIT)
{
TIM_ClearITPendingByt(TIM6, TIM_IT_Update);

GPIO_RisetByts(gp[i-1], pin[i-1]);
GPIO_SetByts(gp[i], pin[i]);

if (i!=7)
i++;
else
i=0;
}
}
И самое главное. Есть ли автовыравнивание строк в CooCox- е и можно ли сразу закомментировать выделенный текст?
0
0 / 0 / 0
Регистрация: 16.01.2013
Сообщений: 38
30.01.2013, 20:41 10
Керниган и Ритчи - "Язык программирования С"

а все кроме РА14 работает???
0
0 / 0 / 0
Регистрация: 29.02.2012
Сообщений: 54
30.01.2013, 20:51 11
->а все кроме РА14 работает???

Да. Даже странно. Переделывал на пины 15 и 13. Тоже не работает. правда когда идёт процесс прошивания МК то пин14 моргает а потом больше не загорается.
0
0 / 0 / 0
Регистрация: 29.02.2012
Сообщений: 54
30.01.2013, 21:48 12
Блин я вообще не понимаю. В чём разница между
GPIO_Write
GPIO_SetByts
GPIOC->BSRR
0
0 / 0 / 0
Регистрация: 01.02.2011
Сообщений: 302
30.01.2013, 21:59 13
Цитата Сообщение от TIVVORRR
И почему-то не горит светодиод на пине РА14.
На PA14 подключен TCK/SWCLK. Может потому и не работает, если используется для отладчика?
Отключите перемычки CN3 (1,2 и 3,4). Может заработает PA14.
0
0 / 0 / 0
Регистрация: 29.02.2012
Сообщений: 54
30.01.2013, 23:15 14
в таком варианте всё заработало
Код
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_tim.h"
#include "misc.h"

int pin[]={GPIO_Pin_6,GPIO_Pin_5,GPIO_Pin_12,GPIO_Pin_11,GPIO_Pin_10,GPIO_Pin_12,GPIO_Pin_10,GPIO_Pin_8};
int gp[]={GPIOB,GPIOB,GPIOC,GPIOC,GPIOC,GPIOA,GPIOA,GPIOA};

int i=0;
int j=0;

int main(void) {

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitTypeDef gpioC;
GPIO_StructInit(&gpioC);
gpioC.GPIO_Mode = GPIO_Mode_Out_PP;     //ошибка  error: gpio undeclared (first use in this function)
gpioC.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_11| GPIO_Pin_10;
gpioC.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC, &gpioC);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef gpioA;
GPIO_StructInit(&gpioA);
gpioA.GPIO_Mode = GPIO_Mode_Out_PP;
gpioA.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_10 | GPIO_Pin_8;
gpioA.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &gpioA);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef gpioB;
GPIO_StructInit(&gpioB);
gpioB.GPIO_Mode = GPIO_Mode_Out_PP;
gpioB.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_5;
gpioB.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB, &gpioB);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
TIM_TimeBaseInitTypeDef base_timer;
TIM_TimeBaseStructInit(&base_timer);
base_timer.TIM_Pressotir = 24000 - 1;
base_timer.TIM_Period = 500;
TIM_TimeBaseInit(TIM6, &base_timer);
TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM6, ENABLE);
NVIC_EnableIRQ(TIM6_DAC_IRQn);

while(1)
{
//Программа ничего не делает в пустом цикле
}

}

void TIM6_DAC_IRQHomdler()
{
if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESIT)
{
TIM_ClearITPendingByt(TIM6, TIM_IT_Update);

GPIO_RisetByts(gp[i], pin[i]);

if (i!=7)
i++;
else
i=0;

GPIO_SetByts(gp[i], pin[i]);
}
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.01.2013, 23:15

Бегущий огонь на ATMega8535
задача на Микроконтроллере mega8535. (фото прикрепил) Фоновая программа реализует бегущий огонь...

светодиодный огонь - пару вопросов
Извините, если не в ту тему попал (я новенький).Можно ли в http://itistrosshemi.org/944-begushhij-...

Бегущий огонь в оба направления
Для решения задачи возврата бегущего огня по тому же пути пришлось задействовать вторую переменную...

Бегущий огонь (работа с прерываниями в Atmel Studio 6.1)
Всем привет, изучаю потихоньку программирование микроконтроллеров AVR в частности Atmega32. Изучаю...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.