роботы робототехника микроконтроллеры


 Страниц (1): [1]   

> Описание: Нужна помощ
sar-bc Post Id



Рядовой


Сообщений всего: 8
Дата рег-ции: Февр. 2013  



Здравствуйте! Подскажите как можно написать на С++ небольшую программку для универсального контроллера на Atmega 16. Светодиоды зажигать и включать моторчики научился. Не получается реализовать кнопки с функциями. Допустим контроллер находится в дежурном режиме и мигает зеленый светодиод. Нажимаем на кнопку 1 . зеленый светодиод тухнет и запускается другая подпрограмма (не знаю правильно назвал). Нажимаем на кнопку 2 запуск другой программы и т.д.. При нажатии кнопки 4 контроллер встает в дежурный режим. Файл со схемой прилогается.
Скачать файл: test.zip
Скачан раз: 278
 
 Top
sar-bc Post Id



Рядовой


Сообщений всего: 8
Дата рег-ции: Февр. 2013  



Написал программку. При нажатии кнопки BUTTON1 запускаются моторы но если надо закончить цикл и нажать на кнопку BUTTON2 чтобы моторы отключились и запустились мигать светодиоды нужно держать BUTTON2 до тех пор пока не выполнится первая программа под BUTTON1. может что то с задержками напортачил. Подскажите как можно написать по другому…

#define F_CPU 1000000UL // указываем частоту в герцах
#include <avr/io.h>//Библиотека ввода/вывода
#include <avr/interrupt.h>//Библиотека прерываний
#include <util/delay.h>
#include <lib_robot.h>//библиотека робот
#define PA_IN DDRA=0x00;
#define PA_OUT DDRA=0xff;
#define PB_IN DDRB=0x00;
#define PB_OUT DDRB=0xff;
#define PC_IN DDRD=0x00;
#define PC_OUT DDR=0xff;
#define PD_IN DDRD=0x00;
#define PD_OUT DDR=0xff;

int button1(void)
{ // нажата кнопка 1 двигатели


m1_vpered_on;
m2_vpered_on;
_delay_ms(5000);
m1_vpered_off;
m2_vpered_off;
_delay_ms(150);//
m1_nazad_on;
m2_nazad_on;
_delay_ms(5000);//
m1_nazad_off;
m2_nazad_off;
_delay_ms(150);//


}


int button2(void)
{//нажата кнопка 2 мигание светодиодами



led_r_on;
_delay_ms(200);
led_r_off;
led_y_on;
_delay_ms(200);
led_y_off;
led_g_on;
_delay_ms(200);
led_g_off;


}
int button4(void)
{//нажата кнопка 3 режим ожидания мигает зеленый светодиод
led_g_on;
_delay_ms(200);
led_g_off;
_delay_ms(200);

}





int main(void)
{//главная программа или нажата кнопка 4
int per;
PA_OUT;
PB_OUT;
PC_IN;
PORTC=0xff;
PD_IN;
PORTD=0xff;
while(1){


if (!(PIND & (1<<PIND2))) { per=2;}//button1
if (!(PIND & (1<<PIND3))) { per=3;}//button2
if (!(PIND & (1<<PIND4))) { per=4;}//button3
if (!(PIND & (1<<PIND5))) { per=5;}//button4

if((per !=2) && (per !=3) && (per !=4)) {
led_g_on;
_delay_ms(200);
led_g_off;
_delay_ms(200);
}
if(per==2) {

button1();

}
if(per==3) {

button2();

}
if(per==4) {
button4();

}
if(per==5) {

button4();

}



}//while

}//конец главной программы
Скачать файл: test.zip
Скачан раз: 271
 
 Top
mihail Post Id



Гуру


Сообщений всего: 1065
Дата рег-ции: Март 2010  



Можно использовать прерывания. Можно сделать программный таймер. Первое проще. Второе более гибко.
 
 Top
sar-bc Post Id



Рядовой


Сообщений всего: 8
Дата рег-ции: Февр. 2013  



Это функция interrupt. А как ее применить к моему коду?
 
 Top
Predator Супермодератор Post Id


Супермодератор


Сообщений всего: 1307
Дата рег-ции: Июль 2012  



можно дешевле(для понимания): опрашивать состояния кнопок еще и внутри подпрограмм
 
 Top
cjA Post Id



Генерал


Сообщений всего: 3291
Дата рег-ции: Янв. 2010  



Predator, а как сделать антидребезг в Си?
CODE:

if (!(PINС & (1<<PINС1)))
{ _delay_ms(20); if (!(PINС & (1<<PINС1))) { //включаем...
}
}

Так?
 
 Top
Predator Супермодератор Post Id


Супермодератор


Сообщений всего: 1307
Дата рег-ции: Июль 2012  



у меня (под PIC) это выглядит так:
CODE:

unsigned char getbut()
{
unsigned char bb;
//нужно дождаться нажатия; через 50мс проверить, что так и есть (антидребезг)
// сформировать кнопку; дождаться когда юзер отпустит; вернуть код.
gb:

while ((PORTB&0x07)==0x07);
{};

bb=PORTB&0x07;
DelayMs(50);
if (!((PORTB&0x07)==bb))
{goto gb;};

while (!((PORTB&0x07)==0x07));
{};
return bb;
};
 
 Top
Роботов Post Id



Гуру


Сообщений всего: 1350
Дата рег-ции: Июнь 2011  



Predator пишет:
нужно дождаться нажатия; через 50мс проверить, что так и есть (антидребезг) сформировать кнопку; дождаться когда юзер отпустит; вернуть код.

+1. Только лучше не delay использовать, а прерывание, что бы программа не тупо стояла ждала, а могла в это время продолжать работать.
 
 Top
Predator Супермодератор Post Id


Супермодератор


Сообщений всего: 1307
Дата рег-ции: Июль 2012  



а у меня как-раз все остальные действия в той программке по прерыванию от таймера.
 
 Top
cjA Post Id



Генерал


Сообщений всего: 3291
Дата рег-ции: Янв. 2010  



ухты как через жопу переходы в Си вызываются. Зописал. Купил пару мег восьмых теперь буду в Си писать.
(все три прерывания заняты Грустный , только опрос по циклу)
 
 Top
Predator Супермодератор Post Id


Супермодератор


Сообщений всего: 1307
Дата рег-ции: Июль 2012  



у PICа вообще одно прерывание - на всех, только есть регистр - опознаватель, в котором можно посмотреть кто его вызвал.
 
 Top
cjA Post Id



Генерал


Сообщений всего: 3291
Дата рег-ции: Янв. 2010  



ну а представь еслиб прерываний вообщебы не было? Както-же бухгалтеры справляются со своей 1С. Прерывания- это низкий и тонкий уровень. Я вот лично в них - лох, и не стисняюсь признаться.
На первых порах лучьше циклическим опрашиванием.
 
 Top
Роботов Post Id



Гуру


Сообщений всего: 1350
Дата рег-ции: Июнь 2011  



cjA пишет:
На первых порах лучьше циклическим опрашиванием.

+1
Если программа простейшая, и выполняет только одну задачу, прерывания как правило не нужны. Для начинающих самое оно.
(Добавление)
Другое дело если программа многозадачная. Типа робот едит, МК управляет двигателями, одновременно следит за датчиками, да ещё контролирует заряд батареи, ну и т. д., тогда без прерывания сложно обойтись...
 
 Top
Страниц (1): [1]
« Программирование микроконтроллеров »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown
  Яндекс.Метрика   Рейтинг@Mail.ru