Без описания |
Поиск в теме | Версия для печати |
Artem |
Отправлено: 17 Июня, 2013 - 16:37:27
|
Главнокомандующий
Сообщений всего: 347
Дата рег-ции: Май 2012
|
Всё, вроде код готов, этот я протестировал, но это не совсем то, что вы хотели, просто этот код я написал ещё до ваших пожеланий, работает по вышеописанному мной алгоритму, частота микроконтроллера 1 Мегагерц, с изменением скорости вращения двигателя код тоже готов, только не протестирован, как только всё отлажу сразу выложу.
Вот код:
CODE:#include <avr/io.h> // подключаем библиотеку АВР
#include <util/delay.h> // подключаем библиотеку задержек
int main (void) { // главная функция программы
DDRD = 0xFF; // конфигурируем порт D как выход, к нему мы будем подключать входы драйвера двигателя, а так же светодиоды для индикации
DDRC = 0x00; // конфигурируем порт С как вход, к нему мы подключим две кнопки
PORTC = 0xFF; // подключаем внутренние подтягивающие резисторы, для избежания дребезга контактов
int i; // определяем переменную, для включения/выключения машинки
int p; // переменная для выбора режима работы
i=0; // присваиваем начальные значения переменным
p=0;
while (1==1) { // бесконечный цикл, выполняется пока соблюдается условия в скобочках
if (!(PINC&(1<<PINC0))) { // если нажата кнопка на линии PC0 то...
if (i==0) { // проверяем чему равна переменная, если i=0 то...
i= i+1; // увеличиваем значение переменной на 1
}
else { // иначе...
i=0; // присваиваем переменной начальное значение
}
_delay_ms(100); // пауза в 0.1 секунды, для избежания дребезга контактов
}
if (!(PINC&(1<<PINC1))) { // если нажата кнопка на линии PC1 то...
if (p<3) { // проверяем значение переменной p, если оно меньше 3 то...
p++; // увеличиваем значение переменной на 1
}
else { // иначе...
p = 0; // присваиваем переменной начальное значение
}
_delay_ms(100); // снова пауза
}
if (p==0) { // если P = 0(1 режим) то...
PORTD = (1<<PD2); // зажигаем светодиод, который будет гореть при этом режиме
if (i==1) { // если i=1 (включено) то...
for (int t=0; t<30; t++) { // цикл "стирки" повторяется 30 раз
PORTD = (1<<PD0)|(0<<PD1)|(1<<PD5); // зажигаем индикатор включения и подаём нужные сигналы на вход драйвера: вращаем мотор в одну сторону
_delay_ms(1000); // пауза в 1 секунду
PORTD = (0<<PD0)|(1<<PD1)|(1<<PD5); // вращаем мотор в другую сторону
_delay_ms (1000); // снова пауза в 1 секунду
}
for (int r=0; r<20; r++) { // цикл " сушки" повторяется 20 раз
PORTD = (1<<PD0)|(0<<PD1)|(1<<PD5); // всё тоже самое
_delay_ms(5000); // но пауза 5 секунд
PORTD = (0<<PD0)|(1<<PD1)|(1<<PD5); // всё тоже самое
_delay_ms(5000); // снова пауза 5 секунд
}
i=0; // стоп!
PORTD &=~_BV(PD5); // выключаем светодиод индикации работы
}
}
else {
PORTD = (0<<PD2);
}
if (p==1) { // здесь режим стирки, всё тоже самое только без сушки
PORTD = (1<<PD3);
if (i==1) {
for (int t=0; t<30; t++) {
PORTD |=_BV(PD5);
PORTD = (1<<PD0)|(0<<PD1)|(1<<PD5);
_delay_ms(1000);
PORTD = (0<<PD0)|(1<<PD1)|(1<<PD5);
_delay_ms (1000);
}
i=0;
PORTD &=~_BV(PD5);
}
else {
PORTD = (0<<PD0)|(0<<PD1);
}
}
else {
PORTD = (0<<PD3);
}
if (p==2) { // тут тоже всё тоже самое но без стирки
PORTD = (1<<PD4);
if (i==1) {
for (int r=0; r<20; r++) {
PORTD = (1<<PD0)|(0<<PD1)|(1<<PD5);
_delay_ms(5000);
PORTD = (0<<PD0)|(1<<PD1)|(1<<PD5);
_delay_ms(5000);
}
i=0;
PORTD &=~_BV(PD5);
}
}
else {
PORTD = (0<<PD4);
}
}
}
Вот так, будут вопросы, обращайтесь
P.S. извините, что так долго не выкладывал код, я на дучу уезжал, компьютер там есть, а там интернета нет |
|
|
Artem |
Отправлено: 29 Июня, 2013 - 22:10:49
|
Главнокомандующий
Сообщений всего: 347
Дата рег-ции: Май 2012
|
cjA, я не понимаю суть ваших притензий, что вам не нравиться? Ну написал я код на СИ, ну немного длиннее чем на ассемблере, у нас проблем с памятью нет.
Ну а что скрывается за этими битами это не очень важно, ну да, несколько регистров, логических вентелей, это же не так важно, в данный момент. |
|
|
|
Поиск в теме | Версия для печати |
Страниц (5): « 1 2 3 [4] 5 » |
« Программирование микроконтроллеров » |
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
|
|
|
|
|